aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG104
-rw-r--r--SBOM.md19
-rw-r--r--Zotlabs/Access/PermissionLimits.php2
-rw-r--r--Zotlabs/Access/PermissionRoles.php79
-rw-r--r--Zotlabs/Access/Permissions.php37
-rw-r--r--Zotlabs/Daemon/Delxitems.php25
-rw-r--r--Zotlabs/Daemon/Notifier.php30
-rw-r--r--Zotlabs/Lib/AccessList.php240
-rw-r--r--Zotlabs/Lib/Activity.php135
-rw-r--r--Zotlabs/Lib/ActivityStreams.php2
-rw-r--r--Zotlabs/Lib/Apps.php8
-rw-r--r--Zotlabs/Lib/Connect.php5
-rw-r--r--Zotlabs/Lib/Enotify.php4
-rw-r--r--Zotlabs/Lib/Group.php405
-rw-r--r--Zotlabs/Lib/Libsync.php83
-rw-r--r--Zotlabs/Lib/Libzot.php43
-rw-r--r--Zotlabs/Lib/NativeWiki.php48
-rw-r--r--Zotlabs/Lib/NativeWikiPage.php579
-rw-r--r--Zotlabs/Lib/PConfig.php85
-rw-r--r--Zotlabs/Lib/Permcat.php130
-rw-r--r--Zotlabs/Lib/ThreadItem.php32
-rw-r--r--Zotlabs/Lib/ZotURL.php2
-rw-r--r--Zotlabs/Module/Acl.php8
-rw-r--r--Zotlabs/Module/Admin/Site.php4
-rw-r--r--Zotlabs/Module/Appman.php2
-rw-r--r--Zotlabs/Module/Apschema.php5
-rw-r--r--Zotlabs/Module/Channel.php7
-rw-r--r--Zotlabs/Module/Connections.php132
-rw-r--r--Zotlabs/Module/Connedit.php798
-rw-r--r--Zotlabs/Module/Contactedit.php668
-rw-r--r--Zotlabs/Module/Contactgroup.php26
-rw-r--r--Zotlabs/Module/Defperms.php21
-rw-r--r--Zotlabs/Module/Follow.php4
-rw-r--r--Zotlabs/Module/Group.php88
-rw-r--r--Zotlabs/Module/Impel.php71
-rw-r--r--Zotlabs/Module/Import.php182
-rw-r--r--Zotlabs/Module/Import_items.php207
-rw-r--r--Zotlabs/Module/Invite.php17
-rw-r--r--Zotlabs/Module/Item.php1004
-rw-r--r--Zotlabs/Module/Like.php6
-rw-r--r--Zotlabs/Module/Lockview.php218
-rw-r--r--Zotlabs/Module/Manifest.php9
-rw-r--r--Zotlabs/Module/Network.php7
-rw-r--r--Zotlabs/Module/New_channel.php12
-rw-r--r--Zotlabs/Module/Permcats.php196
-rw-r--r--Zotlabs/Module/Profile_photo.php729
-rw-r--r--Zotlabs/Module/Profiles.php111
-rw-r--r--Zotlabs/Module/Regate.php20
-rw-r--r--Zotlabs/Module/Settings/Channel.php720
-rw-r--r--Zotlabs/Module/Settings/Privacy.php127
-rw-r--r--Zotlabs/Module/Settings/Profiles.php8
-rw-r--r--Zotlabs/Module/Sse_bs.php2
-rw-r--r--Zotlabs/Module/Tokens.php247
-rw-r--r--Zotlabs/Module/Uexport.php174
-rw-r--r--Zotlabs/Module/Viewconnections.php44
-rw-r--r--Zotlabs/Module/Vote.php13
-rw-r--r--Zotlabs/Module/Wiki.php4
-rw-r--r--Zotlabs/Render/Theme.php4
-rw-r--r--Zotlabs/Update/_1249.php31
-rw-r--r--Zotlabs/Update/_1250.php31
-rw-r--r--Zotlabs/Web/HttpMeta.php109
-rw-r--r--Zotlabs/Web/Session.php75
-rw-r--r--Zotlabs/Widget/Collections.php8
-rw-r--r--Zotlabs/Widget/Conversations.php163
-rw-r--r--Zotlabs/Widget/Fullprofile.php2
-rw-r--r--Zotlabs/Widget/Mailmenu.php38
-rw-r--r--Zotlabs/Widget/Messages.php2
-rw-r--r--Zotlabs/Widget/Notes.php16
-rw-r--r--Zotlabs/Widget/Permcats.php96
-rw-r--r--Zotlabs/Widget/Privacygroups.php55
-rw-r--r--Zotlabs/Widget/Profile.php12
-rw-r--r--Zotlabs/Widget/Settings_menu.php5
-rw-r--r--Zotlabs/Widget/Tokens.php51
-rw-r--r--app/group.apd4
-rw-r--r--app/permcats.apd8
-rw-r--r--boot.php33
-rw-r--r--composer.json3
-rw-r--r--composer.lock186
-rw-r--r--doc/admin/administrator_guide.md2
-rw-r--r--doc/pl/admin/administrator_guide.md16
-rw-r--r--include/attach.php6
-rw-r--r--include/bbcode.php2
-rw-r--r--include/channel.php141
-rw-r--r--include/connections.php115
-rw-r--r--include/contact_widgets.php2
-rw-r--r--include/conversation.php30
-rw-r--r--include/group.php2
-rw-r--r--include/import.php61
-rw-r--r--include/items.php207
-rw-r--r--include/nav.php6
-rw-r--r--include/permissions.php84
-rw-r--r--include/plugin.php4
-rw-r--r--include/security.php34
-rw-r--r--include/selectors.php20
-rw-r--r--include/text.php197
-rw-r--r--install/schema_mysql.sql6
-rw-r--r--install/schema_postgres.sql4
-rw-r--r--library/tableofcontents/jquery.toc.js6
-rw-r--r--library/urlify/.gitignore3
-rw-r--r--library/urlify/INSTALL10
-rw-r--r--library/urlify/README.md70
-rw-r--r--library/urlify/URLify.php188
-rw-r--r--library/urlify/tests/URLifyTest.php31
-rw-r--r--library/urlify/tests/bootstrap.php9
-rw-r--r--library/urlify/tests/phpunit.xml8
-rw-r--r--tests/unit/Access/PermissionLimitsTest.php7
-rw-r--r--tests/unit/Access/PermissionRolesTest.php26
-rw-r--r--tests/unit/Access/PermissionsTest.php14
-rw-r--r--util/hmessages.po3959
-rw-r--r--vendor/composer/autoload_classmap.php16
-rw-r--r--vendor/composer/autoload_namespaces.php1
-rw-r--r--vendor/composer/autoload_psr4.php1
-rw-r--r--vendor/composer/autoload_static.php32
-rw-r--r--vendor/composer/installed.json193
-rw-r--r--vendor/composer/installed.php31
-rw-r--r--vendor/jbroadway/urlify/INSTALL13
-rw-r--r--vendor/jbroadway/urlify/LICENSE27
-rw-r--r--vendor/jbroadway/urlify/README.md102
-rw-r--r--vendor/jbroadway/urlify/URLify.php591
-rw-r--r--vendor/jbroadway/urlify/composer.json (renamed from library/urlify/composer.json)14
-rw-r--r--vendor/jbroadway/urlify/scripts/downcode.php25
-rw-r--r--vendor/jbroadway/urlify/scripts/filter.php25
-rw-r--r--vendor/jbroadway/urlify/scripts/transliterate.php25
-rw-r--r--vendor/voku/portable-ascii/CHANGELOG.md177
-rw-r--r--vendor/voku/portable-ascii/LICENSE.txt19
-rw-r--r--vendor/voku/portable-ascii/README.md428
-rw-r--r--vendor/voku/portable-ascii/build/composer.json5
-rw-r--r--vendor/voku/portable-ascii/build/docs/base.md127
-rw-r--r--vendor/voku/portable-ascii/build/generate_docs.php26
-rw-r--r--vendor/voku/portable-ascii/build/generate_max_key_length.php20
-rw-r--r--vendor/voku/portable-ascii/composer.json37
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/ASCII.php1440
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php2929
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php759
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php65
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x000.php16
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x001.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x002.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x003.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x004.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x005.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x006.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x007.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x009.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x00f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x010.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x011.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x012.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x013.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x014.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x015.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x016.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x017.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x018.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x01d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x01e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x01f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x020.php4
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x021.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x022.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x023.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x024.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x025.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x026.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x027.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x028.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x029.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x02a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x02c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x02e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x02f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x030.php9
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x031.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x032.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x033.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x04d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x04e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x04f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x050.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x051.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x052.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x053.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x054.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x055.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x056.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x057.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x058.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x059.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x05f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x060.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x061.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x062.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x063.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x064.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x065.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x066.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x067.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x068.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x069.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x06f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x070.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x071.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x072.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x073.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x074.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x075.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x076.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x077.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x078.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x079.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x07f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x080.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x081.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x082.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x083.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x084.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x085.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x086.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x087.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x088.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x089.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x08f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x090.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x091.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x092.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x093.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x094.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x095.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x096.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x097.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x098.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x099.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09a.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09b.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09c.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09d.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09e.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x09f.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0af.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0be.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php4
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php1
-rw-r--r--vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php2
-rw-r--r--vendor/voku/stop-words/CHANGELOG.md25
-rw-r--r--vendor/voku/stop-words/LICENSE22
-rw-r--r--vendor/voku/stop-words/README.md73
-rw-r--r--vendor/voku/stop-words/composer.json27
-rw-r--r--vendor/voku/stop-words/src/voku/helper/StopWords.php143
-rw-r--r--vendor/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php14
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/ar.php172
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/bg.php269
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/ca.php104
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/cz.php266
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/da.php180
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/de.php1033
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/el.php275
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/en.php329
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/eo.php183
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/es.php323
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/et.php45
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/fi.php245
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/fr.php717
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/hi.php235
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/hr.php189
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/hu.php209
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/id.php367
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/it.php290
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/ka.php383
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/lt.php484
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/lv.php171
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/nl.php111
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/no.php186
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/pl.php148
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/pt.php214
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/ro.php268
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/ru.php161
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/sk.php183
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/sv.php124
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/tr.php63
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/uk.php395
-rw-r--r--vendor/voku/stop-words/src/voku/helper/stopwords/vi.php655
-rw-r--r--view/css/conversation.css10
-rw-r--r--view/css/mod_connections.css18
-rw-r--r--view/css/mod_profile_photo.css4
-rw-r--r--view/css/widgets.css7
-rw-r--r--view/en/invite.casual.tpl6
-rw-r--r--view/js/main.js42
-rw-r--r--view/js/mod_connections.js2
-rw-r--r--view/nl/register_verify_eml.tpl8
-rw-r--r--view/nl/register_verify_member.tpl16
-rw-r--r--view/pdl/mod_articles.pdl1
-rw-r--r--view/pdl/mod_cal.pdl2
-rw-r--r--view/pdl/mod_cards.pdl1
-rw-r--r--view/pdl/mod_chat.pdl2
-rw-r--r--view/pdl/mod_cloud.pdl2
-rw-r--r--view/pdl/mod_connections.pdl3
-rw-r--r--view/pdl/mod_connedit.pdl3
-rw-r--r--view/pdl/mod_directory.pdl1
-rw-r--r--view/pdl/mod_group.pdl2
-rw-r--r--view/pdl/mod_import_items.pdl3
-rw-r--r--view/pdl/mod_network.pdl1
-rw-r--r--view/pdl/mod_permcats.pdl (renamed from view/pdl/mod_message.pdl)2
-rw-r--r--view/pdl/mod_photos.pdl2
-rw-r--r--view/pdl/mod_profperm.pdl2
-rw-r--r--view/pdl/mod_tokens.pdl (renamed from view/pdl/mod_mail.pdl)3
-rw-r--r--view/pdl/mod_viewconnections.pdl2
-rw-r--r--view/pdl/mod_wiki.pdl2
-rw-r--r--view/theme/redbasic/css/style.css80
-rw-r--r--view/theme/redbasic/php/config.php12
-rw-r--r--view/theme/redbasic/php/style.php10
-rw-r--r--view/theme/redbasic/php/theme.php8
-rw-r--r--view/theme/redbasic/schema/Focus-Boxy.css22
-rw-r--r--view/theme/redbasic/schema/dark.php6
-rw-r--r--view/tpl/abook_edit.tpl164
-rw-r--r--view/tpl/admin_site.tpl2
-rw-r--r--view/tpl/connection_template.tpl34
-rw-r--r--view/tpl/connections.tpl24
-rw-r--r--view/tpl/connstatus.tpl2
-rw-r--r--view/tpl/contact_edit.tpl133
-rw-r--r--view/tpl/contact_edit_header.tpl9
-rw-r--r--view/tpl/contact_edit_modal.tpl154
-rw-r--r--view/tpl/contact_edit_tools.tpl14
-rw-r--r--view/tpl/conv_frame.tpl1
-rw-r--r--view/tpl/conv_item.tpl7
-rw-r--r--view/tpl/conv_list.tpl5
-rw-r--r--view/tpl/conversation.tpl6
-rw-r--r--view/tpl/field_acheckbox.tpl41
-rw-r--r--view/tpl/field_checkbox.tpl2
-rw-r--r--view/tpl/group_edit.tpl9
-rw-r--r--view/tpl/group_selection.tpl12
-rw-r--r--view/tpl/group_side.tpl4
-rw-r--r--view/tpl/micropro_card.tpl2
-rw-r--r--view/tpl/navbar_default.tpl8
-rw-r--r--view/tpl/new_channel.tpl12
-rw-r--r--view/tpl/notes.tpl18
-rw-r--r--view/tpl/permcats.tpl98
-rw-r--r--view/tpl/permcats_widget.tpl27
-rw-r--r--view/tpl/privacy_groups.tpl21
-rw-r--r--view/tpl/profile_advanced.tpl3
-rw-r--r--view/tpl/profile_edit.tpl16
-rw-r--r--view/tpl/profile_photo.tpl286
-rw-r--r--view/tpl/profile_vcard.tpl142
-rw-r--r--view/tpl/search_item.tpl5
-rw-r--r--view/tpl/settings.tpl63
-rw-r--r--view/tpl/settings_privacy.tpl56
-rw-r--r--view/tpl/tokens.tpl58
-rw-r--r--view/tpl/uexport.tpl61
-rw-r--r--view/tpl/widget_menu.tpl10
-rw-r--r--view/tpl/widget_menu_count.tpl13
-rw-r--r--view/tpl/xchan_vcard.tpl16
-rw-r--r--view/tpl/xrd_host.tpl13
-rw-r--r--view/tpl/xrd_person.tpl38
434 files changed, 25596 insertions, 7097 deletions
diff --git a/CHANGELOG b/CHANGELOG
index e9c8719d0..931aa3872 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,106 @@
+Hubzilla 6.4.2 (2021-12-14)
+ - Fix issue in mod sse_bs where returning message id's were assumed to be base64 encoded
+ - Fix announce activity type not registered as response activity
+
+
+Hubzilla 6.4.1 (2021-12-03)
+ - Fix hubloc_site_id in fix_system_urls() on detected site rename events
+ - Fix duplicate deliveries if duplicate hublocs available
+ - Redesign profile vcard for improved responsive handling
+ - Fix profile photos not stored in profile photo folder
+ - Maximum width of content region is now calculated in rem for improved responsive handling
+ - Fix likes notices emited allthough they are disabled
+ - Fix page not reloaded after comment/like in mod photos - issue #1651
+ - Port improved Lib/HttpMeta from zap
+ - Improved responsive aside
+
+
+Hubzilla 6.4 (2021-11-09)
+ - Automatically connect the invitee with the inviting channel
+ - Use the composer version of urlify
+ - Implement zip file import of exported items from mod uexport
+ - Start sending supported protocols with the actor object
+ - Split up manual item export to separate sections
+ - Serve w3.org jsonld documents locally - issue #1637
+ - Support IDNA URL embedding
+ - Improve handling of re-installed hubs in lib HTTPSig
+ - BBcode support for notes widget/app
+ - Implement a force flag for HTTPSig::get_key()
+ - Update composer libs
+ - Use Libzot::fetch_conversation for manual content import
+ - Implement optional force argument in Libzot::process_delivery
+ - Improve german doco
+ - Move sync logic for apps to mod appman
+ - Provide sync for system apps
+ - Update certificates
+ - Return status code 410 if a channel is deleted
+ - Add optional argument to channelx_by_* functions to allow inclusion of removed channels
+ - Improve file upload performance
+ - Introduce progress tracking for channel cloning via network (not compatible with cloning from older versions)
+ - Improve channel delete performance by moving some actions to background tasks
+ - Introduce all in one channel cloning via network (not compatible with cloning from older versions)
+ - Rename zotfeed to outbox but keep an alias for compatibility
+ - Implement apps un-starring from the app bin via drag and drop
+ - Re-implement the externals daemon
+ - Add zot6 specific handling to onepoll
+ - Implement the top option in items_fetch() which will only return top level items
+ - Add notices tab to HQ widget
+ - Improve mod manage performance
+ - Add option to mark all notices of a thread read if a notice of the thread is clicked (default true)
+ - Provide a get_cached_actor_provider hook and improve the author/owner handling in Libzot::import()
+
+ Bugfixes
+ - Fix issue where remote channels could not create wiki pages due to wron permission check - issue #1640
+ - Fix dutch registration email template
+ - Fix selection of invite template
+ - Fix too restrictive email check in mod invite
+ - Fix photos and albums ActivityStreams 2 representation
+ - Fix keys always fetched from network in lib HTTPSig for some AP implementations
+ - Fix album display of root directory
+ - Fix onepoll importing to deleted channels
+ - Fix rendering of image tags in codeblocks
+ - Fix webfinger and xrd providing results for removed channels
+ - Fix alt_pager() providing too many arguments
+ - Fix drop_query_params() if no query params are provided
+ - Fix duplicate entries for dead hubs in delivery report
+ - Fix site lookup
+ - Fix mod locs displaying drop icons for local channels
+ - Fix multiple issues with propagating deletes of cloned channels
+ - Fix apps can be draged outsite of drop areas
+ - Fix removed channels counted in max id check
+ - Fix api_auth not fetching the id if it was not cached
+ - Fix public stream unseen notifications displayed allthough the app is not installed
+ - Fix possible storage conversion stuck on file save error
+ - Fix notification panel collapsed state not saved if closed manually
+ - Fix find_best_identity() dismissing AP hublocs
+ - Fix likes and commments on direct messages mixed up in notices
+ - Fix rewrite of links to resources in body fails if nicknames of clones differ - issue #1507
+ - Fix syncing outdated data due to profile sync done before the fields were updated
+ - Fix $desturl set to wrong value (null)
+
+ Addons
+ - Cart: add settings URL to the apd file
+ - Diaspora: remove deprecated included
+ - Cart: remove deprecated include
+ - Openid: remove library/urlify in favor of composer installed versions
+ - Pubcrawl: provide tags indicating the supported protocols
+ - Pubcrawl: if we do not get an uuid, create a v5 uuid from the mid
+ - Cart: fix rendering regressions from bootstrap5 upgrade
+ - Upgrade_info: fix dismiss button
+ - Pubcrawl: move fetch_provider from core to addon
+ - Diaspora: fix regression in fetch_provider
+ - Content_import: fix syntax error
+ - Queueworker: update priorities
+ - Pubcrawl: only lookup announce author if we actually deal with an announce
+ - Pubcrawl: make sure we have the best identity before we make the abook lookup
+ - Pubcrawl: outbox moved to core
+ - Diaspora: implement the get_cached_actor_provider hook
+
+
+Hubzilla 6.2.2 (2021-10-03)
+ - Fix an issue which could lead to loss of photos under certain conditions
+
+
Hubzilla 6.2.1 (2021-09-16)
- Fix regression introduced in 6.2 where Diaspora comments on Hubzilla posts were not relayed
- Fix wrong variable used for refresh under certain conditions
@@ -8,7 +111,6 @@ Hubzilla 6.2.1 (2021-09-16)
- Fix regression displaying bootstrap modals introduced in 6.2
-
Hubzilla 6.2 (2021-09-08)
- Deprecate the custom highlight [hl] bbcode in favor of [mark] which is a html5 standard
- Check post_mail permission when receiving a direct message
diff --git a/SBOM.md b/SBOM.md
index fec5f406a..0be6b227b 100644
--- a/SBOM.md
+++ b/SBOM.md
@@ -2,20 +2,21 @@
|Name|Version|License|Source|
|----|-------|-------|------|
-|blueimp/jquery-file-upload|10.31.0.0|MIT|https://github.com/vkhramtsov/jQuery-File-Upload.git|
-|brick/math|0.9.2.0|MIT|https://github.com/brick/math.git|
+|blueimp/jquery-file-upload|10.32.0.0|MIT|https://github.com/vkhramtsov/jQuery-File-Upload.git|
+|brick/math|0.9.3.0|MIT|https://github.com/brick/math.git|
|bshaffer/oauth2-server-php|1.11.1.0|MIT|https://github.com/bshaffer/oauth2-server-php.git|
|commerceguys/intl|1.1.0.0|MIT|https://github.com/commerceguys/intl.git|
|desandro/imagesloaded|4.1.4.0|MIT|https://github.com/desandro/imagesloaded.git|
|ezyang/htmlpurifier|4.13.0.0|LGPL-2.1-or-later|https://github.com/ezyang/htmlpurifier.git|
-|league/html-to-markdown|5.0.0.0|MIT|https://github.com/thephpleague/html-to-markdown.git|
+|jbroadway/urlify|1.2.2.0|BSD-3-Clause-Clear|https://github.com/jbroadway/urlify.git|
+|league/html-to-markdown|5.0.1.0|MIT|https://github.com/thephpleague/html-to-markdown.git|
|lukasreschke/id3parser|0.0.3.0|GPL|https://github.com/LukasReschke/ID3Parser.git|
|michelf/php-markdown|1.9.0.0|BSD-3-Clause|https://github.com/michelf/php-markdown.git|
|pear/text_languagedetect|1.0.1.0|BSD-2-Clause|https://github.com/pear/Text_LanguageDetect.git|
-|phpseclib/phpseclib|2.0.30.0|MIT|https://github.com/phpseclib/phpseclib.git|
+|phpseclib/phpseclib|2.0.33.0|MIT|https://github.com/phpseclib/phpseclib.git|
|psr/log|1.1.4.0|MIT|https://github.com/php-fig/log.git|
-|ramsey/collection|1.1.3.0|MIT|https://github.com/ramsey/collection.git|
-|ramsey/uuid|4.1.1.0|MIT|https://github.com/ramsey/uuid.git|
+|ramsey/collection|1.2.2.0|MIT|https://github.com/ramsey/collection.git|
+|ramsey/uuid|4.2.3.0|MIT|https://github.com/ramsey/uuid.git|
|sabre/dav|4.1.5.0|BSD-3-Clause|https://github.com/sabre-io/dav.git|
|sabre/event|5.1.2.0|BSD-3-Clause|https://github.com/sabre-io/event.git|
|sabre/http|5.1.1.0|BSD-3-Clause|https://github.com/sabre-io/http.git|
@@ -25,7 +26,11 @@
|simplepie/simplepie|1.5.6.0|BSD-3-Clause|https://github.com/simplepie/simplepie.git|
|smarty/smarty|3.1.39.0|LGPL-3.0|https://github.com/smarty-php/smarty.git|
|symfony/polyfill-ctype|1.23.0.0|MIT|https://github.com/symfony/polyfill-ctype.git|
-|twbs/bootstrap|4.6.0.0|MIT|https://github.com/twbs/bootstrap.git|
+|symfony/polyfill-php80|1.23.1.0|MIT|https://github.com/symfony/polyfill-php80.git|
+|symfony/polyfill-php81|1.23.0.0|MIT|https://github.com/symfony/polyfill-php81.git|
+|twbs/bootstrap|5.1.3.0|MIT|https://github.com/twbs/bootstrap.git|
+|voku/portable-ascii|1.5.6.0|MIT|https://github.com/voku/portable-ascii.git|
+|voku/stop-words|2.0.1.0|MIT|https://github.com/voku/stop-words.git|
|fullcalendar/fullcalendar|4.4.2.0|MIT|https://github.com/fullcalendar/fullcalendar.git|
|miromannino/Justified-Gallery|3.8.1.0|MIT|https://github.com/miromannino/Justified-Gallery.git|
|fengyuanchen/cropperjs|1.5.7.0|MIT|https://github.com/fengyuanchen/cropperjs.git|
diff --git a/Zotlabs/Access/PermissionLimits.php b/Zotlabs/Access/PermissionLimits.php
index fb5fe6133..7a574ba6a 100644
--- a/Zotlabs/Access/PermissionLimits.php
+++ b/Zotlabs/Access/PermissionLimits.php
@@ -89,4 +89,4 @@ class PermissionLimits {
return false;
}
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Access/PermissionRoles.php b/Zotlabs/Access/PermissionRoles.php
index 998b6d8d2..2078b52a8 100644
--- a/Zotlabs/Access/PermissionRoles.php
+++ b/Zotlabs/Access/PermissionRoles.php
@@ -17,7 +17,7 @@ class PermissionRoles {
* @return number
*/
static public function version() {
- return 2;
+ return 3;
}
static function role_perms($role) {
@@ -27,6 +27,54 @@ class PermissionRoles {
$ret['role'] = $role;
switch($role) {
+
+ case 'public':
+ $ret['default_collection'] = false;
+ $ret['perms_connect'] = [
+ 'view_stream', 'view_profile', 'view_contacts', 'view_storage', 'view_pages', 'view_wiki',
+ 'send_stream', 'post_comments', 'post_mail', 'post_wall', 'chat', 'post_like', 'republish'
+ ];
+ $ret['limits'] = PermissionLimits::Std_Limits();
+ $ret['limits']['post_comments'] = PERMS_AUTHED;
+ $ret['limits']['post_mail'] = PERMS_AUTHED;
+ $ret['limits']['post_like'] = PERMS_AUTHED;
+ $ret['limits']['chat'] = PERMS_AUTHED;
+ break;
+
+ // Hubzilla default role
+ case 'personal':
+ $ret['default_collection'] = true;
+ $ret['perms_connect'] = [
+ 'view_stream', 'view_profile', 'view_contacts', 'view_storage', 'view_pages', 'view_wiki',
+ 'send_stream', 'post_comments', 'post_mail', 'chat', 'post_like'
+ ];
+ $ret['limits'] = PermissionLimits::Std_Limits();
+ $ret['limits']['view_contacts'] = PERMS_SPECIFIC;
+ break;
+
+ case 'group':
+ $ret['default_collection'] = false;
+ $ret['perms_connect'] = [
+ 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
+ 'view_pages', 'view_wiki', 'post_wall', 'post_comments',
+ 'post_mail', 'post_like', 'chat'
+ ];
+ $ret['limits'] = PermissionLimits::Std_Limits();
+ $ret['channel_type'] = 'group';
+ break;
+
+ // Provide some defaults for the custom role so that we do not start
+ // with no permissions at all if we create a new channel with this role
+ case 'custom':
+ $ret['default_collection'] = true;
+ $ret['perms_connect'] = [
+ 'view_stream', 'view_profile', 'view_contacts', 'view_storage', 'view_pages', 'view_wiki',
+ 'send_stream', 'post_comments', 'post_mail', 'chat', 'post_like'
+ ];
+ $ret['limits'] = PermissionLimits::Std_Limits();
+ break;
+
+/*
case 'social':
$ret['perms_auto'] = false;
$ret['default_collection'] = false;
@@ -193,13 +241,14 @@ class PermissionRoles {
$ret['channel_type'] = 'group';
break;
+*/
- case 'custom':
default:
break;
}
$x = get_config('system','role_perms');
+
// let system settings over-ride any or all
if($x && is_array($x) && array_key_exists($role,$x))
$ret = array_merge($ret,$x[$role]);
@@ -284,6 +333,7 @@ class PermissionRoles {
*/
static public function roles() {
$roles = [
+
t('Social Networking') => [
'social_federation' => t('Social - Federation'),
'social' => t('Social - Mostly Public'),
@@ -317,4 +367,29 @@ class PermissionRoles {
return $roles;
}
+ /**
+ * @brief Array with translated role names and grouping.
+ *
+ * Return an associative array with role names that can be used
+ * to create select groups like in \e field_select_grouped.tpl.
+ *
+ * @return array
+ */
+ static public function channel_roles() {
+ $channel_roles = [
+ //'public' => [t('Public'), t('A very permissive role suited for participation in the fediverse')],
+ //'personal' => [t('Personal'), t('The $Projectname default role suited for a personal channel')],
+ //'forum' => [t('Community forum'), t('This role configures your channel to act as an community forum')],
+ //'custom' => [t('Custom'), t('This role comes with the presets of the personal role but allows you to configure it to your needs')]
+ 'public' => t('Public'),
+ 'personal' => t('Personal'),
+ 'group' => t('Community forum'),
+ 'custom' => t('Custom')
+ ];
+
+ call_hooks('list_channel_roles', $channel_roles);
+
+ return $channel_roles;
+ }
+
}
diff --git a/Zotlabs/Access/Permissions.php b/Zotlabs/Access/Permissions.php
index 45dd30d69..09f4c9678 100644
--- a/Zotlabs/Access/Permissions.php
+++ b/Zotlabs/Access/Permissions.php
@@ -41,7 +41,7 @@ class Permissions {
* @return number
*/
static public function version() {
- return 2;
+ return 3;
}
/**
@@ -67,9 +67,9 @@ class Permissions {
'post_comments' => t('Can comment on or like my posts'),
'post_mail' => t('Can send me direct messages'),
'post_like' => t('Can like/dislike profiles and profile things'),
- 'tag_deliver' => t('Can forward direct messages to all my channel connections (forum)'),
'chat' => t('Can chat with me'),
- 'republish' => t('Can source my public posts in derived channels'),
+ 'republish' => t('Can source/mirror my public posts in derived channels'),
+ //'tag_deliver' => t('Can forward to my contacts via direct messages (forum)'),
'delegate' => t('Can administer my channel')
];
@@ -217,25 +217,23 @@ class Permissions {
$my_perms = [];
$permcat = null;
- $automatic = 0;
+ $automatic = get_pconfig($channel_id, 'system', 'autoperms');
// If a default permcat exists, use that
- $pc = ((feature_enabled($channel_id, 'permcats')) ? get_pconfig($channel_id, 'system', 'default_permcat') : 'default');
- if (!in_array($pc, ['', 'default'])) {
- $pcp = new Zlib\Permcat($channel_id);
- $permcat = $pcp->fetch($pc);
- if ($permcat && $permcat['perms']) {
- foreach ($permcat['perms'] as $p) {
- $my_perms[$p['name']] = $p['value'];
- }
+ $pc = get_pconfig($channel_id, 'system', 'default_permcat', 'default');
+ $pcp = new Zlib\Permcat($channel_id);
+ $permcat = $pcp->fetch($pc);
+ if ($permcat && $permcat['perms']) {
+ foreach ($permcat['perms'] as $p) {
+ $my_perms[$p['name']] = $p['value'];
}
}
// look up the permission role to see if it specified auto-connect
// and if there was no permcat or a default permcat, set the perms
// from the role
-
+/*
$role = get_pconfig($channel_id, 'system', 'permissions_role');
if ($role) {
$xx = PermissionRoles::role_perms($role);
@@ -247,11 +245,12 @@ class Permissions {
$my_perms = Permissions::FilledPerms($default_perms);
}
}
+*/
// If we reached this point without having any permission information,
// it is likely a custom permissions role. First see if there are any
// automatic permissions.
-
+/*
if (!$my_perms) {
$m = Permissions::FilledAutoperms($channel_id);
if ($m) {
@@ -259,11 +258,12 @@ class Permissions {
$my_perms = $m;
}
}
-
+*/
// If we reached this point with no permissions, the channel is using
// custom perms but they are not automatic. They will be stored in abconfig with
// the channel's channel_hash (the 'self' connection).
+/*
if (!$my_perms) {
$r = q("select channel_hash from channel where channel_id = %d",
intval($channel_id)
@@ -280,10 +280,10 @@ class Permissions {
}
}
}
-
- return (['perms' => $my_perms, 'automatic' => $automatic]);
+*/
+ return (['perms' => $my_perms, 'automatic' => $automatic, 'role' => $pc]);
}
-
+/*
static public function serialise($p) {
$n = [];
if ($p) {
@@ -295,4 +295,5 @@ class Permissions {
}
return implode(',', $n);
}
+*/
}
diff --git a/Zotlabs/Daemon/Delxitems.php b/Zotlabs/Daemon/Delxitems.php
new file mode 100644
index 000000000..264354ca0
--- /dev/null
+++ b/Zotlabs/Daemon/Delxitems.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Zotlabs\Daemon;
+
+require_once('include/connections.php');
+
+/*
+ * Daemon to remove 'item' resources in the background from a removed connection
+ */
+
+class Delxitems {
+
+ static public function run($argc, $argv) {
+
+ cli_startup();
+
+ if($argc != 3) {
+ return;
+ }
+
+ remove_abook_items($argv[1], $argv[2]);
+
+ return;
+ }
+}
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 368a9229d..7964621c7 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -78,6 +78,10 @@ class Notifier {
static public $encoded_item = null;
static public $channel = null;
static public $private = false;
+ // $fragment can contain additional info to omit de-duplication in the queueworker.
+ // E.g. if an item is updated many times in a row from different sources (multiple vote updates) the
+ // update source mid or a timestamp or random string can be added.
+ static public $fragment = null;
static public function run($argc, $argv) {
@@ -88,7 +92,6 @@ class Notifier {
logger('notifier: invoked: ' . print_r($argv, true), LOGGER_DEBUG);
$cmd = $argv[1];
-
$item_id = $argv[2];
if (!$item_id) {
@@ -103,6 +106,7 @@ class Notifier {
self::$encoded_item = null;
self::$channel = null;
self::$private = false;
+ self::$fragment = null;
$sys = get_sys_channel();
$normal_mode = true;
@@ -222,6 +226,8 @@ class Notifier {
// Fetch the target item
+ self::$fragment = $argv[3] ?? '';
+
$r = q("SELECT * FROM item WHERE id = %d AND parent != 0",
intval($item_id)
);
@@ -234,7 +240,7 @@ class Notifier {
$target_item = $r[0];
- if (in_array($target_item['author']['xchan_network'], ['rss', 'anon'])) {
+ if (in_array($target_item['author']['xchan_network'], ['rss', 'anon', 'token'])) {
logger('notifier: target item author is not a fetchable actor', LOGGER_DEBUG);
return;
}
@@ -488,7 +494,7 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs; checking that the site is not dead.
- $hubs = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_dead from hubloc left join site on site_url = hubloc_url
+ $hubs = dbq("select hubloc.*, site.site_crypto, site.site_flags, site.site_dead from hubloc left join site on site_url = hubloc_url
where hubloc_hash in (" . protect_sprintf(implode(',', self::$recipients)) . ")
and hubloc_error = 0 and hubloc_deleted = 0"
);
@@ -550,7 +556,9 @@ class Notifier {
if (!array_key_exists($hub['hubloc_site_id'], $hub_env)) {
$hub_env[$hub['hubloc_site_id']] = [];
}
- $hub_env[$hub['hubloc_site_id']][] = $er;
+ if (!in_array($er, $hub_env[$hub['hubloc_site_id']])) {
+ $hub_env[$hub['hubloc_site_id']][] = $er;
+ }
}
}
}
@@ -628,6 +636,18 @@ class Notifier {
// default: zot protocol
+ // Prevent zot6 delivery of group comment boosts, which are not required for conversational platforms.
+ // ActivityPub conversational platforms may wish to filter these if they don't want or require them.
+ // We will assume here that if $target_item exists and has a verb that it is an actual item structure
+ // so we won't need to check the existence of the other item fields prior to evaluation.
+
+ // This shouldn't produce false positives on comment boosts that were generated on other platforms
+ // because we won't be delivering them.
+
+ if (isset($target_item) && isset($target_item['verb']) && $target_item['verb'] === 'Announce' && $target_item['author_xchan'] === $target_item['owner_xchan'] && ! intval($target_item['item_thread_top'])) {
+ continue;
+ }
+
$hash = new_uuid();
$env = (($hub_env && $hub_env[$hub['hubloc_site_id']]) ? $hub_env[$hub['hubloc_site_id']] : '');
@@ -671,7 +691,7 @@ class Notifier {
// This wastes a process if there are no delivery hooks configured, so check this before launching the new process
$x = q("select * from hook where hook = 'notifier_normal'");
if ($x) {
- Master::Summon(['Deliver_hooks', $target_item['id']]);
+ Master::Summon(['Deliver_hooks', $target_item['id'], self::$fragment]);
}
}
diff --git a/Zotlabs/Lib/AccessList.php b/Zotlabs/Lib/AccessList.php
index 3c008f8c7..03052fab5 100644
--- a/Zotlabs/Lib/AccessList.php
+++ b/Zotlabs/Lib/AccessList.php
@@ -1,38 +1,37 @@
-<?php
+<?php
namespace Zotlabs\Lib;
-use Zotlabs\Lib\Libsync;
-
-
class AccessList {
-
- static function add($uid,$name,$public = 0) {
- $ret = false;
+ static function add($uid, $name, $public = 0) {
+
+ $ret = false;
+ $hash = '';
if ($uid && $name) {
- $r = self::byname($uid,$name); // check for dups
+ $r = self::by_name($uid, $name); // check for dups
if ($r !== false) {
- // This could be a problem.
+ // This could be a problem.
// Let's assume we've just created a list which we once deleted
// all the old members are gone, but the list remains so we don't break any security
// access lists. What we're doing here is reviving the dead list, but old content which
- // was restricted to this list may now be seen by the new list members.
+ // was restricted to this list may now be seen by the new list members.
$z = q("SELECT * FROM pgrp WHERE id = %d LIMIT 1",
intval($r)
);
- if(($z) && $z[0]['deleted']) {
+ if (($z) && $z[0]['deleted']) {
q('UPDATE pgrp SET deleted = 0 WHERE id = %d', intval($z[0]['id']));
- notice( t('A deleted list with this name was revived. Existing item permissions <strong>may</strong> apply to this list and any future members. If this is not what you intended, please create another list with a different name.') . EOL);
+ notice(t('A deleted privacy group with this name was revived. Existing item permissions <strong>may</strong> apply to this privacy group and any future members. If this is not what you intended, please create another privacy group with a different name.') . EOL);
}
- return true;
+ $hash = self::by_id($uid, $r);
+ return $hash;
}
$hash = new_uuid();
- $r = q("INSERT INTO pgrp ( hash, uid, visible, gname )
+ $r = q("INSERT INTO pgrp ( hash, uid, visible, gname )
VALUES( '%s', %d, %d, '%s' ) ",
dbesc($hash),
intval($uid),
@@ -42,12 +41,12 @@ class AccessList {
$ret = $r;
}
- Libsync::build_sync_packet($uid,null,true);
- return $ret;
- }
+ Libsync::build_sync_packet($uid, null, true);
+ return (($ret) ? $hash : $ret);
+ }
- static function remove($uid,$name) {
+ static function remove($uid, $name) {
$ret = false;
if ($uid && $name) {
$r = q("SELECT id, hash FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
@@ -55,36 +54,36 @@ class AccessList {
dbesc($name)
);
if ($r) {
- $group_id = $r[0]['id'];
+ $group_id = $r[0]['id'];
$group_hash = $r[0]['hash'];
}
else {
return false;
}
-
+
// remove group from default posting lists
$r = q("SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
- intval($uid)
+ intval($uid)
);
if ($r) {
$user_info = array_shift($r);
- $change = false;
+ $change = false;
if ($user_info['channel_default_group'] == $group_hash) {
$user_info['channel_default_group'] = '';
- $change = true;
+ $change = true;
}
if (strpos($user_info['channel_allow_gid'], '<' . $group_hash . '>') !== false) {
$user_info['channel_allow_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_allow_gid']);
- $change = true;
+ $change = true;
}
if (strpos($user_info['channel_deny_gid'], '<' . $group_hash . '>') !== false) {
$user_info['channel_deny_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_deny_gid']);
- $change = true;
+ $change = true;
}
if ($change) {
- q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
+ q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
WHERE channel_id = %d",
intval($user_info['channel_default_group']),
dbesc($user_info['channel_allow_gid']),
@@ -110,16 +109,16 @@ class AccessList {
}
- Libsync::build_sync_packet($uid,null,true);
+ Libsync::build_sync_packet($uid, null, true);
return $ret;
}
// returns the integer id of an access group owned by $uid and named $name
// or false.
-
- static function byname($uid,$name) {
- if (! ($uid && $name)) {
+
+ static function by_name($uid, $name) {
+ if (!($uid && $name)) {
return false;
}
$r = q("SELECT id FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
@@ -132,11 +131,11 @@ class AccessList {
return false;
}
- static function by_id($uid,$id) {
- if (! ($uid && $id)) {
+ static function by_id($uid, $id) {
+ if (!($uid && $id)) {
return false;
}
-
+
$r = q("SELECT * FROM pgrp WHERE uid = %d AND id = %d and deleted = 0",
intval($uid),
intval($id)
@@ -147,10 +146,8 @@ class AccessList {
return false;
}
-
-
- static function rec_byhash($uid,$hash) {
- if (! ( $uid && $hash)) {
+ static function by_hash($uid, $hash) {
+ if (!($uid && $hash)) {
return false;
}
$r = q("SELECT * FROM pgrp WHERE uid = %d AND hash = '%s' LIMIT 1",
@@ -163,46 +160,43 @@ class AccessList {
return false;
}
+ static function member_remove($uid, $name, $member) {
+ $gid = self::by_name($uid, $name);
- static function member_remove($uid,$name,$member) {
- $gid = self::byname($uid,$name);
- if (! $gid) {
- return false;
- }
- if (! ($uid && $gid && $member)) {
+ if (!($uid && $gid && $member)) {
return false;
}
+
$r = q("DELETE FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' ",
intval($uid),
intval($gid),
dbesc($member)
);
- Libsync::build_sync_packet($uid,null,true);
+ Libsync::build_sync_packet($uid, null, true);
return $r;
}
-
- static function member_add($uid,$name,$member,$gid = 0) {
- if (! $gid) {
- $gid = self::byname($uid,$name);
+ static function member_add($uid, $name, $member, $gid = 0) {
+ if (!$gid) {
+ $gid = self::by_name($uid, $name);
}
- if (! ($gid && $uid && $member)) {
+ if (!($gid && $uid && $member)) {
return false;
}
- $r = q("SELECT * FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1",
+ $r = q("SELECT * FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1",
intval($uid),
intval($gid),
dbesc($member)
);
if ($r) {
- return true; // You might question this, but
- // we indicate success because the group member was in fact created
- // -- It was just created at another time
+ return true; // You might question this, but
+ // we indicate success because the group member was in fact created
+ // -- It was just created at another time
}
- else {
+ else {
$r = q("INSERT INTO pgrp_member (uid, gid, xchan)
VALUES( %d, %d, '%s' ) ",
intval($uid),
@@ -210,15 +204,14 @@ class AccessList {
dbesc($member)
);
}
- Libsync::build_sync_packet($uid,null,true);
+ Libsync::build_sync_packet($uid, null, true);
return $r;
}
-
static function members($uid, $gid) {
$ret = [];
if (intval($gid)) {
- $r = q("SELECT * FROM pgrp_member
+ $r = q("SELECT * FROM pgrp_member
LEFT JOIN abook ON abook_xchan = pgrp_member.xchan left join xchan on xchan_hash = abook_xchan
WHERE gid = %d AND abook_channel = %d and pgrp_member.uid = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC ",
intval($gid),
@@ -232,7 +225,7 @@ class AccessList {
return $ret;
}
- static function members_xchan($uid,$gid) {
+ static function members_xchan($uid, $gid) {
$ret = [];
if (intval($gid)) {
$r = q("SELECT xchan FROM pgrp_member WHERE gid = %d AND uid = %d",
@@ -248,99 +241,124 @@ class AccessList {
return $ret;
}
- static function members_profile_xchan($uid,$gid) {
+ static function profile_members_xchan($uid,$gid) {
$ret = [];
- if (intval($gid)) {
+
+ if(intval($gid)) {
$r = q("SELECT abook_xchan as xchan from abook left join profile on abook_profile = profile_guid where profile.id = %d and profile.uid = %d",
intval($gid),
intval($uid)
);
- if ($r) {
- foreach($r as $rv) {
- $ret[] = $rv['xchan'];
+ if($r) {
+ foreach($r as $rr) {
+ $ret[] = $rr['xchan'];
}
}
}
return $ret;
}
+ static function select($uid, $options) {
+ $selected = $options['selected'] ?? '';
+ $form_id = $options['form_id'] ?? 'accesslist_select';
+ $label = $options['label'] ?? t('Select a privacy group');
+ $before = $options['before'] ?? [];
+ $after = $options['after'] ?? [];
-
- static function select($uid,$group = '') {
-
$grps = [];
+ $o = '';
+
+ $grps[] = [
+ 'name' => '',
+ 'id' => '0',
+ 'selected' => false
+ ];
+
+ if ($before) {
+ $grps[] = $before;
+ }
$r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($uid)
);
- $grps[] = [ 'name' => '', 'hash' => '0', 'selected' => '' ];
- if ($r) {
- foreach ($r as $rr) {
- $grps[] = [ 'name' => $rr['gname'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : '') ];
+
+ if($r) {
+ foreach($r as $rr) {
+ $grps[] = [
+ 'name' => $rr['gname'],
+ 'id' => $rr['hash'],
+ 'selected' => ($selected == $rr['hash'])
+ ];
}
+ }
+ if ($after) {
+ $grps[] = $after;
}
-
- return replace_macros(get_markup_template('group_selection.tpl'), [
- '$label' => t('Add new connections to this access list'),
- '$groups' => $grps
- ]);
- }
+ logger('select: ' . print_r($grps,true), LOGGER_DATA);
- static function widget($every="connections",$each="lists",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
+ $o = replace_macros(get_markup_template('group_selection.tpl'), array(
+ '$label' => $label,
+ '$form_id' => $form_id,
+ '$groups' => $grps
+ ));
- $o = '';
+ return $o;
+ }
+
+/* deprecated
+ static function widget($every = "connections", $each = "lists", $edit = false, $group_id = 0, $cid = '', $mode = 1) {
$groups = [];
- $r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
+ $r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($_SESSION['uid'])
);
$member_of = [];
if ($cid) {
- $member_of = self::containing(local_channel(),$cid);
- }
+ $member_of = self::containing(local_channel(), $cid);
+ }
if ($r) {
foreach ($r as $rr) {
$selected = (($group_id == $rr['id']) ? ' group-selected' : '');
-
+
if ($edit) {
- $groupedit = [ 'href' => "lists/".$rr['id'], 'title' => t('edit') ];
- }
+ $groupedit = ['href' => "lists/" . $rr['id'], 'title' => t('edit')];
+ }
else {
$groupedit = null;
}
-
+
$groups[] = [
- 'id' => $rr['id'],
- 'enc_cid' => base64url_encode($cid),
- 'cid' => $cid,
- 'text' => $rr['gname'],
- 'selected' => $selected,
- 'href' => (($mode == 0) ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']) . ((x($_GET,'new')) ? '&new=' . $_GET['new'] : '') . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : ''),
- 'edit' => $groupedit,
- 'ismember' => in_array($rr['id'],$member_of),
+ 'id' => $rr['id'],
+ 'enc_cid' => base64url_encode($cid),
+ 'cid' => $cid,
+ 'text' => $rr['gname'],
+ 'selected' => $selected,
+ 'href' => (($mode == 0) ? $each . '?f=&gid=' . $rr['id'] : $each . "/" . $rr['id']) . ((x($_GET, 'new')) ? '&new=' . $_GET['new'] : '') . ((x($_GET, 'order')) ? '&order=' . $_GET['order'] : ''),
+ 'edit' => $groupedit,
+ 'ismember' => in_array($rr['id'], $member_of),
];
}
}
-
+
return replace_macros(get_markup_template('group_side.tpl'), [
- '$title' => t('Lists'),
- '$edittext' => t('Edit list'),
- '$createtext' => t('Create new list'),
- '$ungrouped' => (($every === 'contacts') ? t('Channels not in any access list') : ''),
- '$groups' => $groups,
- '$add' => t('add'),
+ '$title' => t('Privacy Groups'),
+ '$edittext' => t('Edit group'),
+ '$createtext' => t('Create new group'),
+ '$ungrouped' => (($every === 'contacts') ? t('Channels not in any privacy group') : ''),
+ '$groups' => $groups,
+ '$add' => t('Add'),
]);
}
-
+*/
static function expand($g) {
- if (! (is_array($g) && count($g))) {
+ if (!(is_array($g) && count($g))) {
return [];
}
@@ -350,8 +368,8 @@ class AccessList {
// private profile linked virtual groups
foreach ($g as $gv) {
- if (substr($gv,0,3) === 'vp.') {
- $profile_hash = substr($gv,3);
+ if (substr($gv, 0, 3) === 'vp.') {
+ $profile_hash = substr($gv, 3);
if ($profile_hash) {
$r = q("select abook_xchan from abook where abook_profile = '%s'",
dbesc($profile_hash)
@@ -366,10 +384,10 @@ class AccessList {
else {
$x[] = $gv;
}
- }
+ }
if ($x) {
- stringify_array_elms($x,true);
+ stringify_array_elms($x, true);
$groups = implode(',', $x);
if ($groups) {
$r = q("SELECT xchan FROM pgrp_member WHERE gid IN ( select id from pgrp where hash in ( $groups ))");
@@ -383,9 +401,8 @@ class AccessList {
return $ret;
}
-
static function member_of($c) {
- $r = q("SELECT pgrp.gname, pgrp.id FROM pgrp LEFT JOIN pgrp_member ON pgrp_member.gid = pgrp.id
+ $r = q("SELECT pgrp.gname, pgrp.id FROM pgrp LEFT JOIN pgrp_member ON pgrp_member.gid = pgrp.id
WHERE pgrp_member.xchan = '%s' AND pgrp.deleted = 0 ORDER BY pgrp.gname ASC ",
dbesc($c)
);
@@ -393,7 +410,7 @@ class AccessList {
return $r;
}
- static function containing($uid,$c) {
+ static function containing($uid, $c) {
$r = q("SELECT gid FROM pgrp_member WHERE uid = %d AND pgrp_member.xchan = '%s' ",
intval($uid),
@@ -405,7 +422,8 @@ class AccessList {
foreach ($r as $rv)
$ret[] = $rv['gid'];
}
-
+
return $ret;
}
-} \ No newline at end of file
+
+}
diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php
index 96b747c30..cacf4d979 100644
--- a/Zotlabs/Lib/Activity.php
+++ b/Zotlabs/Lib/Activity.php
@@ -886,10 +886,6 @@ class Activity {
else
return [];
- if (strpos($i['body'], '[/share]') !== false) {
- $i['obj'] = null;
- }
-
if ($i['obj']) {
if (!is_array($i['obj'])) {
$i['obj'] = json_decode($i['obj'], true);
@@ -899,8 +895,10 @@ class Activity {
}
$obj = self::encode_object($i['obj']);
- if ($obj)
+
+ if ($obj) {
$ret['object'] = $obj;
+ }
else
return [];
}
@@ -1042,7 +1040,7 @@ class Activity {
$tmp = expand_acl($i['allow_cid']);
$list = stringify_array($tmp, true);
if ($list) {
- $details = q("select hubloc_id_url from hubloc where hubloc_hash in (" . $list . ") and hubloc_id_url != ''");
+ $details = q("select hubloc_id_url from hubloc where hubloc_hash in (" . $list . ") and hubloc_id_url != '' and hubloc_deleted = 0");
if ($details) {
foreach ($details as $d) {
$ret[] = $d['hubloc_id_url'];
@@ -1089,10 +1087,11 @@ class Activity {
$ret['type'] = 'Person';
if ($c) {
- $role = get_pconfig($c['channel_id'], 'system', 'permissions_role');
- if (strpos($role, 'forum') !== false) {
+ if (get_pconfig($c['channel_id'], 'system', 'group_actor')) {
$ret['type'] = 'Group';
}
+
+ $ret['manuallyApprovesFollowers'] = ((get_pconfig($c['channel_id'], 'system', 'autoperms')) ? false : true);
}
if ($c) {
@@ -1115,7 +1114,33 @@ class Activity {
'height' => 300,
'width' => 300,
];
- $ret['url'] = $p['xchan_url'];
+
+/* This could be used to distinguish actors by protocol instead of tags,
+ * array urls are not supported by some AP projects (pixelfed) though.
+ *
+ $ret['url'] = [
+ [
+ 'type' => 'Link',
+ 'rel' => 'alternate',
+ 'mediaType' => 'application/x-zot+json',
+ 'href' => $p['xchan_url']
+ ],
+ [
+ 'type' => 'Link',
+ 'rel' => 'alternate',
+ 'mediaType' => 'application/activity+json',
+ 'href' => $p['xchan_url']
+ ],
+ [
+ 'type' => 'Link',
+ 'rel' => 'alternate', // 'me'?
+ 'mediaType' => 'text/html',
+ 'href' => $p['xchan_url']
+ ]
+ ];
+*/
+
+ $ret['url'] = $p['xchan_url'];
$ret['publicKey'] = [
'id' => $p['xchan_url'],
@@ -1124,6 +1149,12 @@ class Activity {
];
if ($c) {
+ $ret['tag'][] = [
+ 'type' => 'PropertyValue',
+ 'name' => 'Protocol',
+ 'value' => 'zot6'
+ ];
+
$ret['outbox'] = z_root() . '/outbox/' . $c['channel_address'];
}
@@ -1488,7 +1519,7 @@ class Activity {
'type' => NOTIFY_INTRO,
'from_xchan' => $ret['xchan_hash'],
'to_xchan' => $channel['channel_hash'],
- 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'],
+ 'link' => z_root() . '/connections#' . $new_connection[0]['abook_id'],
]
);
@@ -1522,9 +1553,9 @@ class Activity {
/* If there is a default group for this channel and permissions are automatic, add this member to it */
if ($channel['channel_default_group'] && $automatic) {
- $g = Group::rec_byhash($channel['channel_id'], $channel['channel_default_group']);
+ $g = AccessList::by_hash($channel['channel_id'], $channel['channel_default_group']);
if ($g)
- Group::member_add($channel['channel_id'], '', $ret['xchan_hash'], $g['id']);
+ AccessList::member_add($channel['channel_id'], '', $ret['xchan_hash'], $g['id']);
}
@@ -1625,6 +1656,19 @@ class Activity {
$name = t('Unknown');
}
+ $webfinger_addr = '';
+
+ $m = parse_url($url);
+ if ($m) {
+ $hostname = $m['host'];
+ $baseurl = $m['scheme'] . '://' . $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
+ $site_url = $m['scheme'] . '://' . $m['host'];
+ }
+
+ if (!empty($person_obj['preferredUsername']) && isset($parsed_url['host'])) {
+ $webfinger_addr = escape_tags($person_obj['preferredUsername']) . '@' . $hostname;
+ }
+
$icon = z_root() . '/' . get_default_profile_photo(300);
if ($person_obj['icon']) {
if (is_array($person_obj['icon'])) {
@@ -1659,7 +1703,7 @@ class Activity {
if ($links) {
foreach ($links as $link) {
- if (array_key_exists('mediaType', $link) && $link['mediaType'] === 'text/html') {
+ if (is_array($link) && array_key_exists('mediaType', $link) && $link['mediaType'] === 'text/html') {
$profile = $link['href'];
}
}
@@ -1684,13 +1728,6 @@ class Activity {
}
}
- $m = parse_url($url);
- if ($m) {
- $hostname = $m['host'];
- $baseurl = $m['scheme'] . '://' . $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
- $site_url = $m['scheme'] . '://' . $m['host'];
- }
-
$r = q("select * from xchan join hubloc on xchan_hash = hubloc_hash where xchan_hash = '%s'",
dbesc($url)
);
@@ -1709,17 +1746,19 @@ class Activity {
);
// update existing xchan record
- q("update xchan set xchan_name = '%s', xchan_guid = '%s', xchan_pubkey = '%s', xchan_network = 'activitypub', xchan_name_date = '%s' where xchan_hash = '%s'",
+ q("update xchan set xchan_name = '%s', xchan_guid = '%s', xchan_pubkey = '%s', xchan_addr = '%s', xchan_network = 'activitypub', xchan_name_date = '%s' where xchan_hash = '%s'",
dbesc(escape_tags($name)),
dbesc(escape_tags($url)),
dbesc(escape_tags($pubkey)),
+ dbesc(escape_tags($webfinger_addr)),
dbescdate(datetime_convert()),
dbesc($url)
);
// update existing hubloc record
- q("update hubloc set hubloc_guid = '%s', hubloc_network = 'activitypub', hubloc_url = '%s', hubloc_host = '%s', hubloc_callback = '%s', hubloc_updated = '%s', hubloc_id_url = '%s' where hubloc_hash = '%s'",
+ q("update hubloc set hubloc_guid = '%s', hubloc_addr = '%s', hubloc_network = 'activitypub', hubloc_url = '%s', hubloc_host = '%s', hubloc_callback = '%s', hubloc_updated = '%s', hubloc_id_url = '%s' where hubloc_hash = '%s'",
dbesc(escape_tags($url)),
+ dbesc(escape_tags($webfinger_addr)),
dbesc(escape_tags($baseurl)),
dbesc(escape_tags($hostname)),
dbesc(escape_tags($inbox)),
@@ -1736,7 +1775,7 @@ class Activity {
'xchan_hash' => escape_tags($url),
'xchan_guid' => escape_tags($url),
'xchan_pubkey' => escape_tags($pubkey),
- 'xchan_addr' => '',
+ 'xchan_addr' => $webfinger_addr,
'xchan_url' => escape_tags($profile),
'xchan_name' => escape_tags($name),
'xchan_name_date' => datetime_convert(),
@@ -1748,7 +1787,7 @@ class Activity {
[
'hubloc_guid' => escape_tags($url),
'hubloc_hash' => escape_tags($url),
- 'hubloc_addr' => '',
+ 'hubloc_addr' => $webfinger_addr,
'hubloc_network' => 'activitypub',
'hubloc_url' => escape_tags($baseurl),
'hubloc_host' => escape_tags($hostname),
@@ -1760,6 +1799,19 @@ class Activity {
);
}
+ // We store all ActivityPub actors we can resolve. Some of them may be able to communicate over Zot6. Find them.
+ // Adding zot discovery urls to the actor record will cause federation to fail with the 20-30 projects which don't accept arrays in the url field.
+
+ $actor_protocols = self::get_actor_protocols($person_obj);
+ if (in_array('zot6', $actor_protocols)) {
+ $zx = q("select * from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6'",
+ dbesc($url)
+ );
+ if (!$zx && $webfinger_addr) {
+ Master::Summon(['Gprobe', bin2hex($webfinger_addr)]);
+ }
+ }
+
$photos = import_xchan_photo($icon, $url);
q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'",
dbescdate(datetime_convert('UTC', 'UTC', $photos[5])),
@@ -2063,6 +2115,7 @@ class Activity {
}
static function update_poll($item, $post) {
+
$multi = false;
$mid = $post['mid'];
$content = $post['title'];
@@ -2147,7 +2200,8 @@ class Activity {
dbesc(datetime_convert()),
intval($item['id'])
);
- Master::Summon(['Notifier', 'wall-new', $item['id']]);
+
+ Master::Summon(['Notifier', 'wall-new', $item['id'], $post['mid'] /* trick queueworker de-duplication */ ]);
return true;
}
@@ -2639,6 +2693,17 @@ class Activity {
// set the owner to the owner of the parent
$item['owner_xchan'] = $p[0]['owner_xchan'];
+ // quietly reject group comment boosts by group owner
+ // (usually only sent via ActivityPub so groups will work on microblog platforms)
+ // This catches those activities if they slipped in via a conversation fetch
+
+ if ($p[0]['parent_mid'] !== $item['parent_mid']) {
+ if ($item['verb'] === 'Announce' && $item['author_xchan'] === $item['owner_xchan']) {
+ logger('group boost activity by group owner rejected');
+ return;
+ }
+ }
+
// check permissions against the author, not the sender
$allowed = perm_is_allowed($channel['channel_id'], $item['author_xchan'], 'post_comments');
if ((!$allowed)/* && $permit_mentions*/) {
@@ -3633,4 +3698,24 @@ class Activity {
return $ret;
}
+
+
+ static function get_actor_protocols($actor) {
+ $ret = [];
+
+ if (!array_key_exists('tag', $actor) || empty($actor['tag']) || !is_array($actor['tag'])) {
+ return $ret;
+ }
+
+ foreach ($tag as $t) {
+ if ((isset($t['type']) && $t['type'] === 'PropertyValue') &&
+ (isset($t['name']) && $t['name'] === 'Protocol') &&
+ (isset($t['value']) && in_array($t['value'], ['zot6', 'activitypub', 'diaspora']))
+ ) {
+ $ret[] = $t['value'];
+ }
+ }
+
+ return $ret;
+ }
}
diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php
index fa38c569e..09e1679ac 100644
--- a/Zotlabs/Lib/ActivityStreams.php
+++ b/Zotlabs/Lib/ActivityStreams.php
@@ -285,7 +285,7 @@ class ActivityStreams {
if (!$s) {
return false;
}
- return (in_array($s, ['Like', 'Dislike', 'Flag', 'Block', 'Accept', 'Reject', 'TentativeAccept', 'TentativeReject', 'emojiReaction', 'EmojiReaction', 'EmojiReact']));
+ return (in_array($s, ['Like', 'Dislike', 'Flag', 'Block', 'Announce', 'Accept', 'Reject', 'TentativeAccept', 'TentativeReject', 'emojiReaction', 'EmojiReaction', 'EmojiReact']));
}
/**
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index c4ddcff1b..6ce052b06 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -67,17 +67,15 @@ class Apps {
static public function get_base_apps() {
$x = get_config('system','base_apps',[
'Connections',
+ 'Contact Roles',
'Network',
- 'Settings',
'Files',
'Channel Home',
- 'View Profile',
'Photos',
'Calendar',
'Directory',
'Search',
'Help',
- 'Profile Photo',
'HQ',
'Post'
]);
@@ -377,10 +375,10 @@ class Apps {
'OAuth Apps Manager' => t('OAuth Apps Manager'),
'OAuth2 Apps Manager' => t('OAuth2 Apps Manager'),
'PDL Editor' => t('PDL Editor'),
- 'Permission Categories' => t('Permission Categories'),
+ 'Contact Roles' => t('Contact Roles'),
'Public Stream' => t('Public Stream'),
'My Chatrooms' => t('My Chatrooms'),
- 'Channel Export' => t('Channel Export'),
+ 'Channel Export' => t('Channel Export')
);
if(array_key_exists('name',$arr)) {
diff --git a/Zotlabs/Lib/Connect.php b/Zotlabs/Lib/Connect.php
index 38fe69995..0b9ff7089 100644
--- a/Zotlabs/Lib/Connect.php
+++ b/Zotlabs/Lib/Connect.php
@@ -261,7 +261,8 @@ class Connect {
'abook_feed' => intval(($xchan['xchan_network'] === 'rss') ? 1 : 0),
'abook_created' => datetime_convert(),
'abook_updated' => datetime_convert(),
- 'abook_instance' => (($singleton) ? z_root() : '')
+ 'abook_instance' => (($singleton) ? z_root() : ''),
+ 'abook_role' => get_pconfig($uid, 'system', 'default_permcat', 'default')
]
);
}
@@ -300,7 +301,7 @@ class Connect {
/** If there is a default group for this channel, add this connection to it */
if ($default_group) {
- $g = AccessList::rec_byhash($uid,$default_group);
+ $g = AccessList::by_hash($uid,$default_group);
if ($g) {
AccessList::member_add($uid,'',$xchan_hash,$g['id']);
}
diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php
index d02dab739..2e483cb92 100644
--- a/Zotlabs/Lib/Enotify.php
+++ b/Zotlabs/Lib/Enotify.php
@@ -256,7 +256,7 @@ class Enotify {
$itemlink = $params['link'];
- if (array_key_exists('item',$params) && (! activity_match($params['item']['verb'],ACTIVITY_LIKE))) {
+ if (array_key_exists('item',$params) && activity_match($params['item']['verb'],ACTIVITY_LIKE)) {
if(! $always_show_in_notices || !($vnotify & VNOTIFY_LIKE)) {
logger('notification: not a visible activity. Ignoring.');
pop_lang();
@@ -902,7 +902,7 @@ class Enotify {
static public function format_intros($rr) {
return [
- 'notify_link' => z_root() . '/connections/ifpending',
+ 'notify_link' => z_root() . '/connections#' . $rr['abook_id'],
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
diff --git a/Zotlabs/Lib/Group.php b/Zotlabs/Lib/Group.php
deleted file mode 100644
index a4ff4fced..000000000
--- a/Zotlabs/Lib/Group.php
+++ /dev/null
@@ -1,405 +0,0 @@
-<?php
-
-namespace Zotlabs\Lib;
-
-use Zotlabs\Lib\Libsync;
-
-
-class Group {
-
- static function add($uid,$name,$public = 0) {
-
- $ret = false;
- if(x($uid) && x($name)) {
- $r = self::byname($uid,$name); // check for dups
- if($r !== false) {
-
- // This could be a problem.
- // Let's assume we've just created a group which we once deleted
- // all the old members are gone, but the group remains so we don't break any security
- // access lists. What we're doing here is reviving the dead group, but old content which
- // was restricted to this group may now be seen by the new group members.
-
- $z = q("SELECT * FROM pgrp WHERE id = %d LIMIT 1",
- intval($r)
- );
- if(($z) && $z[0]['deleted']) {
- q('UPDATE pgrp SET deleted = 0 WHERE id = %d', intval($z[0]['id']));
- notice( t('A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
- }
- return true;
- }
-
- do {
- $dups = false;
- $hash = random_string(32) . str_replace(['<','>'],['.','.'], $name);
-
- $r = q("SELECT id FROM pgrp WHERE hash = '%s' LIMIT 1", dbesc($hash));
- if($r)
- $dups = true;
- } while($dups == true);
-
-
- $r = q("INSERT INTO pgrp ( hash, uid, visible, gname )
- VALUES( '%s', %d, %d, '%s' ) ",
- dbesc($hash),
- intval($uid),
- intval($public),
- dbesc($name)
- );
- $ret = $r;
- }
-
- Libsync::build_sync_packet($uid,null,true);
- return $ret;
- }
-
-
- static function remove($uid,$name) {
- $ret = false;
- if(x($uid) && x($name)) {
- $r = q("SELECT id, hash FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
- intval($uid),
- dbesc($name)
- );
- if($r) {
- $group_id = $r[0]['id'];
- $group_hash = $r[0]['hash'];
- }
-
- if(! $group_id)
- return false;
-
- // remove group from default posting lists
- $r = q("SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
- intval($uid)
- );
- if($r) {
- $user_info = $r[0];
- $change = false;
-
- if($user_info['channel_default_group'] == $group_hash) {
- $user_info['channel_default_group'] = '';
- $change = true;
- }
- if(strpos($user_info['channel_allow_gid'], '<' . $group_hash . '>') !== false) {
- $user_info['channel_allow_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_allow_gid']);
- $change = true;
- }
- if(strpos($user_info['channel_deny_gid'], '<' . $group_hash . '>') !== false) {
- $user_info['channel_deny_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_deny_gid']);
- $change = true;
- }
-
- if($change) {
- q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
- WHERE channel_id = %d",
- intval($user_info['channel_default_group']),
- dbesc($user_info['channel_allow_gid']),
- dbesc($user_info['channel_deny_gid']),
- intval($uid)
- );
- }
- }
-
- // remove all members
- $r = q("DELETE FROM pgrp_member WHERE uid = %d AND gid = %d ",
- intval($uid),
- intval($group_id)
- );
-
- // remove group
- $r = q("UPDATE pgrp SET deleted = 1 WHERE uid = %d AND gname = '%s'",
- intval($uid),
- dbesc($name)
- );
-
- $ret = $r;
-
- }
-
- Libsync::build_sync_packet($uid,null,true);
-
- return $ret;
- }
-
-
- static function byname($uid,$name) {
- if((! $uid) || (! strlen($name)))
- return false;
- $r = q("SELECT * FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
- intval($uid),
- dbesc($name)
- );
- if($r)
- return $r[0]['id'];
- return false;
- }
-
-
- static function rec_byhash($uid,$hash) {
- if((! $uid) || (! strlen($hash)))
- return false;
- $r = q("SELECT * FROM pgrp WHERE uid = %d AND hash = '%s' LIMIT 1",
- intval($uid),
- dbesc($hash)
- );
- if($r)
- return $r[0];
- return false;
- }
-
-
- static function member_remove($uid,$name,$member) {
- $gid = self::byname($uid,$name);
- if(! $gid)
- return false;
- if(! ( $uid && $gid && $member))
- return false;
- $r = q("DELETE FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' ",
- intval($uid),
- intval($gid),
- dbesc($member)
- );
-
- Libsync::build_sync_packet($uid,null,true);
-
- return $r;
- }
-
-
- static function member_add($uid,$name,$member,$gid = 0) {
- if(! $gid)
- $gid = self::byname($uid,$name);
- if((! $gid) || (! $uid) || (! $member))
- return false;
-
- $r = q("SELECT * FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1",
- intval($uid),
- intval($gid),
- dbesc($member)
- );
- if($r)
- return true; // You might question this, but
- // we indicate success because the group member was in fact created
- // -- It was just created at another time
- if(! $r)
- $r = q("INSERT INTO pgrp_member (uid, gid, xchan)
- VALUES( %d, %d, '%s' ) ",
- intval($uid),
- intval($gid),
- dbesc($member)
- );
-
- Libsync::build_sync_packet($uid,null,true);
-
- return $r;
- }
-
-
- static function members($gid) {
- $ret = array();
- if(intval($gid)) {
- $r = q("SELECT * FROM pgrp_member
- LEFT JOIN abook ON abook_xchan = pgrp_member.xchan left join xchan on xchan_hash = abook_xchan
- WHERE gid = %d AND abook_channel = %d and pgrp_member.uid = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC ",
- intval($gid),
- intval(local_channel()),
- intval(local_channel())
- );
- if($r)
- $ret = $r;
- }
- return $ret;
- }
-
- static function members_xchan($gid) {
- $ret = [];
- if(intval($gid)) {
- $r = q("SELECT xchan FROM pgrp_member WHERE gid = %d AND uid = %d",
- intval($gid),
- intval(local_channel())
- );
- if($r) {
- foreach($r as $rr) {
- $ret[] = $rr['xchan'];
- }
- }
- }
- return $ret;
- }
-
- static function members_profile_xchan($uid,$gid) {
- $ret = [];
-
- if(intval($gid)) {
- $r = q("SELECT abook_xchan as xchan from abook left join profile on abook_profile = profile_guid where profile.id = %d and profile.uid = %d",
- intval($gid),
- intval($uid)
- );
- if($r) {
- foreach($r as $rr) {
- $ret[] = $rr['xchan'];
- }
- }
- }
- return $ret;
- }
-
-
-
-
- static function select($uid,$group = '') {
-
- $grps = [];
- $o = '';
-
- $r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
- intval($uid)
- );
- $grps[] = array('name' => '', 'hash' => '0', 'selected' => '');
- if($r) {
- foreach($r as $rr) {
- $grps[] = array('name' => $rr['gname'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : ''));
- }
-
- }
- logger('select: ' . print_r($grps,true), LOGGER_DATA);
-
- $o = replace_macros(get_markup_template('group_selection.tpl'), array(
- '$label' => t('Add new connections to this privacy group'),
- '$groups' => $grps
- ));
- return $o;
- }
-
-
-
-
- static function widget($every="connections",$each="group",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
-
- $o = '';
-
- if(! (local_channel() && feature_enabled(local_channel(),'groups'))) {
- return '';
- }
-
- $groups = array();
-
- $r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
- intval($_SESSION['uid'])
- );
- $member_of = array();
- if($cid) {
- $member_of = self::containing(local_channel(),$cid);
- }
-
- if($r) {
- foreach($r as $rr) {
- $selected = (($group_id == $rr['id']) ? ' group-selected' : '');
-
- if ($edit) {
- $groupedit = [ 'href' => "group/".$rr['id'], 'title' => t('edit') ];
- }
- else {
- $groupedit = null;
- }
-
- $groups[] = [
- 'id' => $rr['id'],
- 'enc_cid' => base64url_encode($cid),
- 'cid' => $cid,
- 'text' => $rr['gname'],
- 'selected' => $selected,
- 'href' => (($mode == 0) ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']) . ((x($_GET,'new')) ? '&new=' . $_GET['new'] : '') . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : ''),
- 'edit' => $groupedit,
- 'ismember' => in_array($rr['id'],$member_of),
- ];
- }
- }
-
-
- $tpl = get_markup_template("group_side.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Privacy Groups'),
- '$edittext' => t('Edit group'),
- '$createtext' => t('Add privacy group'),
- '$ungrouped' => (($every === 'contacts') ? t('Channels not in any privacy group') : ''),
- '$groups' => $groups,
- '$add' => t('add'),
- ));
-
-
- return $o;
- }
-
-
- static function expand($g) {
- if(! (is_array($g) && count($g)))
- return array();
-
- $ret = [];
- $x = [];
-
- // private profile linked virtual groups
-
- foreach($g as $gv) {
- if(substr($gv,0,3) === 'vp.') {
- $profile_hash = substr($gv,3);
- if($profile_hash) {
- $r = q("select abook_xchan from abook where abook_profile = '%s'",
- dbesc($profile_hash)
- );
- if($r) {
- foreach($r as $rv) {
- $ret[] = $rv['abook_xchan'];
- }
- }
- }
- }
- else {
- $x[] = $gv;
- }
- }
-
- if($x) {
- stringify_array_elms($x,true);
- $groups = implode(',', $x);
- if($groups) {
- $r = q("SELECT xchan FROM pgrp_member WHERE gid IN ( select id from pgrp where hash in ( $groups ))");
- if($r) {
- foreach($r as $rr) {
- $ret[] = $rr['xchan'];
- }
- }
- }
- }
- return $ret;
- }
-
-
- static function member_of($c) {
- $r = q("SELECT pgrp.gname, pgrp.id FROM pgrp LEFT JOIN pgrp_member ON pgrp_member.gid = pgrp.id WHERE pgrp_member.xchan = '%s' AND pgrp.deleted = 0 ORDER BY pgrp.gname ASC ",
- dbesc($c)
- );
-
- return $r;
-
- }
-
- static function containing($uid,$c) {
-
- $r = q("SELECT gid FROM pgrp_member WHERE uid = %d AND pgrp_member.xchan = '%s' ",
- intval($uid),
- dbesc($c)
- );
-
- $ret = array();
- if($r) {
- foreach($r as $rr)
- $ret[] = $rr['gid'];
- }
-
- return $ret;
- }
-} \ No newline at end of file
diff --git a/Zotlabs/Lib/Libsync.php b/Zotlabs/Lib/Libsync.php
index c4f1b20ea..36a0a044c 100644
--- a/Zotlabs/Lib/Libsync.php
+++ b/Zotlabs/Lib/Libsync.php
@@ -230,8 +230,35 @@ class Libsync {
if (array_key_exists('config', $arr) && is_array($arr['config']) && count($arr['config'])) {
foreach ($arr['config'] as $cat => $k) {
- foreach ($arr['config'][$cat] as $k => $v)
- set_pconfig($channel['channel_id'], $cat, $k, $v);
+ $pconfig_updated = [];
+
+ foreach($arr['config'][$cat] as $k => $v) {
+ if ($cat === 'hz_delpconfig' && strpos($k, 'b64.') === 0) {
+ $delpconfig = explode(':', unpack_link_id($k));
+
+ // delete the provided pconfig
+ del_pconfig($channel['channel_id'], $delpconfig[0], $delpconfig[1], $v);
+
+ // delete the messenger pconfig
+ del_pconfig($channel['channel_id'], 'hz_delpconfig', $k);
+ }
+
+ if (strpos($k,'pcfgud:') === 0) {
+ $realk = substr($k,7);
+ $pconfig_updated[$realk] = $v;
+ unset($arr['config'][$cat][$k]);
+ }
+ }
+
+ foreach($arr['config'][$cat] as $k => $v) {
+ if (!isset($pconfig_updated[$k])) {
+ $pconfig_updated[$k] = NULL;
+ }
+
+ if ($cat !== 'hz_delpconfig') {
+ set_pconfig($channel['channel_id'],$cat,$k,$v,$pconfig_updated[$k]);
+ }
+ }
}
}
@@ -384,19 +411,42 @@ class Libsync {
// This relies on the undocumented behaviour that red sites send xchan info with the abook
// and import_author_xchan will look them up on all federated networks
- if ($abook['abook_xchan'] && $abook['xchan_addr']) {
+ $found = false;
+ if ($abook['abook_xchan'] && $abook['xchan_addr'] && (! in_array($abook['xchan_network'], [ 'token', 'unknown' ]))) {
$h = Libzot::get_hublocs($abook['abook_xchan']);
- if (!$h) {
+ if ($h) {
+ $found = true;
+ }
+ else {
$xhash = import_author_xchan(encode_item_xchan($abook));
- if (!$xhash) {
+ if ($xhash) {
+ $found = true;
+ }
+ else {
logger('Import of ' . $abook['xchan_addr'] . ' failed.');
- continue;
}
}
}
+ if (!$found && !in_array($abook['xchan_network'], ['zot6', 'activitypub', 'diaspora'])) {
+ // just import the record.
+ $xc = [];
+ foreach ($abook as $k => $v) {
+ if (strpos($k,'xchan_') === 0) {
+ $xc[$k] = $v;
+ }
+ }
+ $r = q("select * from xchan where xchan_hash = '%s'",
+ dbesc($xc['xchan_hash'])
+ );
+ if (! $r) {
+ xchan_store_lowlevel($xc);
+ }
+ }
+
+
foreach ($abook as $k => $v) {
- if (in_array($k, $disallowed) || (strpos($k, 'abook') !== 0)) {
+ if (in_array($k, $disallowed) || (strpos($k, 'abook_') !== 0)) {
continue;
}
if (!in_array($k, $fields)) {
@@ -410,6 +460,13 @@ class Libsync {
if (array_key_exists('abook_instance', $clean) && $clean['abook_instance'] && strpos($clean['abook_instance'], z_root()) === false) {
$clean['abook_not_here'] = 1;
+
+ // guest pass or access token - don't try to probe since it is one-way
+ // we are relying on the undocumented behaviour that the abook record also contains the xchan
+ if ($abook['xchan_network'] === 'token') {
+ $clean['abook_instance'] .= ',';
+ $clean['abook_instance'] .= z_root();
+ }
}
@@ -768,14 +825,13 @@ class Libsync {
// match as many fields as possible in case anything at all changed.
- $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_id_url = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_site_id = '%s' and hubloc_host = '%s' and hubloc_addr = '%s' and hubloc_callback = '%s' and hubloc_sitekey = '%s' ",
+ $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_id_url = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_host = '%s' and hubloc_addr = '%s' and hubloc_callback = '%s' and hubloc_sitekey = '%s' ",
dbesc($sender['hash']),
dbesc($sender['id']),
dbesc($sender['id_sig']),
dbesc($location['id_url']),
dbesc($location['url']),
dbesc($location['url_sig']),
- dbesc($location['site_id']),
dbesc($location['host']),
dbesc($location['address']),
dbesc($location['callback']),
@@ -784,6 +840,15 @@ class Libsync {
if ($r) {
logger('Hub exists: ' . $location['url'], LOGGER_DEBUG);
+ // generate a new hubloc_site_id if it's wrong due to historical bugs 2021-11-30
+
+ if ($r[0]['hubloc_site_id'] !== $location['site_id']) {
+ q("update hubloc set hubloc_site_id = '%s' where hubloc_id = %d",
+ dbesc(Libzot::make_xchan_hash($location['url'], $location['sitekey'])),
+ intval($r[0]['hubloc_id'])
+ );
+ }
+
// update connection timestamp if this is the site we're talking to
// This only happens when called from import_xchan
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index 31b8f04de..e2cbc66e6 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -386,9 +386,10 @@ class Libzot {
else {
$p = Permissions::connect_perms($channel['channel_id']);
- $my_perms = $p['perms'];
+ $my_perms = $p['perms'];
$automatic = $p['automatic'];
+ $role = (($automatic) ? $p['role'] : '');
// new connection
@@ -410,7 +411,8 @@ class Libzot {
'abook_created' => datetime_convert(),
'abook_updated' => datetime_convert(),
'abook_dob' => $next_birthday,
- 'abook_pending' => intval(($automatic) ? 0 : 1)
+ 'abook_pending' => intval(($automatic) ? 0 : 1),
+ 'abook_role' => $role
]
);
@@ -435,7 +437,7 @@ class Libzot {
'type' => NOTIFY_INTRO,
'from_xchan' => $x['hash'],
'to_xchan' => $channel['channel_hash'],
- 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id']
+ 'link' => z_root() . '/connections#' . $new_connection[0]['abook_id']
]
);
@@ -453,10 +455,10 @@ class Libzot {
$default_group = $channel['channel_default_group'];
if ($default_group) {
- $g = Group::rec_byhash($channel['channel_id'], $default_group);
+ $g = AccessList::by_hash($channel['channel_id'], $default_group);
if ($g) {
- Group::member_add($channel['channel_id'], '', $x['hash'], $g['id']);
+ AccessList::member_add($channel['channel_id'], '', $x['hash'], $g['id']);
}
}
}
@@ -1143,6 +1145,7 @@ class Libzot {
if ($env['encoding'] === 'activitystreams') {
$AS = new ActivityStreams($data);
+
if (!$AS->is_valid()) {
logger('Activity rejected: ' . print_r($data, true));
return;
@@ -1158,8 +1161,6 @@ class Libzot {
}
-
-
$deliveries = null;
if (array_key_exists('recipients', $env) && count($env['recipients'])) {
@@ -1592,6 +1593,7 @@ class Libzot {
if ((!$tag_delivery) && (!$local_public)) {
$allowed = (perm_is_allowed($channel['channel_id'], $sender, $perm));
+
if ((!$allowed) && $perm === 'post_comments') {
$parent = q("select * from item where mid = '%s' and uid = %d limit 1",
dbesc($arr['parent_mid']),
@@ -2785,28 +2787,6 @@ class Libzot {
if ($deleted || $censored || $sys_channel)
$searchable = false;
- $public_forum = false;
-
- $role = get_pconfig($e['channel_id'], 'system', 'permissions_role');
- if ($role === 'forum' || $role === 'repository') {
- $public_forum = true;
- }
- else {
- // check if it has characteristics of a public forum based on custom permissions.
- $m = Permissions::FilledAutoperms($e['channel_id']);
- if ($m) {
- foreach ($m as $k => $v) {
- if ($k == 'tag_deliver' && intval($v) == 1)
- $ch++;
- if ($k == 'send_stream' && intval($v) == 0)
- $ch++;
- }
- if ($ch == 2)
- $public_forum = true;
- }
- }
-
-
// This is for birthdays and keywords, but must check access permissions
$p = q("select * from profile where uid = %d and is_default = 1",
intval($e['channel_id'])
@@ -2875,6 +2855,7 @@ class Libzot {
];
$ret['channel_role'] = get_pconfig($e['channel_id'], 'system', 'permissions_role', 'custom');
+ $ret['channel_type'] = ((get_pconfig($e['channel_id'], 'system', 'group_actor')) ? 'group' : 'normal');
$hookinfo = [
'channel_id' => $id,
@@ -2890,8 +2871,10 @@ class Libzot {
$ret['protocols'] = $hookinfo['protocols'];
$ret['searchable'] = $searchable;
$ret['adult_content'] = $adult_channel;
- $ret['public_forum'] = $public_forum;
+ // now all forums (public, restricted, and private) set the public_forum flag. So it really means "is a group"
+ // and has nothing to do with accessibility.
+ $ret['public_forum'] = get_pconfig($e['channel_id'], 'system', 'group_actor');
$ret['comments'] = map_scope(PermissionLimits::Get($e['channel_id'], 'post_comments'));
$ret['mail'] = map_scope(PermissionLimits::Get($e['channel_id'], 'post_mail'));
diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php
index 9e6a3ac85..bf4ac8e87 100644
--- a/Zotlabs/Lib/NativeWiki.php
+++ b/Zotlabs/Lib/NativeWiki.php
@@ -12,8 +12,8 @@ class NativeWiki {
public static function listwikis($channel, $observer_hash) {
$sql_extra = item_permissions_sql($channel['channel_id'], $observer_hash);
- $wikis = q("SELECT * FROM item
- WHERE resource_type = '%s' AND mid = parent_mid AND uid = %d AND item_deleted = 0 $sql_extra",
+ $wikis = q("SELECT * FROM item
+ WHERE resource_type = '%s' AND mid = parent_mid AND uid = %d AND item_deleted = 0 $sql_extra",
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
intval($channel['channel_id'])
);
@@ -49,7 +49,7 @@ class NativeWiki {
$mid = z_root() . '/item/' . $uuid;
$arr = array(); // Initialize the array of parameters for the post
- $item_hidden = ((intval($wiki['postVisible']) === 0) ? 1 : 0);
+ $item_hidden = ((intval($wiki['postVisible']) === 0) ? 1 : 0);
$wiki_url = z_root() . '/wiki/' . $channel['channel_address'] . '/' . $wiki['urlName'];
$arr['aid'] = $channel['channel_account_id'];
$arr['uuid'] = $uuid;
@@ -61,8 +61,8 @@ class NativeWiki {
$arr['resource_id'] = $resource_id;
$arr['owner_xchan'] = $channel['channel_hash'];
$arr['author_xchan'] = $observer_hash;
- $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . urlencode($arr['mid']);
- $arr['llink'] = $arr['plink'];
+ $arr['plink'] = $mid;
+ $arr['llink'] = z_root() . '/display/' . gen_link_id($mid);
$arr['title'] = $wiki['htmlName']; // name of new wiki;
$arr['allow_cid'] = $ac['allow_cid'];
$arr['allow_gid'] = $ac['allow_gid'];
@@ -133,13 +133,13 @@ class NativeWiki {
// update acl for any existing wiki pages
q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d where resource_type = 'nwikipage' and resource_id = '%s'",
- dbesc($item['allow_cid']),
- dbesc($item['allow_gid']),
- dbesc($item['deny_cid']),
- dbesc($item['deny_gid']),
- dbesc($item['item_private']),
+ dbesc($item['allow_cid']),
+ dbesc($item['allow_gid']),
+ dbesc($item['deny_cid']),
+ dbesc($item['deny_gid']),
+ dbesc($item['item_private']),
dbesc($arr['resource_id'])
- );
+ );
if($update['item_id']) {
@@ -211,12 +211,12 @@ class NativeWiki {
public static function get_wiki($channel_id, $observer_hash, $resource_id) {
-
+
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
- $item = q("SELECT * FROM item WHERE uid = %d AND resource_type = '%s' AND resource_id = '%s' AND item_deleted = 0
+ $item = q("SELECT * FROM item WHERE uid = %d AND resource_type = '%s' AND resource_id = '%s' AND item_deleted = 0
$sql_extra ORDER BY id LIMIT 1",
- intval($channel_id),
+ intval($channel_id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
dbesc($resource_id)
);
@@ -224,7 +224,7 @@ class NativeWiki {
return [ 'wiki' => null ];
}
else {
-
+
$w = $item[0]; // wiki item table record
// Get wiki metadata
$rawName = get_iconfig($w, 'wiki', 'rawName');
@@ -246,20 +246,20 @@ class NativeWiki {
public static function exists_by_name($uid, $urlName) {
- $sql_extra = item_permissions_sql($uid);
+ $sql_extra = item_permissions_sql($uid);
- $item = q("SELECT item.id, resource_id FROM item left join iconfig on iconfig.iid = item.id
- WHERE resource_type = '%s' AND iconfig.v = '%s' AND uid = %d
- AND item_deleted = 0 $sql_extra limit 1",
- dbesc(NWIKI_ITEM_RESOURCE_TYPE),
- //dbesc(urldecode($urlName)),
+ $item = q("SELECT item.id, resource_id FROM item left join iconfig on iconfig.iid = item.id
+ WHERE resource_type = '%s' AND iconfig.v = '%s' AND uid = %d
+ AND item_deleted = 0 $sql_extra limit 1",
+ dbesc(NWIKI_ITEM_RESOURCE_TYPE),
+ //dbesc(urldecode($urlName)),
dbesc(self::name_decode($urlName)),
intval($uid)
);
if($item) {
return array('id' => $item[0]['id'], 'resource_id' => $item[0]['resource_id']);
- }
+ }
else {
return array('id' => null, 'resource_id' => null);
}
@@ -277,7 +277,7 @@ class NativeWiki {
$r = q("SELECT * FROM item WHERE uid = %d and resource_type = '%s' AND resource_id = '%s' $sql_extra LIMIT 1",
intval($owner_id),
- dbesc(NWIKI_ITEM_RESOURCE_TYPE),
+ dbesc(NWIKI_ITEM_RESOURCE_TYPE),
dbesc($resource_id)
);
@@ -285,8 +285,6 @@ class NativeWiki {
return array('read' => false, 'write' => false, 'success' => true);
}
else {
- // TODO: Create a new permission setting for wiki analogous to webpages. Until
- // then, use webpage permissions
$write = perm_is_allowed($owner_id, $observer_hash,'write_wiki');
return array('read' => true, 'write' => $write, 'success' => true);
}
diff --git a/Zotlabs/Lib/NativeWikiPage.php b/Zotlabs/Lib/NativeWikiPage.php
index 3c61ea800..1e944f7ac 100644
--- a/Zotlabs/Lib/NativeWikiPage.php
+++ b/Zotlabs/Lib/NativeWikiPage.php
@@ -2,14 +2,15 @@
namespace Zotlabs\Lib;
-use \Zotlabs\Lib as Zlib;
+use App;
+use Zotlabs\Access\PermissionLimits;
class NativeWikiPage {
- static public function page_list($channel_id,$observer_hash, $resource_id) {
+ static public function page_list($channel_id, $observer_hash, $resource_id) {
// TODO: Create item table records for pages so that metadata like title can be applied
- $w = Zlib\NativeWiki::get_wiki($channel_id,$observer_hash,$resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
$pages[] = [
'resource_id' => '',
@@ -18,134 +19,149 @@ class NativeWikiPage {
'link_id' => 'id_wiki_home_0'
];
- $sql_extra = item_permissions_sql($channel_id,$observer_hash);
+ $sql_extra = item_permissions_sql($channel_id, $observer_hash);
- $r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and item_deleted = 0
+ $r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and item_deleted = 0
$sql_extra order by title asc",
dbesc($resource_id),
intval($channel_id)
);
- if($r) {
+ if ($r) {
$x = [];
$y = [];
- foreach($r as $rv) {
- if(! in_array($rv['mid'],$x)) {
+ foreach ($r as $rv) {
+ if (!in_array($rv['mid'], $x)) {
$y[] = $rv;
$x[] = $rv['mid'];
}
}
- $items = fetch_post_tags($y,true);
+ $items = fetch_post_tags($y, true);
- foreach($items as $page_item) {
- $title = get_iconfig($page_item['id'],'nwikipage','pagetitle',t('(No Title)'));
- if(urldecode($title) !== 'Home') {
+ foreach ($items as $page_item) {
+ $title = get_iconfig($page_item['id'], 'nwikipage', 'pagetitle', t('(No Title)'));
+ if (urldecode($title) !== 'Home') {
$pages[] = [
'resource_id' => $resource_id,
'title' => escape_tags($title),
//'url' => str_replace('%2F','/',urlencode(str_replace('%2F','/',urlencode($title)))),
- 'url' => Zlib\NativeWiki::name_encode($title),
+ 'url' => NativeWiki::name_encode($title),
'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $page_item['id']
];
}
}
}
- return array('pages' => $pages, 'wiki' => $w);
+ return ['pages' => $pages, 'wiki' => $w];
}
- static public function create_page($channel_id, $observer_hash, $name, $resource_id, $mimetype = 'text/bbcode') {
+ static public function create_page($channel, $observer_hash, $name, $resource_id, $mimetype = 'text/bbcode') {
logger('mimetype: ' . $mimetype);
- if(! in_array($mimetype,[ 'text/markdown','text/bbcode','text/plain','text/html' ]))
+ if (!in_array($mimetype, ['text/markdown', 'text/bbcode', 'text/plain', 'text/html']))
$mimetype = 'text/markdown';
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel['channel_id'], $observer_hash, $resource_id);
- if (! $w['wiki']) {
- return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
+ if (!$w['wiki']) {
+ return ['content' => null, 'message' => 'Error reading wiki', 'success' => false];
}
// backslashes won't work well in the javascript functions
- $name = str_replace('\\','',$name);
-
- // create an empty activity
+ $name = str_replace('\\', '', $name);
- $arr = [];
- $arr['uid'] = $channel_id;
- $arr['author_xchan'] = $observer_hash;
- $arr['mimetype'] = $mimetype;
- $arr['title'] = $name;
- $arr['resource_type'] = 'nwikipage';
- $arr['resource_id'] = $resource_id;
- $arr['allow_cid'] = $w['wiki']['allow_cid'];
- $arr['allow_gid'] = $w['wiki']['allow_gid'];
- $arr['deny_cid'] = $w['wiki']['deny_cid'];
- $arr['deny_gid'] = $w['wiki']['deny_gid'];
+ $uuid = new_uuid();
+ $mid = z_root() . '/item/' . $uuid;
- $arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel_id,'view_wiki'),true);
+ // create an empty activity
+ $arr = [];
+ $arr['aid'] = $channel['channel_account_id'];
+ $arr['uid'] = $channel['channel_id'];
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $w['wiki']['mid'];
+ $arr['parent'] = $w['wiki']['parent'];
+ $arr['uuid'] = $uuid;
+ $arr['item_hidden'] = $w['wiki']['item_hidden'];
+ $arr['plink'] = $mid;
+ $arr['llink'] = z_root() . '/display/' . gen_link_id($mid);
+ $arr['author_xchan'] = $observer_hash;
+ $arr['mimetype'] = $mimetype;
+ $arr['title'] = $name;
+ $arr['resource_type'] = 'nwikipage';
+ $arr['resource_id'] = $resource_id;
+ $arr['allow_cid'] = $w['wiki']['allow_cid'];
+ $arr['allow_gid'] = $w['wiki']['allow_gid'];
+ $arr['deny_cid'] = $w['wiki']['deny_cid'];
+ $arr['deny_gid'] = $w['wiki']['deny_gid'];
+ $arr['item_private'] = $w['wiki']['item_private'];
+ $arr['item_wall'] = 1;
+ $arr['item_origin'] = 1;
+ $arr['item_thread_top'] = 1;
+ $arr['verb'] = ACTIVITY_CREATE;
+ $arr['obj_type'] = 'Document';
+ // TODO: add an object?
+ $arr['public_policy'] = map_scope(PermissionLimits::Get($channel['channel_id'], 'view_wiki'), true);
// We may wish to change this some day.
$arr['item_unpublished'] = 1;
- set_iconfig($arr,'nwikipage','pagetitle',(($name) ? $name : t('(No Title)')),true);
-
- $p = post_activity_item($arr, false, false);
+ set_iconfig($arr, 'nwikipage', 'pagetitle', (($name) ? $name : t('(No Title)')), true);
+ $p = item_store($arr, false, false);
- if($p['item_id']) {
- $page = [
+ if ($p['item_id']) {
+ $page = [
'rawName' => $name,
'htmlName' => escape_tags($name),
- //'urlName' => urlencode($name),
- 'urlName' => Zlib\NativeWiki::name_encode($name)
+ //'urlName' => urlencode($name),
+ 'urlName' => NativeWiki::name_encode($name)
];
- return array('page' => $page, 'item_id' => $p['item_id'], 'item' => $p['activity'], 'wiki' => $w, 'message' => '', 'success' => true);
+ return ['page' => $page, 'item_id' => $p['item_id'], 'item' => $p['activity'], 'wiki' => $w, 'message' => '', 'success' => true];
}
- return [ 'success' => false, 'message' => t('Wiki page create failed.') ];
+ return ['success' => false, 'message' => t('Wiki page create failed.')];
}
static public function rename_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $pageNewName = ((array_key_exists('pageNewName',$arr)) ? $arr['pageNewName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $pageNewName = ((array_key_exists('pageNewName', $arr)) ? $arr['pageNewName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if(! $w['wiki']) {
- return array('message' => t('Wiki not found.'), 'success' => false);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (!$w['wiki']) {
+ return ['message' => t('Wiki not found.'), 'success' => false];
}
- $ic = q("select * from iconfig left join item on iconfig.iid = item.id
+ $ic = q("select * from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageNewName)
);
- if($ic) {
- return [ 'success' => false, 'message' => t('Destination name already exists') ];
+ if ($ic) {
+ return ['success' => false, 'message' => t('Destination name already exists')];
}
$ids = [];
- $ic = q("select *, item.id as item_id from iconfig left join item on iconfig.iid = item.id
+ $ic = q("select *, item.id as item_id from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
- if($ic) {
- foreach($ic as $c) {
- set_iconfig($c['item_id'],'nwikipage','pagetitle',$pageNewName);
+ if ($ic) {
+ foreach ($ic as $c) {
+ set_iconfig($c['item_id'], 'nwikipage', 'pagetitle', $pageNewName);
$ids[] = $c['item_id'];
}
@@ -154,105 +170,101 @@ class NativeWikiPage {
dbesc($pageNewName)
);
- $page = [
- 'rawName' => $pageNewName,
- 'htmlName' => escape_tags($pageNewName),
+ $page = [
+ 'rawName' => $pageNewName,
+ 'htmlName' => escape_tags($pageNewName),
//'urlName' => urlencode(escape_tags($pageNewName))
- 'urlName' => Zlib\NativeWiki::name_encode($pageNewName)
+ 'urlName' => NativeWiki::name_encode($pageNewName)
];
- return [ 'success' => true, 'page' => $page ];
+ return ['success' => true, 'page' => $page];
}
- return [ 'success' => false, 'message' => t('Page not found') ];
-
+ return ['success' => false, 'message' => t('Page not found')];
+
}
static public function get_page_content($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? intval($arr['channel_id']) : 0);
- $revision = ((array_key_exists('revision',$arr)) ? intval($arr['revision']) : (-1));
-
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? intval($arr['channel_id']) : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if (! $w['wiki']) {
- return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (!$w['wiki']) {
+ return ['content' => null, 'message' => 'Error reading wiki', 'success' => false];
}
$item = self::load_page($arr);
- if($item) {
+ if ($item) {
$content = $item['body'];
- return [
+ return [
'content' => $content,
'mimeType' => $w['mimeType'],
- 'pageMimeType' => $item['mimetype'],
- 'message' => '',
+ 'pageMimeType' => $item['mimetype'],
+ 'message' => '',
'success' => true
];
}
-
- return array('content' => null, 'message' => t('Error reading page content'), 'success' => false);
+
+ return ['content' => null, 'message' => t('Error reading page content'), 'success' => false];
}
static public function page_history($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
- return array('history' => null, 'message' => 'Error reading wiki', 'success' => false);
+ return ['history' => null, 'message' => 'Error reading wiki', 'success' => false];
}
$items = self::load_page_history($arr);
$history = [];
- if($items) {
+ if ($items) {
$processed = 0;
- foreach($items as $item) {
- if($processed > 1000)
+ foreach ($items as $item) {
+ if ($processed > 1000)
break;
- $processed ++;
- $history[] = [
+ $processed++;
+ $history[] = [
'revision' => $item['revision'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$item['edited']),
- 'name' => $item['author']['xchan_name'],
- 'title' => get_iconfig($item,'nwikipage','commit_msg')
+ 'date' => datetime_convert('UTC', date_default_timezone_get(), $item['edited']),
+ 'name' => $item['author']['xchan_name'],
+ 'title' => get_iconfig($item, 'nwikipage', 'commit_msg')
];
}
- return [ 'success' => true, 'history' => $history ];
+ return ['success' => true, 'history' => $history];
}
- return [ 'success' => false ];
+ return ['success' => false];
}
-
+
static public function load_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : (-1));
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
+ $revision = ((array_key_exists('revision', $arr)) ? $arr['revision'] : (-1));
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if (! $w['wiki']) {
- return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
+ if (!$w['wiki']) {
+ return ['content' => null, 'message' => 'Error reading wiki', 'success' => false];
}
$ids = '';
@@ -262,32 +274,32 @@ class NativeWikiPage {
dbesc($pageUrlName)
);
- if($ic) {
- foreach($ic as $c) {
- if($ids)
+ if ($ic) {
+ foreach ($ic as $c) {
+ if ($ids)
$ids .= ',';
$ids .= intval($c['iid']);
}
}
- $sql_extra = item_permissions_sql($channel_id,$observer_hash);
+ $sql_extra = item_permissions_sql($channel_id, $observer_hash);
- if($revision == (-1))
+ if ($revision == (-1))
$sql_extra .= " order by revision desc ";
- elseif($revision)
+ elseif ($revision)
$sql_extra .= " and revision = " . intval($revision) . " ";
$r = null;
- if($ids) {
+ if ($ids) {
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and id in ( $ids ) $sql_extra limit 1",
dbesc($resource_id),
intval($channel_id)
);
- if($r) {
- $items = fetch_post_tags($r,true);
+ if ($r) {
+ $items = fetch_post_tags($r, true);
return $items[0];
}
}
@@ -298,15 +310,14 @@ class NativeWikiPage {
static public function load_page_history($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : (-1));
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if (! $w['wiki']) {
- return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (!$w['wiki']) {
+ return ['content' => null, 'message' => 'Error reading wiki', 'success' => false];
}
$ids = '';
@@ -315,28 +326,28 @@ class NativeWikiPage {
intval($channel_id),
dbesc($pageUrlName)
);
-
- if($ic) {
- foreach($ic as $c) {
- if($ids)
+
+ if ($ic) {
+ foreach ($ic as $c) {
+ if ($ids)
$ids .= ',';
$ids .= intval($c['iid']);
}
}
- $sql_extra = item_permissions_sql($channel_id,$observer_hash);
+ $sql_extra = item_permissions_sql($channel_id, $observer_hash);
$sql_extra .= " order by revision desc ";
$r = null;
- if($ids) {
+ if ($ids) {
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and id in ( $ids ) and item_deleted = 0 $sql_extra",
dbesc($resource_id),
intval($channel_id)
);
- if($r) {
+ if ($r) {
xchan_query($r);
- $items = fetch_post_tags($r,true);
+ $items = fetch_post_tags($r, true);
return $items;
}
}
@@ -346,31 +357,30 @@ class NativeWikiPage {
static public function save_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $content = ((array_key_exists('content',$arr)) ? $arr['content'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $content = ((array_key_exists('content', $arr)) ? $arr['content'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
- return array('message' => t('Error reading wiki'), 'success' => false);
+ return ['message' => t('Error reading wiki'), 'success' => false];
}
-
- // fetch the most recently saved revision.
+
+ // fetch the most recently saved revision.
$item = self::load_page($arr);
- if(! $item) {
- return array('message' => t('Page not found'), 'success' => false);
+ if (!$item) {
+ return ['message' => t('Page not found'), 'success' => false];
}
$mimetype = $item['mimetype'];
- // change just the fields we need to change to create a revision;
+ // change just the fields we need to change to create a revision;
unset($item['id']);
unset($item['author']);
@@ -381,8 +391,8 @@ class NativeWikiPage {
$item['edited'] = datetime_convert();
$item['mimetype'] = $mimetype;
- if($item['iconfig'] && is_array($item['iconfig']) && count($item['iconfig'])) {
- for($x = 0; $x < count($item['iconfig']); $x ++) {
+ if ($item['iconfig'] && is_array($item['iconfig']) && count($item['iconfig'])) {
+ for ($x = 0; $x < count($item['iconfig']); $x++) {
unset($item['iconfig'][$x]['id']);
unset($item['iconfig'][$x]['iid']);
}
@@ -390,168 +400,164 @@ class NativeWikiPage {
$ret = item_store($item, false, false);
- if($ret['item_id'])
- return array('message' => '', 'item_id' => $ret['item_id'], 'filename' => $pageUrlName, 'success' => true);
+ if ($ret['item_id'])
+ return ['message' => '', 'item_id' => $ret['item_id'], 'filename' => $pageUrlName, 'success' => true];
else
- return array('message' => t('Page update failed.'), 'success' => false);
- }
+ return ['message' => t('Page update failed.'), 'success' => false];
+ }
static public function delete_page($arr) {
- $pageUrlName = (array_key_exists('pageUrlName',$arr) ? $arr['pageUrlName'] : '');
- $resource_id = (array_key_exists('resource_id',$arr) ? $arr['resource_id'] : '');
- $observer_hash = (array_key_exists('observer_hash',$arr) ? $arr['observer_hash'] : '');
- $channel_id = (array_key_exists('channel_id',$arr) ? $arr['channel_id'] : 0);
+ $pageUrlName = (array_key_exists('pageUrlName', $arr) ? $arr['pageUrlName'] : '');
+ $resource_id = (array_key_exists('resource_id', $arr) ? $arr['resource_id'] : '');
+ $observer_hash = (array_key_exists('observer_hash', $arr) ? $arr['observer_hash'] : '');
+ $channel_id = (array_key_exists('channel_id', $arr) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if(! $w['wiki']) {
- return [ 'success' => false, 'message' => t('Error reading wiki') ];
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (!$w['wiki']) {
+ return ['success' => false, 'message' => t('Error reading wiki')];
}
$ids = [];
- $ic = q("select * from iconfig left join item on iconfig.iid = item.id
+ $ic = q("select * from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
- if($ic) {
- foreach($ic as $c) {
+ if ($ic) {
+ foreach ($ic as $c) {
$ids[] = intval($c['iid']);
}
}
- if($ids) {
+ if ($ids) {
drop_items($ids, true, DROPITEM_PHASE1);
- return [ 'success' => true ];
+ return ['success' => true];
}
- return [ 'success' => false, 'message' => t('Nothing deleted') ];
+ return ['success' => false, 'message' => t('Nothing deleted')];
}
-
+
static public function revert_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $commitHash = ((array_key_exists('commitHash',$arr)) ? $arr['commitHash'] : null);
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $commitHash = ((array_key_exists('commitHash', $arr)) ? $arr['commitHash'] : null);
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- if (! $commitHash) {
- return array('message' => 'No commit was provided', 'success' => false);
+ if (!$commitHash) {
+ return ['message' => 'No commit was provided', 'success' => false];
}
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
- return array('message' => 'Error reading wiki', 'success' => false);
+ return ['message' => 'Error reading wiki', 'success' => false];
}
$x = $arr;
- if(intval($commitHash) > 0) {
+ if (intval($commitHash) > 0) {
unset($x['commitHash']);
$x['revision'] = intval($commitHash) - 1;
- $loaded = self::load_page($x);
+ $loaded = self::load_page($x);
- if($loaded) {
+ if ($loaded) {
$content = $loaded['body'];
- return [ 'content' => $content, 'success' => true ];
+ return ['content' => $content, 'success' => true];
}
- return [ 'success' => false ];
+ return ['success' => false];
}
}
-
+
static public function compare_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
- $currentCommit = ((array_key_exists('currentCommit',$arr)) ? $arr['currentCommit'] : (-1));
- $compareCommit = ((array_key_exists('compareCommit',$arr)) ? $arr['compareCommit'] : 0);
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+ $compareCommit = ((array_key_exists('compareCommit', $arr)) ? $arr['compareCommit'] : 0);
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
- return array('message' => t('Error reading wiki'), 'success' => false);
+ return ['message' => t('Error reading wiki'), 'success' => false];
}
- $x = $arr;
+ $x = $arr;
$x['revision'] = (-1);
$currpage = self::load_page($x);
- if($currpage)
+ if ($currpage)
$currentContent = $currpage['body'];
$x['revision'] = $compareCommit;
- $comppage = self::load_page($x);
- if($comppage)
+ $comppage = self::load_page($x);
+ if ($comppage)
$compareContent = $comppage['body'];
- if($currpage && $comppage) {
+ if ($currpage && $comppage) {
require_once('library/class.Diff.php');
$diff = \Diff::toTable(\Diff::compare($currentContent, $compareContent));
- return [ 'success' => true, 'diff' => $diff ];
+ return ['success' => true, 'diff' => $diff];
}
- return [ 'success' => false, 'message' => t('Compare: object not found.') ];
+ return ['success' => false, 'message' => t('Compare: object not found.')];
}
-
+
static public function commit($arr) {
- $commit_msg = ((array_key_exists('commit_msg', $arr)) ? $arr['commit_msg'] : t('Page updated'));
- $observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
- $channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : t('Untitled'));
+ $commit_msg = ((array_key_exists('commit_msg', $arr)) ? $arr['commit_msg'] : t('Page updated'));
+ $observer_hash = ((array_key_exists('observer_hash', $arr)) ? $arr['observer_hash'] : '');
+ $channel_id = ((array_key_exists('channel_id', $arr)) ? $arr['channel_id'] : 0);
- if(array_key_exists('resource_id', $arr)) {
+ if (array_key_exists('resource_id', $arr)) {
$resource_id = $arr['resource_id'];
}
else {
- return array('message' => t('Wiki resource_id required for git commit'), 'success' => false);
+ return ['message' => t('Wiki resource_id required for git commit'), 'success' => false];
}
- $w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
- if (! $w['wiki']) {
- return array('message' => t('Error reading wiki'), 'success' => false);
+ $w = NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (!$w['wiki']) {
+ return ['message' => t('Error reading wiki'), 'success' => false];
}
$page = self::load_page($arr);
- if($page) {
- set_iconfig($page['id'],'nwikipage','commit_msg',escape_tags($commit_msg),true);
- return [ 'success' => true, 'item_id' => $page['id'], 'page' => $page ];
+ if ($page) {
+ set_iconfig($page['id'], 'nwikipage', 'commit_msg', escape_tags($commit_msg), true);
+ return ['success' => true, 'item_id' => $page['id'], 'page' => $page];
}
- return [ 'success' => false, 'message' => t('Page not found.') ];
+ return ['success' => false, 'message' => t('Page not found.')];
}
-
+
static public function convert_links($s, $wikiURL) {
-
- if (strpos($s,'[[') !== false) {
+
+ if (strpos($s, '[[') !== false) {
preg_match_all("/\[\[(.*?)\]\]/", $s, $match);
- $pages = $pageURLs = array();
+ $pages = $pageURLs = [];
foreach ($match[1] as $m) {
// TODO: Why do we need to double urlencode for this to work?
//$pageURLs[] = urlencode(urlencode(escape_tags($m)));
- $titleUri = explode('|',$m);
- $page = $titleUri[0] ?? '';
- $title = $titleUri[1] ?? $page;
- $pageURLs[] = Zlib\NativeWiki::name_encode(escape_tags($page));
- $pages[] = $title;
+ $titleUri = explode('|', $m);
+ $page = $titleUri[0] ?? '';
+ $title = $titleUri[1] ?? $page;
+ $pageURLs[] = NativeWiki::name_encode(escape_tags($page));
+ $pages[] = $title;
}
$idx = 0;
- while(strpos($s,'[[') !== false) {
- $replace = '<a href="'.$wikiURL.'/'.$pageURLs[$idx].'">'.$pages[$idx].'</a>';
- $s = preg_replace("/\[\[(.*?)\]\]/", $replace, $s, 1);
+ while (strpos($s, '[[') !== false) {
+ $replace = '<a href="' . $wikiURL . '/' . $pageURLs[$idx] . '">' . $pages[$idx] . '</a>';
+ $s = preg_replace("/\[\[(.*?)\]\]/", $replace, $s, 1);
$idx++;
}
}
@@ -564,21 +570,21 @@ class NativeWikiPage {
$resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
$pageHistory = self::page_history([
- 'channel_id' => \App::$profile_uid,
+ 'channel_id' => App::$profile_uid,
'observer_hash' => get_observer_hash(),
'resource_id' => $resource_id,
'pageUrlName' => $pageUrlName
]);
- return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
+ return replace_macros(get_markup_template('nwiki_page_history.tpl'), [
'$pageHistory' => $pageHistory['history'],
'$permsWrite' => $arr['permsWrite'],
'$name_lbl' => t('Name'),
- '$msg_label' => t('Message','wiki_history'),
+ '$msg_label' => t('Message', 'wiki_history'),
'$date_lbl' => t('Date'),
'$revert_btn' => t('Revert'),
'$compare_btn' => t('Compare')
- ));
+ ]);
}
@@ -590,14 +596,14 @@ class NativeWikiPage {
* @return string
*/
static public function generate_toc($s) {
- if (strpos($s,'[toc]') !== false) {
+ if (strpos($s, '[toc]') !== false) {
//$toc_md = wiki_toc($s); // Generate Markdown-formatted list prior to HTML render
$toc_md = '<ul id="wiki-toc"></ul>'; // use the available jQuery plugin http://ndabas.github.io/toc/
- $s = preg_replace("/\[toc\]/", $toc_md, $s, -1);
+ $s = preg_replace("/\[toc\]/", $toc_md, $s, -1);
}
return $s;
}
-
+
/**
* Converts a select set of bbcode tags. Much of the code is copied from include/bbcode.php
@@ -605,27 +611,27 @@ class NativeWikiPage {
* @return string
*/
static public function bbcode($s) {
-
- $s = str_replace(array('[baseurl]', '[sitename]'), array(z_root(), get_config('system', 'sitename')), $s);
-
- $s = preg_replace_callback("/\[observer\.language\=(.*?)\](.*?)\[\/observer\]/ism",'oblanguage_callback', $s);
- $s = preg_replace_callback("/\[observer\.language\!\=(.*?)\](.*?)\[\/observer\]/ism",'oblanguage_necallback', $s);
+ $s = str_replace(['[baseurl]', '[sitename]'], [z_root(), get_config('system', 'sitename')], $s);
+
+ $s = preg_replace_callback("/\[observer\.language\=(.*?)\](.*?)\[\/observer\]/ism", 'oblanguage_callback', $s);
+ $s = preg_replace_callback("/\[observer\.language\!\=(.*?)\](.*?)\[\/observer\]/ism", 'oblanguage_necallback', $s);
- $observer = \App::get_observer();
+
+ $observer = App::get_observer();
if ($observer) {
- $s1 = '<span class="bb_observer" title="' . t('Different viewers will see this text differently') . '">';
- $s2 = '</span>';
+ $s1 = '<span class="bb_observer" title="' . t('Different viewers will see this text differently') . '">';
+ $s2 = '</span>';
$obsBaseURL = $observer['xchan_connurl'];
$obsBaseURL = preg_replace("/\/poco\/.*$/", '', $obsBaseURL);
- $s = str_replace('[observer.baseurl]', $obsBaseURL, $s);
- $s = str_replace('[observer.url]', $observer['xchan_url'], $s);
- $s = str_replace('[observer.name]', $s1 . $observer['xchan_name'] . $s2, $s);
- $s = str_replace('[observer.address]', $s1 . $observer['xchan_addr'] . $s2, $s);
- $s = str_replace('[observer.webname]', substr($observer['xchan_addr'], 0, strpos($observer['xchan_addr'], '@')), $s);
- $s = str_replace('[observer.photo]', '', $s);
- }
+ $s = str_replace('[observer.baseurl]', $obsBaseURL, $s);
+ $s = str_replace('[observer.url]', $observer['xchan_url'], $s);
+ $s = str_replace('[observer.name]', $s1 . $observer['xchan_name'] . $s2, $s);
+ $s = str_replace('[observer.address]', $s1 . $observer['xchan_addr'] . $s2, $s);
+ $s = str_replace('[observer.webname]', substr($observer['xchan_addr'], 0, strpos($observer['xchan_addr'], '@')), $s);
+ $s = str_replace('[observer.photo]', '', $s);
+ }
else {
$s = str_replace('[observer.baseurl]', '', $s);
$s = str_replace('[observer.url]', '', $s);
@@ -637,62 +643,63 @@ class NativeWikiPage {
return $s;
}
-
+
static public function get_file_ext($arr) {
- if($arr['mimetype'] === 'text/bbcode')
+ if ($arr['mimetype'] === 'text/bbcode')
return '.bb';
- elseif($arr['mimetype'] === 'text/markdown')
+ elseif ($arr['mimetype'] === 'text/markdown')
return '.md';
- elseif($arr['mimetype'] === 'text/plain')
+ elseif ($arr['mimetype'] === 'text/plain')
return '.txt';
}
-
- // This function is derived from
+
+ // This function is derived from
// http://stackoverflow.com/questions/32068537/generate-table-of-contents-from-markdown-in-php
static public function toc($content) {
- // ensure using only "\n" as line-break
- $source = str_replace(["\r\n", "\r"], "\n", $content);
-
- // look for markdown TOC items
- preg_match_all(
- '/^(?:=|-|#).*$/m',
- $source,
- $matches,
- PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE
- );
-
- // preprocess: iterate matched lines to create an array of items
- // where each item is an array(level, text)
- $file_size = strlen($source);
- foreach ($matches[0] as $item) {
- $found_mark = substr($item[0], 0, 1);
- if ($found_mark == '#') {
- // text is the found item
- $item_text = $item[0];
- $item_level = strrpos($item_text, '#') + 1;
- $item_text = substr($item_text, $item_level);
- } else {
- // text is the previous line (empty if <hr>)
- $item_offset = $item[1];
- $prev_line_offset = strrpos($source, "\n", -($file_size - $item_offset + 2));
- $item_text =
- substr($source, $prev_line_offset, $item_offset - $prev_line_offset - 1);
- $item_text = trim($item_text);
- $item_level = $found_mark == '=' ? 1 : 2;
- }
- if (!trim($item_text) OR strpos($item_text, '|') !== FALSE) {
- // item is an horizontal separator or a table header, don't mind
- continue;
- }
- $raw_toc[] = ['level' => $item_level, 'text' => trim($item_text)];
- }
+ // ensure using only "\n" as line-break
+ $source = str_replace(["\r\n", "\r"], "\n", $content);
+
+ // look for markdown TOC items
+ preg_match_all(
+ '/^(?:=|-|#).*$/m',
+ $source,
+ $matches,
+ PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE
+ );
+
+ // preprocess: iterate matched lines to create an array of items
+ // where each item is an array(level, text)
+ $file_size = strlen($source);
+ foreach ($matches[0] as $item) {
+ $found_mark = substr($item[0], 0, 1);
+ if ($found_mark == '#') {
+ // text is the found item
+ $item_text = $item[0];
+ $item_level = strrpos($item_text, '#') + 1;
+ $item_text = substr($item_text, $item_level);
+ }
+ else {
+ // text is the previous line (empty if <hr>)
+ $item_offset = $item[1];
+ $prev_line_offset = strrpos($source, "\n", -($file_size - $item_offset + 2));
+ $item_text =
+ substr($source, $prev_line_offset, $item_offset - $prev_line_offset - 1);
+ $item_text = trim($item_text);
+ $item_level = $found_mark == '=' ? 1 : 2;
+ }
+ if (!trim($item_text) or strpos($item_text, '|') !== FALSE) {
+ // item is an horizontal separator or a table header, don't mind
+ continue;
+ }
+ $raw_toc[] = ['level' => $item_level, 'text' => trim($item_text)];
+ }
$o = '';
- foreach($raw_toc as $t) {
+ foreach ($raw_toc as $t) {
$level = intval($t['level']);
- $text = $t['text'];
+ $text = $t['text'];
switch ($level) {
case 1:
$li = '* ';
@@ -712,7 +719,7 @@ class NativeWikiPage {
}
$o .= $li . $text . "\n";
}
- return $o;
+ return $o;
}
}
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index 765131f0d..80340f501 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -2,6 +2,8 @@
namespace Zotlabs\Lib;
+use App;
+
/**
* @brief Class for handling channel specific configurations.
*
@@ -32,15 +34,15 @@ class PConfig {
if(is_null($uid) || $uid === false)
return false;
- if(! is_array(\App::$config)) {
+ if(! is_array(App::$config)) {
btlogger('App::$config not an array');
}
- if(! array_key_exists($uid, \App::$config)) {
- \App::$config[$uid] = array();
+ if(! array_key_exists($uid, App::$config)) {
+ App::$config[$uid] = array();
}
- if(! is_array(\App::$config[$uid])) {
+ if(! is_array(App::$config[$uid])) {
btlogger('App::$config[$uid] not an array: ' . $uid);
}
@@ -52,12 +54,12 @@ class PConfig {
foreach($r as $rr) {
$k = $rr['k'];
$c = $rr['cat'];
- if(! array_key_exists($c, \App::$config[$uid])) {
- \App::$config[$uid][$c] = array();
- \App::$config[$uid][$c]['config_loaded'] = true;
+ if(! array_key_exists($c, App::$config[$uid])) {
+ App::$config[$uid][$c] = array();
+ App::$config[$uid][$c]['config_loaded'] = true;
}
- \App::$config[$uid][$c][$k] = $rr['v'];
- \App::$config[$uid][$c]['pcfgud:'.$k] = $rr['updated'];
+ App::$config[$uid][$c][$k] = $rr['v'];
+ App::$config[$uid][$c]['pcfgud:'.$k] = $rr['updated'];
}
}
}
@@ -86,15 +88,15 @@ class PConfig {
if(is_null($uid) || $uid === false)
return $default;
- if(! array_key_exists($uid, \App::$config))
+ if(! array_key_exists($uid, App::$config))
self::Load($uid);
- if((! array_key_exists($family, \App::$config[$uid])) || (! array_key_exists($key, \App::$config[$uid][$family])))
+ if((! array_key_exists($family, App::$config[$uid])) || (! array_key_exists($key, App::$config[$uid][$family])))
return $default;
- return ((! is_array(\App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$uid][$family][$key]))
- ? unserialize(\App::$config[$uid][$family][$key])
- : \App::$config[$uid][$family][$key]
+ return ((! is_array(App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', App::$config[$uid][$family][$key]))
+ ? unserialize(App::$config[$uid][$family][$key])
+ : App::$config[$uid][$family][$key]
);
}
@@ -133,6 +135,7 @@ class PConfig {
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
$new = false;
+ $update = false;
$now = datetime_convert();
if (! $updated) {
@@ -143,23 +146,22 @@ class PConfig {
$updated = datetime_convert('UTC','UTC','-2 seconds');
}
- $hash = hash('sha256',$family.':'.$key);
+ $hash = gen_link_id($family.':'.$key);
if (self::Get($uid, 'hz_delpconfig', $hash) !== false) {
if (self::Get($uid, 'hz_delpconfig', $hash) > $now) {
logger('Refusing to update pconfig with outdated info (Item deleted more recently).', LOGGER_NORMAL, LOG_ERR);
return self::Get($uid,$family,$key);
} else {
- self::Delete($uid,'hz_delpconfig',$hash);
+ self::Delete($uid, 'hz_delpconfig', $hash);
}
}
if(self::Get($uid, $family, $key) === false) {
- if(! array_key_exists($uid, \App::$config))
- \App::$config[$uid] = array();
- if(! array_key_exists($family, \App::$config[$uid]))
- \App::$config[$uid][$family] = array();
-
+ if(! array_key_exists($uid, App::$config))
+ App::$config[$uid] = array();
+ if(! array_key_exists($family, App::$config[$uid]))
+ App::$config[$uid][$family] = array();
$ret = q("INSERT INTO pconfig ( uid, cat, k, v, updated ) VALUES ( %d, '%s', '%s', '%s', '%s' ) ",
intval($uid),
@@ -177,13 +179,14 @@ class PConfig {
logger("Error: Insert to pconfig failed.",LOGGER_NORMAL, LOG_ERR);
}
- \App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
+ $new = true;
+ App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
}
else {
- $new = (\App::$config[$uid][$family]['pcfgud:'.$key] < $now);
+ $update = (App::$config[$uid][$family]['pcfgud:'.$key] < $now);
- if ($new) {
+ if ($update) {
// @NOTE There is still a possible race condition under limited circumstances
// where a value will be updated by another thread with more current data than
@@ -198,7 +201,7 @@ class PConfig {
dbesc($key)
);
- \App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
+ App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
} else {
logger('Refusing to update pconfig with outdated info.', LOGGER_NORMAL, LOG_ERR);
@@ -211,16 +214,16 @@ class PConfig {
// set in the life of this page. We need this to
// synchronise channel clones.
- if(! array_key_exists('transient', \App::$config[$uid]))
- \App::$config[$uid]['transient'] = array();
- if(! array_key_exists($family, \App::$config[$uid]['transient']))
- \App::$config[$uid]['transient'][$family] = array();
+ if(! array_key_exists('transient', App::$config[$uid]))
+ App::$config[$uid]['transient'] = array();
+ if(! array_key_exists($family, App::$config[$uid]['transient']))
+ App::$config[$uid]['transient'][$family] = array();
- \App::$config[$uid][$family][$key] = $value;
+ App::$config[$uid][$family][$key] = $value;
- if ($new) {
- \App::$config[$uid]['transient'][$family][$key] = $value;
- \App::$config[$uid]['transient'][$family]['pcfgud:'.$key] = $updated;
+ if ($new || $update) {
+ App::$config[$uid]['transient'][$family][$key] = $value;
+ App::$config[$uid]['transient'][$family]['pcfgud:'.$key] = $updated;
}
if($ret)
@@ -253,7 +256,7 @@ class PConfig {
$updated = ($updated) ? $updated : datetime_convert('UTC','UTC','-2 seconds');
$now = datetime_convert();
- $newer = (\App::$config[$uid][$family]['pcfgud:'.$key] < $now);
+ $newer = (App::$config[$uid][$family]['pcfgud:'.$key] < $now);
if (! $newer) {
logger('Refusing to delete pconfig with outdated delete request.', LOGGER_NORMAL, LOG_ERR);
@@ -262,12 +265,12 @@ class PConfig {
$ret = false;
- if (isset(\App::$config[$uid][$family][$key])) {
- unset(\App::$config[$uid][$family][$key]);
+ if (isset(App::$config[$uid][$family][$key])) {
+ unset(App::$config[$uid][$family][$key]);
}
- if (isset(\App::$config[$uid][$family]['pcfgud:'.$key])) {
- unset(\App::$config[$uid][$family]['pcfgud:'.$key]);
+ if (isset(App::$config[$uid][$family]['pcfgud:'.$key])) {
+ unset(App::$config[$uid][$family]['pcfgud:'.$key]);
}
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
@@ -278,9 +281,9 @@ class PConfig {
// Synchronize delete with clones.
- if ($family != 'hz_delpconfig') {
- $hash = hash('sha256',$family.':'.$key);
- set_pconfig($uid,'hz_delpconfig',$hash,$updated);
+ if ($family !== 'hz_delpconfig') {
+ $hash = gen_link_id($family.':'.$key);
+ set_pconfig($uid, 'hz_delpconfig', $hash, $updated);
}
return $ret;
diff --git a/Zotlabs/Lib/Permcat.php b/Zotlabs/Lib/Permcat.php
index ca4aed9ed..bda35a9cb 100644
--- a/Zotlabs/Lib/Permcat.php
+++ b/Zotlabs/Lib/Permcat.php
@@ -4,6 +4,8 @@ namespace Zotlabs\Lib;
use Zotlabs\Access\PermissionRoles;
use Zotlabs\Access\Permissions;
+use Zotlabs\Lib\Libsync;
+use Zotlabs\Daemon\Master;
/**
* @brief Permission Categories. Permission rules for various classes of connections.
@@ -79,8 +81,9 @@ class Permcat {
$this->permcats[] = [
'name' => 'default',
- 'localname' => t('default','permcat'),
+ 'localname' => t('Default','permcat'),
'perms' => Permissions::Operms($perms),
+ 'raw_perms' => $perms,
'system' => 1
];
@@ -92,6 +95,7 @@ class Permcat {
'name' => $p[$x][0],
'localname' => $p[$x][1],
'perms' => Permissions::Operms(Permissions::FilledPerms($p[$x][2])),
+ 'raw_perms' => Permissions::FilledPerms($p[$x][2]),
'system' => intval($p[$x][3])
];
}
@@ -128,27 +132,24 @@ class Permcat {
}
public function load_permcats($uid) {
-
+/*
$permcats = [
- [ 'follower', t('follower','permcat'),
- [ 'view_stream','view_profile','view_contacts','view_storage','view_pages','view_wiki',
- 'post_like' ], 1
+ [ 'contributor', t('Contributor','permcat'),
+ [ 'view_stream','view_profile','view_contacts','view_storage','view_pages',
+ 'write_storage','post_wall','write_pages','write_wiki','post_comments', 'post_mail', 'post_like',
+ 'chat' ], 1
],
- [ 'contributor', t('contributor','permcat'),
+ [ 'muted', t('Muted','permcat'),
[ 'view_stream','view_profile','view_contacts','view_storage','view_pages','view_wiki',
- 'post_wall','post_comments','write_wiki','post_like','tag_deliver','chat' ], 1
+ 'post_comments','write_wiki','post_like' ], 1
],
- [ 'publisher', t('publisher','permcat'),
- [ 'view_stream','view_profile','view_contacts','view_storage','view_pages',
- 'write_storage','post_wall','write_pages','write_wiki','post_comments','post_like','tag_deliver',
- 'chat', 'republish' ], 1
- ]
];
-
+*/
if($uid) {
$x = q("select * from pconfig where uid = %d and cat = 'permcat'",
intval($uid)
);
+
if($x) {
foreach($x as $xv) {
$value = ((preg_match('|^a:[0-9]+:{.*}$|s', $xv['v'])) ? unserialize($xv['v']) : $xv['v']);
@@ -183,4 +184,105 @@ class Permcat {
PConfig::Delete($channel_id, 'permcat', $name);
}
-} \ No newline at end of file
+ /**
+ * @brief assign a contact role to contacts
+ *
+ * @param int $channel_id
+ * @param string $role the name of the role
+ * @param array $contacts an array of contact hashes
+ */
+ public static function assign($channel, $role, $contacts) {
+
+ if(!isset($channel['channel_id'])) {
+ return;
+ }
+
+ if(!is_array($contacts) || empty($contacts)) {
+ return;
+ }
+
+ if(!$role) {
+ // lookup the default
+ $role = get_pconfig($channel_id, 'system', 'default_permcat', 'default');
+ }
+
+
+ // Doublecheck that we do not assign a role to ourself.
+ // It does not make a difference but could be confusing.
+ if (in_array($channel['channel_hash'], $contacts)) {
+ $contacts = array_diff($contacts, [$channel['channel_hash']]);
+ }
+
+ $all_perms = Permissions::Perms();
+ $permcats = new Permcat($channel['channel_id']);
+ $role_perms = $permcats->fetch($role);
+
+ if (isset($role_perms['error'])) {
+ return false;
+ }
+
+ $perms = $role_perms['raw_perms'];
+
+ $values_sql = '';
+ stringify_array_elms($contacts, true);
+
+ if ($all_perms && $perms) {
+
+ foreach ($contacts as $contact) {
+ foreach ($all_perms as $perm => $desc) {
+ if (array_key_exists($perm, $perms)) {
+ $values_sql .= " (" . intval($channel['channel_id']) . ", " . protect_sprintf($contact) . ", 'my_perms', '" . dbesc($perm) . "', " . intval($perms[$perm]) . "),";
+ }
+ else {
+ $values_sql .= " (" . intval($channel['channel_id']) . ", " . protect_sprintf($contact) . ", 'my_perms', '" . dbesc($perm) . "', 0), ";
+ }
+ }
+ }
+ }
+
+ $values_sql = rtrim($values_sql, ',');
+
+ dbq("DELETE FROM abconfig WHERE chan = " . intval($channel['channel_id']) . " AND cat = 'my_perms' AND xchan IN (" . protect_sprintf(implode(',', $contacts)) . ")");
+
+ dbq("INSERT INTO abconfig ( chan, xchan, cat, k, v ) VALUES $values_sql");
+
+ q("UPDATE abook SET abook_role = '%s'
+ WHERE abook_xchan IN (" . protect_sprintf(implode(',', $contacts)) . ") AND abook_channel = %d",
+ dbesc($role),
+ intval($channel['channel_id'])
+ );
+
+ $r = q("SELECT abook.*, xchan.* FROM abook LEFT JOIN xchan ON abook.abook_xchan = xchan.xchan_hash WHERE abook.abook_xchan IN (" . protect_sprintf(implode(',', $contacts)) . ") AND abook.abook_channel = %d AND abook_self = 0",
+ intval($channel['channel_id'])
+ );
+
+ foreach ($r as $rr) {
+
+ if (intval($rr['abook_self'])) {
+ continue;
+ }
+
+ Master::Summon([
+ 'Notifier',
+ 'permission_update',
+ $rr['abook_id']
+ ]);
+
+ $clone = $rr;
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($channel['channel_id'], $clone['abook_xchan']);
+ if ($abconfig)
+ $clone['abconfig'] = $abconfig;
+
+ Libsync::build_sync_packet(0 /* use the current local_channel */, ['abook' => [$clone]]);
+
+ }
+
+ return true;
+ }
+
+}
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index cd54fea17..4675df04e 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -3,6 +3,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Apps;
+use Zotlabs\Access\AccessList;
require_once('include/text.php');
@@ -58,6 +59,9 @@ class ThreadItem {
$child = new ThreadItem($item);
$this->add_child($child);
}
+
+ // performance: we have already added the children
+ unset($this->data['children']);
}
// allow a site to configure the order and content of the reaction emoji list
@@ -98,11 +102,20 @@ class ThreadItem {
$conv = $this->get_conversation();
$observer = $conv->get_observer();
- $lock = (((intval($item['item_private'])) || (($item['uid'] == local_channel()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
- || strlen($item['deny_cid']) || strlen($item['deny_gid']))))
- ? t('Private Message')
+ $acl = new AccessList(false);
+ $acl->set($item);
+
+ $lock = ((intval($item['item_private']) || ($item['uid'] == local_channel() && $acl->is_private()))
+ ? t('Restricted message')
: false);
- $locktype = $item['item_private'];
+
+ // 1 = restricted message, 2 = direct message
+ $locktype = intval($item['item_private']);
+ // 0 = limited based on public policy
+ if ($item['uid'] == local_channel() && intval($item['item_private']) && !$acl->is_private() && strlen($item['public_policy'])) {
+ $lock = t('Public Policy');
+ $locktype = 0;
+ }
$shareable = ((($conv->get_profile_owner() == local_channel() && local_channel()) && ($item['item_private'] != 1)) ? true : false);
@@ -110,6 +123,16 @@ class ThreadItem {
if($item['author']['xchan_network'] === 'rss')
$shareable = true;
+ // @fixme
+ // Have recently added code to properly handle polls in group reshares by redirecting all of the poll responses to the group.
+ // Sharing a poll using a regular embedded share is harder because the poll will need to fork. This is due to comment permissions.
+ // The original poll author may not accept responses from strangers. Forking the poll will receive responses from the sharer's
+ // followers, but there's no elegant way to merge these two sets of results together. For now, we'll disable sharing polls.
+
+ if ($item['obj_type'] === 'Question') {
+ $shareable = false;
+ }
+
$privacy_warning = false;
if(intval($item['item_private']) && ($item['owner']['xchan_network'] === 'activitypub')) {
$recips = get_iconfig($item['parent'], 'activitypub', 'recips');
@@ -401,6 +424,7 @@ class ThreadItem {
'mids' => $json_mids,
'parent' => $item['parent'],
'author_id' => (($item['author']['xchan_addr']) ? $item['author']['xchan_addr'] : $item['author']['xchan_url']),
+ 'author_is_group_actor' => (($item['author']['xchan_pubforum']) ? t('Forum') : ''),
'isevent' => $isevent,
'attend' => $attend,
'consensus' => $consensus,
diff --git a/Zotlabs/Lib/ZotURL.php b/Zotlabs/Lib/ZotURL.php
index 6bb01fd7a..db0071f72 100644
--- a/Zotlabs/Lib/ZotURL.php
+++ b/Zotlabs/Lib/ZotURL.php
@@ -87,4 +87,4 @@ class ZotURL {
return ids_to_array($r,'hubloc_url');
}
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index aeb02eeaa..5b37f2707 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -3,9 +3,9 @@
namespace Zotlabs\Module;
use Zotlabs\Lib\Libzotdir;
+use Zotlabs\Lib\AccessList;
require_once 'include/acl_selectors.php';
-require_once 'include/group.php';
/**
* @brief ACL selector json backend.
@@ -123,7 +123,7 @@ class Acl extends \Zotlabs\Web\Controller {
"name" => t('Profile','acl') . ' ' . $rv['profile_name'],
"id" => 'vp' . $rv['id'],
"xid" => 'vp.' . $rv['profile_guid'],
- "uids" => group_get_profile_members_xchan(local_channel(), $rv['id']),
+ "uids" => AccessList::profile_members_xchan(local_channel(), $rv['id']),
"link" => ''
);
}
@@ -146,14 +146,14 @@ class Acl extends \Zotlabs\Web\Controller {
if($r) {
foreach($r as $g){
- // logger('acl: group: ' . $g['gname'] . ' members: ' . group_get_members_xchan($g['id']));
+ // logger('acl: group: ' . $g['gname'] . ' members: ' . AccessList::members_xchan(local_channel(), $g['id']));
$groups[] = array(
"type" => "g",
"photo" => "images/twopeople.png",
"name" => $g['gname'],
"id" => $g['id'],
"xid" => $g['hash'],
- "uids" => group_get_members_xchan($g['id']),
+ "uids" => AccessList::members_xchan(local_channel(), $g['id']),
"link" => ''
);
}
diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php
index 76e117a84..00095187d 100644
--- a/Zotlabs/Module/Admin/Site.php
+++ b/Zotlabs/Module/Admin/Site.php
@@ -339,8 +339,8 @@ class Site {
// now invert the logic for the setting.
$discover_tab = (1 - $discover_tab);
- $perm_roles = \Zotlabs\Access\PermissionRoles::roles();
- $default_role = get_config('system','default_permissions_role','social');
+ $perm_roles = \Zotlabs\Access\PermissionRoles::channel_roles();
+ $default_role = get_config('system','default_permissions_role','personal');
$role = array('permissions_role' , t('Default permission role for new accounts'), $default_role, t('This role will be used for the first channel created after registration.'),$perm_roles);
diff --git a/Zotlabs/Module/Appman.php b/Zotlabs/Module/Appman.php
index 26e564aa5..d287115d4 100644
--- a/Zotlabs/Module/Appman.php
+++ b/Zotlabs/Module/Appman.php
@@ -55,8 +55,6 @@ class Appman extends \Zotlabs\Web\Controller {
if(Apps::app_installed(local_channel(),$papp))
info( t('App installed.') . EOL);
-hz_syslog('install: ' . print_r($papp,true));
-
$sync = q("SELECT * FROM app WHERE app_channel = %d AND app_id = '%s' LIMIT 1",
intval(local_channel()),
dbesc($papp['guid'])
diff --git a/Zotlabs/Module/Apschema.php b/Zotlabs/Module/Apschema.php
index eab82eb29..e8d45c522 100644
--- a/Zotlabs/Module/Apschema.php
+++ b/Zotlabs/Module/Apschema.php
@@ -14,7 +14,7 @@ class Apschema extends \Zotlabs\Web\Controller {
'zot' => z_root() . '/apschema#',
'id' => '@id',
'type' => '@type',
- 'commentPolicy' => 'as:commentPolicy',
+ 'commentPolicy' => 'zot:commentPolicy',
'meData' => 'zot:meData',
'meDataType' => 'zot:meDataType',
'meEncoding' => 'zot:meEncoding',
@@ -33,6 +33,9 @@ class Apschema extends \Zotlabs\Web\Controller {
'PropertyValue' => 'schema:PropertyValue',
'value' => 'schema:value',
+ 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers',
+
+
'magicEnv' => [
'@id' => 'zot:magicEnv',
'@type' => '@id'
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 6261a2f06..aebc70c15 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -66,8 +66,7 @@ class Channel extends Controller {
$sigdata = HTTPSig::verify(file_get_contents('php://input'), EMPTY_STR, 'zot6');
if ($sigdata && $sigdata['signer'] && $sigdata['header_valid']) {
- $data = json_encode(Libzot::zotinfo(['address' => $channel['channel_address'], 'target_url' => $sigdata['signer']]));
-
+ $data = json_encode(Libzot::zotinfo(['guid_hash' => $channel['channel_hash'], 'target_url' => $sigdata['signer']]));
$s = q("select site_crypto, hubloc_sitekey from site left join hubloc on hubloc_url = site_url where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
dbesc($sigdata['signer'])
);
@@ -96,6 +95,10 @@ class Channel extends Controller {
http_status_exit(410, 'Gone');
}
+ if (get_pconfig($channel['channel_id'], 'system', 'index_opt_out')) {
+ App::$meta->set('robots', 'noindex, noarchive');
+ }
+
if (ActivityStreams::is_as_request($channel)) {
// Somebody may attempt an ActivityStreams fetch on one of our message permalinks
diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php
index 5025f4e22..0f674965d 100644
--- a/Zotlabs/Module/Connections.php
+++ b/Zotlabs/Module/Connections.php
@@ -2,32 +2,32 @@
namespace Zotlabs\Module;
use App;
+use Zotlabs\Lib\Permcat;
require_once('include/socgraph.php');
require_once('include/selectors.php');
-require_once('include/group.php');
class Connections extends \Zotlabs\Web\Controller {
function init() {
-
+
if(! local_channel())
return;
App::$profile_uid = local_channel();
-
+
$channel = App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
-
+
}
-
+
function get() {
-
+
$sort_type = 0;
$o = '';
-
-
+
+
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return login();
@@ -44,13 +44,13 @@ class Connections extends \Zotlabs\Web\Controller {
$pending = false;
$unconnected = false;
$all = false;
-
+
if(! $_REQUEST['aj'])
$_SESSION['return_url'] = App::$query_string;
-
+
$search_flags = "";
$head = '';
-
+
if(argc() == 2) {
switch(argv(1)) {
case 'active':
@@ -106,7 +106,7 @@ class Connections extends \Zotlabs\Web\Controller {
// $head = t('Unconnected');
// $unconnected = true;
// break;
-
+
case 'all':
$head = t('All');
break;
@@ -115,19 +115,19 @@ class Connections extends \Zotlabs\Web\Controller {
$active = true;
$head = t('Active');
break;
-
+
}
-
+
$sql_extra = $search_flags;
if(argv(1) === 'pending')
$sql_extra .= " and abook_ignored = 0 ";
-
+
}
else {
$sql_extra = " and abook_blocked = 0 ";
$unblocked = true;
}
-
+
switch($_REQUEST['order']) {
case 'name_desc':
$sql_order = 'xchan_name DESC';
@@ -143,32 +143,32 @@ class Connections extends \Zotlabs\Web\Controller {
}
$search = ((x($_REQUEST,'search')) ? notags(trim($_REQUEST['search'])) : '');
-
+
$tabs = array(
/*
array(
'label' => t('Suggestions'),
- 'url' => z_root() . '/suggest',
+ 'url' => z_root() . '/suggest',
'sel' => '',
'title' => t('Suggest new connections'),
),
*/
-
+
'active' => array(
'label' => t('Active Connections'),
- 'url' => z_root() . '/connections/active',
+ 'url' => z_root() . '/connections/active',
'sel' => ($active) ? 'active' : '',
'title' => t('Show active connections'),
),
'pending' => array(
'label' => t('New Connections'),
- 'url' => z_root() . '/connections/pending',
+ 'url' => z_root() . '/connections/pending',
'sel' => ($pending) ? 'active' : '',
'title' => t('Show pending (new) connections'),
),
-
-
+
+
/*
array(
'label' => t('Unblocked'),
@@ -177,55 +177,55 @@ class Connections extends \Zotlabs\Web\Controller {
'title' => t('Only show unblocked connections'),
),
*/
-
+
'blocked' => array(
'label' => t('Blocked'),
'url' => z_root() . '/connections/blocked',
'sel' => ($blocked) ? 'active' : '',
'title' => t('Only show blocked connections'),
),
-
+
'ignored' => array(
'label' => t('Ignored'),
'url' => z_root() . '/connections/ignored',
'sel' => ($ignored) ? 'active' : '',
'title' => t('Only show ignored connections'),
),
-
+
'archived' => array(
'label' => t('Archived/Unreachable'),
'url' => z_root() . '/connections/archived',
'sel' => ($archived) ? 'active' : '',
'title' => t('Only show archived/unreachable connections'),
),
-
+
'hidden' => array(
'label' => t('Hidden'),
'url' => z_root() . '/connections/hidden',
'sel' => ($hidden) ? 'active' : '',
'title' => t('Only show hidden connections'),
),
-
+
// array(
// 'label' => t('Unconnected'),
// 'url' => z_root() . '/connections/unconnected',
// 'sel' => ($unconnected) ? 'active' : '',
// 'title' => t('Only show one-way connections'),
// ),
-
+
'all' => array(
'label' => t('All Connections'),
- 'url' => z_root() . '/connections',
+ 'url' => z_root() . '/connections',
'sel' => ($all) ? 'active' : '',
'title' => t('Show all connections'),
),
-
+
);
-
+
//$tab_tpl = get_markup_template('common_tabs.tpl');
//$t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
-
+
$searching = false;
if($search) {
$search_hdr = $search;
@@ -233,12 +233,12 @@ class Connections extends \Zotlabs\Web\Controller {
$searching = true;
}
$sql_extra .= (($searching) ? protect_sprintf(" AND xchan_name like '%$search_txt%' ") : "");
-
+
if($_REQUEST['gid']) {
$sql_extra .= " and xchan_hash in ( select xchan from pgrp_member where gid = " . intval($_REQUEST['gid']) . " and uid = " . intval(local_channel()) . " ) ";
}
-
- $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
+
+ $r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
where abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra ",
intval(local_channel())
);
@@ -246,19 +246,27 @@ class Connections extends \Zotlabs\Web\Controller {
App::set_pager_total($r[0]['total']);
$total = $r[0]['total'];
}
-
+
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
WHERE abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra ORDER BY $sql_order LIMIT %d OFFSET %d ",
intval(local_channel()),
intval(App::$pager['itemspage']),
intval(App::$pager['start'])
);
-
+
+ $roles = new Permcat(local_channel());
+ $roles_list = $roles->listing();
+ $roles_dict = [];
+
+ foreach ($roles_list as $role) {
+ $roles_dict[$role['name']] = $role['localname'];
+ }
+
$contacts = array();
-
+
if($r) {
- vcard_query($r);
+ //vcard_query($r);
foreach($r as $rr) {
@@ -268,7 +276,7 @@ class Connections extends \Zotlabs\Web\Controller {
$phone = $rr['vcard']['tels'][0]['nr'];
else
$phone = '';
-
+
$status_str = '';
$status = array(
((intval($rr['abook_active'])) ? t('Active') : ''),
@@ -306,7 +314,7 @@ class Connections extends \Zotlabs\Web\Controller {
$perminfo['connperms'] .= t('Nothing');
}
-
+
foreach($status as $str) {
if(!$str)
continue;
@@ -314,19 +322,16 @@ class Connections extends \Zotlabs\Web\Controller {
$status_str .= ', ';
}
$status_str = rtrim($status_str, ', ');
-
+
$contacts[] = array(
'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
'edit_hover' => t('Edit connection'),
'edit' => t('Edit'),
'delete_hover' => t('Delete connection'),
'id' => $rr['abook_id'],
- 'thumb' => $rr['xchan_photo_m'],
+ 'thumb' => $rr['xchan_photo_m'],
'name' => $rr['xchan_name'],
'classes' => ((intval($rr['abook_archived']) || intval($rr['abook_not_here'])) ? 'archived' : ''),
- 'link' => z_root() . '/connedit/' . $rr['abook_id'],
- 'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
- 'delete' => t('Delete'),
'url' => chanlink_hash($rr['xchan_hash']),
'webbie_label' => t('Channel address'),
'webbie' => $rr['xchan_addr'],
@@ -337,6 +342,7 @@ class Connections extends \Zotlabs\Web\Controller {
'phone' => $phone,
'status_label' => t('Status'),
'status' => $status_str,
+ 'states' => $status,
'connected_label' => t('Connected'),
'connected' => datetime_convert('UTC',date_default_timezone_get(),$rr['abook_created'], 'c'),
'approve_hover' => t('Approve connection'),
@@ -349,13 +355,22 @@ class Connections extends \Zotlabs\Web\Controller {
'perminfo' => $perminfo,
'connect' => (intval($rr['abook_not_here']) ? t('Connect') : ''),
'follow' => z_root() . '/follow/?f=&url=' . urlencode($rr['xchan_hash']) . '&interactive=0',
- 'connect_hover' => t('Connect at this location')
+ 'connect_hover' => t('Connect at this location'),
+ 'role' => $roles_dict[$rr['abook_role']],
+ 'pending' => intval($rr['abook_pending'])
);
}
}
}
-
-
+
+ $limit = service_class_fetch(local_channel(),'total_channels');
+ if($limit !== false) {
+ $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $$total, $limit);
+ }
+ else {
+ $abook_usage_message = '';
+ }
+
if($_REQUEST['aj']) {
if($contacts) {
$o = replace_macros(get_markup_template('contactsajax.tpl'),array(
@@ -371,27 +386,30 @@ class Connections extends \Zotlabs\Web\Controller {
}
else {
$o .= "<script> var page_query = '" . escape_tags(urlencode($_GET['q'])) . "'; var extra_args = '" . extra_query_args() . "' ; </script>";
- $o .= replace_macros(get_markup_template('connections.tpl'),array(
+ $o .= replace_macros(get_markup_template('connections.tpl'), [
'$header' => t('Connections') . (($head) ? ': ' . $head : ''),
'$tabs' => $tabs,
'$total' => $total,
'$search' => $search_hdr,
'$label' => t('Search'),
+ '$role_label' => t('Contact role'),
'$desc' => t('Search your connections'),
- '$finding' => (($searching) ? t('Connections search') . ": '" . $search . "'" : ""),
+ '$finding' => (($searching) ? t('Contact search') . ": '" . $search . "'" : ""),
'$submit' => t('Find'),
'$edit' => t('Edit'),
+ '$approve' => t('Approve'),
'$cmd' => App::$cmd,
'$contacts' => $contacts,
'$paginate' => paginate($a),
-
- ));
+ '$abook_usage_message' => $abook_usage_message,
+ '$group_label' => t('This is a group/forum channel')
+ ]);
}
-
+
if(! $contacts)
$o .= '<div id="content-complete"></div>';
-
+
return $o;
}
-
+
}
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 7fabf1224..6bebef026 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -1,4 +1,5 @@
<?php
+
namespace Zotlabs\Module;
/* @file connedit.php
@@ -8,8 +9,8 @@ namespace Zotlabs\Module;
*/
use App;
+use Sabre\VObject\Reader;
use Zotlabs\Lib\Apps;
-use Zotlabs\Lib\Crypto;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libsync;
use Zotlabs\Daemon\Master;
@@ -18,13 +19,12 @@ use Zotlabs\Access\Permissions;
use Zotlabs\Access\PermissionLimits;
use Zotlabs\Web\HTTPHeaders;
use Zotlabs\Lib\Permcat;
+use Zotlabs\Lib\AccessList;
require_once('include/socgraph.php');
require_once('include/selectors.php');
-require_once('include/group.php');
require_once('include/photos.php');
-
class Connedit extends Controller {
/* @brief Initialize the connection-editor
@@ -34,26 +34,25 @@ class Connedit extends Controller {
function init() {
- if(! local_channel())
+ if (!local_channel())
return;
- if((argc() >= 2) && intval(argv(1))) {
+ if ((argc() >= 2) && intval(argv(1))) {
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d and xchan_deleted = 0 LIMIT 1",
+ WHERE abook_channel = %d and abook_id = %d and abook_self = 0 and xchan_deleted = 0 LIMIT 1",
intval(local_channel()),
intval(argv(1))
);
- if($r) {
+ if ($r) {
App::$poi = $r[0];
}
}
-
$channel = App::get_channel();
- if($channel)
+ if ($channel) {
head_set_icon($channel['xchan_photo_s']);
-
+ }
}
@@ -63,188 +62,98 @@ class Connedit extends Controller {
function post() {
- if(! local_channel())
+ if (!local_channel())
return;
$contact_id = intval(argv(1));
- if(! $contact_id)
+ if (!$contact_id)
return;
$channel = App::get_channel();
- // TODO if configured for hassle-free permissions, we'll post the form with ajax as soon as the
- // connection enable is toggled to a special autopost url and set permissions immediately, leaving
- // the other form elements alone pending a manual submit of the form. The downside is that there
- // will be a window of opportunity when the permissions have been set but before you've had a chance
- // to review and possibly restrict them. The upside is we won't have to warn you that your connection
- // can't do anything until you save the bloody form.
-
- $autopost = (((argc() > 2) && (argv(2) === 'auto')) ? true : false);
-
- $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d AND abook_self = 0 LIMIT 1",
intval($contact_id),
intval(local_channel())
);
- if(! $orig_record) {
- notice( t('Could not access contact record.') . EOL);
+ if (!$orig_record) {
+ notice(t('Could not access contact record.') . EOL);
goaway(z_root() . '/connections');
return; // NOTREACHED
}
call_hooks('contact_edit_post', $_POST);
- $vc = get_abconfig(local_channel(),$orig_record['abook_xchan'],'system','vcard');
- $vcard = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
- $serialised_vcard = update_vcard($_REQUEST,$vcard);
- if($serialised_vcard)
- set_abconfig(local_channel(),$orig_record[0]['abook_xchan'],'system','vcard',$serialised_vcard);
-
- if(intval($orig_record[0]['abook_self'])) {
- $autoperms = intval($_POST['autoperms']);
- $is_self = true;
- }
- else {
- $autoperms = null;
- $is_self = false;
- }
+ $vc = get_abconfig(local_channel(), $orig_record['abook_xchan'], 'system', 'vcard');
+ $vcard = (($vc) ? Reader::read($vc) : null);
+ $serialised_vcard = update_vcard($_REQUEST, $vcard);
+ if ($serialised_vcard)
+ set_abconfig(local_channel(), $orig_record[0]['abook_xchan'], 'system', 'vcard', $serialised_vcard);
+ $profile_id = ((array_key_exists('profile_assign', $_POST)) ? $_POST['profile_assign'] : $orig_record[0]['abook_profile']);
- $profile_id = ((array_key_exists('profile_assign',$_POST)) ? $_POST['profile_assign'] : $orig_record[0]['abook_profile']);
-
- if($profile_id) {
+ if ($profile_id) {
$r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND uid = %d LIMIT 1",
dbesc($profile_id),
intval(local_channel())
);
- if(! count($r)) {
- notice( t('Could not locate selected profile.') . EOL);
+ if (!count($r)) {
+ notice(t('Could not locate selected profile.') . EOL);
return;
}
}
- $abook_incl = ((array_key_exists('abook_incl',$_POST)) ? escape_tags($_POST['abook_incl']) : $orig_record[0]['abook_incl']);
- $abook_excl = ((array_key_exists('abook_excl',$_POST)) ? escape_tags($_POST['abook_excl']) : $orig_record[0]['abook_excl']);
-
-
- $hidden = intval($_POST['hidden']);
+ $abook_incl = ((array_key_exists('abook_incl', $_POST)) ? escape_tags($_POST['abook_incl']) : $orig_record[0]['abook_incl']);
+ $abook_excl = ((array_key_exists('abook_excl', $_POST)) ? escape_tags($_POST['abook_excl']) : $orig_record[0]['abook_excl']);
+ $abook_role = ((array_key_exists('permcat', $_POST)) ? escape_tags($_POST['permcat']) : $orig_record[0]['abook_role']);
- $priority = intval($_POST['poll']);
- if($priority > 5 || $priority < 0)
- $priority = 0;
-
- if(! array_key_exists('closeness',$_POST)) {
+ if (!array_key_exists('closeness', $_POST)) {
$_POST['closeness'] = 80;
}
$closeness = intval($_POST['closeness']);
- if($closeness < 0 || $closeness > 99) {
+ if ($closeness < 0 || $closeness > 99) {
$closeness = 80;
}
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
+ $new_friend = ((intval($orig_record[0]['abook_pending'])) ? true : false);
- $all_perms = Permissions::Perms();
+/*
+ $perms = [];
+ $permcats = new Permcat(local_channel());
+ $role_perms = $permcats->fetch($abook_role);
+ $all_perms = Permissions::Perms();
- if($all_perms) {
- foreach($all_perms as $perm => $desc) {
- if(array_key_exists('perms_' . $perm, $_POST)) {
- set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,
- intval($_POST['perms_' . $perm]));
- if($autoperms) {
- set_pconfig($channel['channel_id'],'autoperms',$perm,intval($_POST['perms_' . $perm]));
- }
- }
- else {
- set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,0);
- if($autoperms) {
- set_pconfig($channel['channel_id'],'autoperms',$perm,0);
- }
- }
- }
+ // if we got a valid role use the role (default behaviour because a role is mandatory since version 7.0)
+ if (!isset($role_perms['error'])) {
+ $perms = $role_perms['raw_perms'];
+ if (intval($orig_record[0]['abook_pending']))
+ $new_friend = true;
}
- if(! is_null($autoperms))
- set_pconfig($channel['channel_id'],'system','autoperms',$autoperms);
-
- $new_friend = false;
-
- // only store a record and notify the directory if the rating changed
-
- if(! $is_self) {
-
- $signed = $orig_record[0]['abook_xchan'] . '.' . $rating . '.' . $rating_text;
- $sig = base64url_encode(Crypto::sign($signed,$channel['channel_prvkey']));
-
- $rated = ((intval($rating) || strlen($rating_text)) ? true : false);
-
- $record = 0;
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
-
- if($z) {
- if(($z[0]['xlink_rating'] != $rating) || ($z[0]['xlink_rating_text'] != $rating_text)) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- }
- elseif($rated) {
- // only create a record if there's something to save
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan']),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
- }
-
- if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) {
-
+ // approve shortcut (no role provided)
+ if (!$perms && intval($orig_record[0]['abook_pending'])) {
+ $connect_perms = Permissions::connect_perms(local_channel());
+ $perms = $connect_perms['perms'];
+ // set the role from $connect_perms
+ $abook_role = $connect_perms['role'];
$new_friend = true;
+ }
- // @fixme it won't be common, but when you accept a new connection request
- // the permissions will now be that of your permissions role and ignore
- // any you may have set manually on the form. We'll probably see a bug if somebody
- // tries to set the permissions *and* approve the connection in the same
- // request. The workaround is to approve the connection, then go back and
- // adjust permissions as desired.
-
- $p = Permissions::connect_perms(local_channel());
- $my_perms = $p['perms'];
- if($my_perms) {
- foreach($my_perms as $k => $v) {
- set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$k,$v);
+ if ($all_perms && $perms) {
+ foreach ($all_perms as $perm => $desc) {
+ if (array_key_exists($perm, $perms)) {
+ set_abconfig($channel['channel_id'], $orig_record[0]['abook_xchan'], 'my_perms', $perm, intval($perms[$perm]));
+ }
+ else {
+ set_abconfig($channel['channel_id'], $orig_record[0]['abook_xchan'], 'my_perms', $perm, 0);
}
}
}
+*/
- $abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']);
-
+ \Zotlabs\Lib\Permcat::assign($channel, $abook_role, [$orig_record[0]['abook_xchan']]);
+ $abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']);
$r = q("UPDATE abook SET abook_profile = '%s', abook_closeness = %d, abook_pending = %d,
abook_incl = '%s', abook_excl = '%s'
@@ -258,30 +167,29 @@ class Connedit extends Controller {
intval(local_channel())
);
- if($r)
- info( t('Connection updated.') . EOL);
+ if ($r)
+ info(t('Connection updated.') . EOL);
else
- notice( t('Failed to update connection record.') . EOL);
+ notice(t('Failed to update connection record.') . EOL);
- if(! intval(App::$poi['abook_self'])) {
- if($new_friend) {
- Master::Summon( [ 'Notifier', 'permission_accept', $contact_id ] );
+ if (!intval(App::$poi['abook_self'])) {
+ if ($new_friend) {
+ Master::Summon(['Notifier', 'permission_accept', $contact_id]);
}
- Master::Summon( [
+ Master::Summon([
'Notifier',
(($new_friend) ? 'permission_create' : 'permission_update'),
$contact_id
]);
}
- if($new_friend) {
+ if ($new_friend) {
$default_group = $channel['channel_default_group'];
- if($default_group) {
- require_once('include/group.php');
- $g = group_rec_byhash(local_channel(),$default_group);
- if($g)
- group_add_member(local_channel(),'',App::$poi['abook_xchan'],$g['id']);
+ if ($default_group) {
+ $g = AccessList::by_hash(local_channel(), $default_group);
+ if ($g)
+ AccessList::member_add(local_channel(), '', App::$poi['abook_xchan'], $g['id']);
}
// Check if settings permit ("post new friend activity" is allowed, and
@@ -291,18 +199,18 @@ class Connedit extends Controller {
$pr = q("select * from profile where uid = %d and is_default = 1 and hide_friends = 0",
intval($channel['channel_id'])
);
- if(($pr) && (! intval($orig_record[0]['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'],'system','post_newfriend')))) {
+ if (($pr) && (!intval($orig_record[0]['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'], 'system', 'post_newfriend')))) {
$xarr = [];
- $xarr['item_wall'] = 1;
- $xarr['item_origin'] = 1;
+ $xarr['item_wall'] = 1;
+ $xarr['item_origin'] = 1;
$xarr['item_thread_top'] = 1;
- $xarr['owner_xchan'] = $xarr['author_xchan'] = $channel['channel_hash'];
- $xarr['allow_cid'] = $channel['channel_allow_cid'];
- $xarr['allow_gid'] = $channel['channel_allow_gid'];
- $xarr['deny_cid'] = $channel['channel_deny_cid'];
- $xarr['deny_gid'] = $channel['channel_deny_gid'];
- $xarr['item_private'] = (($xarr['allow_cid']||$xarr['allow_gid']||$xarr['deny_cid']||$xarr['deny_gid']) ? 1 : 0);
+ $xarr['owner_xchan'] = $xarr['author_xchan'] = $channel['channel_hash'];
+ $xarr['allow_cid'] = $channel['channel_allow_cid'];
+ $xarr['allow_gid'] = $channel['channel_allow_gid'];
+ $xarr['deny_cid'] = $channel['channel_deny_cid'];
+ $xarr['deny_gid'] = $channel['channel_deny_gid'];
+ $xarr['item_private'] = (($xarr['allow_cid'] || $xarr['allow_gid'] || $xarr['deny_cid'] || $xarr['deny_gid']) ? 1 : 0);
$xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . App::$poi['xchan_url'] . ']' . App::$poi['xchan_name'] . '[/zrl]';
@@ -312,9 +220,8 @@ class Connedit extends Controller {
}
-
// pull in a bit of content if there is any to pull in
- Master::Summon(array('Onepoll',$contact_id));
+ Master::Summon(['Onepoll', $contact_id]);
}
@@ -326,18 +233,18 @@ class Connedit extends Controller {
intval(local_channel()),
intval($contact_id)
);
- if($r) {
+ if ($r) {
App::$poi = $r[0];
}
- if($new_friend) {
- $arr = array('channel_id' => local_channel(), 'abook' => App::$poi);
+ if ($new_friend) {
+ $arr = ['channel_id' => local_channel(), 'abook' => App::$poi];
call_hooks('accept_follow', $arr);
}
- $this->connedit_clone($a);
+ $this->connedit_clone();
- if(($_REQUEST['pending']) && (!$_REQUEST['done']))
+ if (($_REQUEST['pending']) && (!$_REQUEST['done']))
goaway(z_root() . '/connections/ifpending');
return;
@@ -349,35 +256,34 @@ class Connedit extends Controller {
*
*/
- function connedit_clone(&$a) {
-
- if(! App::$poi)
- return;
+ function connedit_clone() {
+ if (!App::$poi)
+ return;
- $channel = App::get_channel();
+ $channel = App::get_channel();
- $r = q("SELECT abook.*, xchan.*
+ $r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_channel()),
- intval(App::$poi['abook_id'])
- );
- if($r) {
- App::$poi = array_shift($r);
- }
+ intval(local_channel()),
+ intval(App::$poi['abook_id'])
+ );
+ if ($r) {
+ App::$poi = $r[0];
+ }
- $clone = App::$poi;
+ $clone = App::$poi;
- unset($clone['abook_id']);
- unset($clone['abook_account']);
- unset($clone['abook_channel']);
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
- $abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
- if($abconfig)
- $clone['abconfig'] = $abconfig;
+ $abconfig = load_abconfig($channel['channel_id'], $clone['abook_xchan']);
+ if ($abconfig)
+ $clone['abconfig'] = $abconfig;
- Libsync::build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
+ Libsync::build_sync_packet(0 /* use the current local_channel */, ['abook' => [$clone]]);
}
/* @brief Generate content of connection edit page
@@ -387,37 +293,19 @@ class Connedit extends Controller {
function get() {
- $sort_type = 0;
$o = '';
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
+ if (!local_channel()) {
+ notice(t('Permission denied.') . EOL);
return login();
}
- $section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
- $channel = App::get_channel();
-
- $yes_no = array(t('No'),t('Yes'));
-
- $connect_perms = Permissions::connect_perms(local_channel());
-
- $o .= "<script>function connectDefaultShare() {
- \$('.abook-edit-me').each(function() {
- if(! $(this).is(':disabled'))
- $(this).prop('checked', false);
- });\n\n";
- foreach($connect_perms['perms'] as $p => $v) {
- if($v) {
- $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
- }
- }
- $o .= " }\n</script>\n";
+ $section = ((array_key_exists('section', $_REQUEST)) ? $_REQUEST['section'] : '');
- if(argc() == 3) {
+ if (argc() == 3) {
$contact_id = intval(argv(1));
- if(! $contact_id)
+ if (!$contact_id)
return;
$cmd = argv(2);
@@ -428,35 +316,35 @@ class Connedit extends Controller {
intval(local_channel())
);
- if(! count($orig_record)) {
- notice( t('Could not access address book record.') . EOL);
+ if (!count($orig_record)) {
+ notice(t('Could not access address book record.') . EOL);
goaway(z_root() . '/connections');
}
- if($cmd === 'update') {
+ if ($cmd === 'update') {
// pull feed and consume it, which should subscribe to the hub.
- Master::Summon(array('Poller',$contact_id));
+ Master::Summon(['Poller', $contact_id]);
goaway(z_root() . '/connedit/' . $contact_id);
}
- if($cmd === 'fetchvc') {
- $url = str_replace('/channel/','/profile/',$orig_record[0]['xchan_url']) . '/vcard';
+ if ($cmd === 'fetchvc') {
+ $url = str_replace('/channel/', '/profile/', $orig_record[0]['xchan_url']) . '/vcard';
$recurse = 0;
- $x = z_fetch_url(zid($url),false,$recurse,['session' => true]);
- if($x['success']) {
- $h = new HTTPHeaders($x['header']);
+ $x = z_fetch_url(zid($url), false, $recurse, ['session' => true]);
+ if ($x['success']) {
+ $h = new HTTPHeaders($x['header']);
$fields = $h->fetch();
- if($fields) {
- foreach($fields as $y) {
- if(array_key_exists('content-type',$y)) {
- $type = explode(';',trim($y['content-type']));
- if($type && $type[0] === 'text/vcard' && $x['body']) {
- $vc = \Sabre\VObject\Reader::read($x['body']);
+ if ($fields) {
+ foreach ($fields as $y) {
+ if (array_key_exists('content-type', $y)) {
+ $type = explode(';', trim($y['content-type']));
+ if ($type && $type[0] === 'text/vcard' && $x['body']) {
+ $vc = Reader::read($x['body']);
$vcard = $vc->serialize();
- if($vcard) {
- set_abconfig(local_channel(),$orig_record[0]['abook_xchan'],'system','vcard',$vcard);
- $this->connedit_clone($a);
+ if ($vcard) {
+ set_abconfig(local_channel(), $orig_record[0]['abook_xchan'], 'system', 'vcard', $vcard);
+ $this->connedit_clone();
}
}
}
@@ -467,55 +355,55 @@ class Connedit extends Controller {
}
- if($cmd === 'resetphoto') {
+ if ($cmd === 'resetphoto') {
q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
dbesc($orig_record[0]['xchan_hash'])
);
$cmd = 'refresh';
}
- if($cmd === 'refresh') {
- if($orig_record[0]['xchan_network'] === 'zot6') {
- if(! Libzot::refresh($orig_record[0],App::get_channel()))
- notice( t('Refresh failed - channel is currently unavailable.') );
+ if ($cmd === 'refresh') {
+ if ($orig_record[0]['xchan_network'] === 'zot6') {
+ if (!Libzot::refresh($orig_record[0], App::get_channel()))
+ notice(t('Refresh failed - channel is currently unavailable.'));
}
else {
// if you are on a different network we'll force a refresh of the connection basic info
- Master::Summon(array('Notifier','permission_update',$contact_id));
+ Master::Summon(['Notifier', 'permission_update', $contact_id]);
}
goaway(z_root() . '/connedit/' . $contact_id);
}
- if($cmd === 'block') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED)) {
- $this->connedit_clone($a);
+ if ($cmd === 'block') {
+ if (abook_toggle_flag($orig_record[0], ABOOK_FLAG_BLOCKED)) {
+ $this->connedit_clone();
}
else
notice(t('Unable to set address book parameters.') . EOL);
goaway(z_root() . '/connedit/' . $contact_id);
}
- if($cmd === 'ignore') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED)) {
- $this->connedit_clone($a);
+ if ($cmd === 'ignore') {
+ if (abook_toggle_flag($orig_record[0], ABOOK_FLAG_IGNORED)) {
+ $this->connedit_clone();
}
else
notice(t('Unable to set address book parameters.') . EOL);
goaway(z_root() . '/connedit/' . $contact_id);
}
- if($cmd === 'archive') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED)) {
- $this->connedit_clone($a);
+ if ($cmd === 'archive') {
+ if (abook_toggle_flag($orig_record[0], ABOOK_FLAG_ARCHIVED)) {
+ $this->connedit_clone();
}
else
notice(t('Unable to set address book parameters.') . EOL);
goaway(z_root() . '/connedit/' . $contact_id);
}
- if($cmd === 'hide') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN)) {
- $this->connedit_clone($a);
+ if ($cmd === 'hide') {
+ if (abook_toggle_flag($orig_record[0], ABOOK_FLAG_HIDDEN)) {
+ $this->connedit_clone();
}
else
notice(t('Unable to set address book parameters.') . EOL);
@@ -525,10 +413,10 @@ class Connedit extends Controller {
// We'll prevent somebody from unapproving an already approved contact.
// Though maybe somebody will want this eventually (??)
- if($cmd === 'approve') {
- if(intval($orig_record[0]['abook_pending'])) {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING)) {
- $this->connedit_clone($a);
+ if ($cmd === 'approve') {
+ if (intval($orig_record[0]['abook_pending'])) {
+ if (abook_toggle_flag($orig_record[0], ABOOK_FLAG_PENDING)) {
+ $this->connedit_clone();
}
else
notice(t('Unable to set address book parameters.') . EOL);
@@ -537,132 +425,130 @@ class Connedit extends Controller {
}
- if($cmd === 'drop') {
+ if ($cmd === 'drop') {
contact_remove(local_channel(), $orig_record[0]['abook_id']);
- Master::Summon( [ 'Notifier', 'purge', local_channel(), $orig_record[0]['xchan_hash'] ] );
+ Master::Summon(['Notifier', 'purge', local_channel(), $orig_record[0]['xchan_hash']]);
Libsync::build_sync_packet(0 /* use the current local_channel */,
- array('abook' => array(array(
- 'abook_xchan' => $orig_record[0]['abook_xchan'],
- 'entry_deleted' => true))
- )
+ ['abook' => [[
+ 'abook_xchan' => $orig_record[0]['abook_xchan'],
+ 'entry_deleted' => true]]
+ ]
);
- info( t('Connection has been removed.') . EOL );
- if(x($_SESSION,'return_url'))
+ info(t('Connection has been removed.') . EOL);
+ if (x($_SESSION, 'return_url'))
goaway(z_root() . '/' . $_SESSION['return_url']);
goaway(z_root() . '/contacts');
}
}
- if(App::$poi) {
+ if (App::$poi) {
$abook_prev = 0;
$abook_next = 0;
-
$contact_id = App::$poi['abook_id'];
- $contact = App::$poi;
+ $contact = App::$poi;
$cn = q("SELECT abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 and xchan_deleted = 0 order by xchan_name",
intval(local_channel())
);
- if($cn) {
+ if ($cn) {
$pntotal = count($cn);
- for($x = 0; $x < $pntotal; $x ++) {
- if($cn[$x]['abook_id'] == $contact_id) {
- if($x === 0)
+ for ($x = 0; $x < $pntotal; $x++) {
+ if ($cn[$x]['abook_id'] == $contact_id) {
+ if ($x === 0)
$abook_prev = 0;
else
$abook_prev = $cn[$x - 1]['abook_id'];
- if($x === $pntotal)
+ if ($x === $pntotal)
$abook_next = 0;
else
- $abook_next = $cn[$x +1]['abook_id'];
+ $abook_next = $cn[$x + 1]['abook_id'];
}
}
- }
+ }
- $tools = array(
+ $tools = [
- 'view' => array(
+ 'view' => [
'label' => t('View Profile'),
'url' => chanlink_cid($contact['abook_id']),
'sel' => '',
- 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
- ),
+ 'title' => sprintf(t('View %s\'s profile'), $contact['xchan_name']),
+ ],
- 'refresh' => array(
+ 'refresh' => [
'label' => t('Refresh Permissions'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/refresh',
'sel' => '',
'title' => t('Fetch updated permissions'),
- ),
+ ],
- 'rephoto' => array(
+ 'rephoto' => [
'label' => t('Refresh Photo'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/resetphoto',
'sel' => '',
'title' => t('Fetch updated photo'),
- ),
+ ],
- 'recent' => array(
+ 'recent' => [
'label' => t('Recent Activity'),
'url' => z_root() . '/network/?f=&cid=' . $contact['abook_id'],
'sel' => '',
'title' => t('View recent posts and comments'),
- ),
+ ],
- 'block' => array(
+ 'block' => [
'label' => (intval($contact['abook_blocked']) ? t('Unblock') : t('Block')),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/block',
'sel' => (intval($contact['abook_blocked']) ? 'active' : ''),
'title' => t('Block (or Unblock) all communications with this connection'),
- 'info' => (intval($contact['abook_blocked']) ? t('This connection is blocked!') : ''),
- ),
+ 'info' => (intval($contact['abook_blocked']) ? t('This connection is blocked!') : ''),
+ ],
- 'ignore' => array(
+ 'ignore' => [
'label' => (intval($contact['abook_ignored']) ? t('Unignore') : t('Ignore')),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/ignore',
'sel' => (intval($contact['abook_ignored']) ? 'active' : ''),
'title' => t('Ignore (or Unignore) all inbound communications from this connection'),
- 'info' => (intval($contact['abook_ignored']) ? t('This connection is ignored!') : ''),
- ),
+ 'info' => (intval($contact['abook_ignored']) ? t('This connection is ignored!') : ''),
+ ],
- 'archive' => array(
+ 'archive' => [
'label' => (intval($contact['abook_archived']) ? t('Unarchive') : t('Archive')),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/archive',
'sel' => (intval($contact['abook_archived']) ? 'active' : ''),
'title' => t('Archive (or Unarchive) this connection - mark channel dead but keep content'),
- 'info' => (intval($contact['abook_archived']) ? t('This connection is archived!') : ''),
- ),
+ 'info' => (intval($contact['abook_archived']) ? t('This connection is archived!') : ''),
+ ],
- 'hide' => array(
+ 'hide' => [
'label' => (intval($contact['abook_hidden']) ? t('Unhide') : t('Hide')),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/hide',
'sel' => (intval($contact['abook_hidden']) ? 'active' : ''),
'title' => t('Hide or Unhide this connection from your other connections'),
- 'info' => (intval($contact['abook_hidden']) ? t('This connection is hidden!') : ''),
- ),
+ 'info' => (intval($contact['abook_hidden']) ? t('This connection is hidden!') : ''),
+ ],
- 'delete' => array(
+ 'delete' => [
'label' => t('Delete'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/drop',
'sel' => '',
'title' => t('Delete this connection'),
- ),
-
- );
+ ],
+ ];
- if($contact['xchan_network'] === 'zot6') {
+ if ($contact['xchan_network'] === 'zot6') {
$tools['fetchvc'] = [
'label' => t('Fetch Vcard'),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/fetchvc',
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/fetchvc',
'sel' => '',
'title' => t('Fetch electronic calling card for this connection')
];
@@ -671,31 +557,16 @@ class Connedit extends Controller {
$sections = [];
- $sections['perms'] = [
- 'label' => t('Permissions'),
- 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/?f=&section=perms',
- 'sel' => '',
- 'title' => t('Open Individual Permissions section by default'),
- ];
-
- $self = false;
-
- if(intval($contact['abook_self'])) {
- $self = true;
- $abook_prev = $abook_next = 0;
- }
-
- $vc = get_abconfig(local_channel(),$contact['abook_xchan'],'system','vcard');
+ $vc = get_abconfig(local_channel(), $contact['abook_xchan'], 'system', 'vcard');
- $vctmp = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
- $vcard = (($vctmp) ? get_vcard_array($vctmp,$contact['abook_id']) : [] );
- if(! $vcard)
+ $vctmp = (($vc) ? Reader::read($vc) : null);
+ $vcard = (($vctmp) ? get_vcard_array($vctmp, $contact['abook_id']) : []);
+ if (!$vcard['fn'])
$vcard['fn'] = $contact['xchan_name'];
-
$tpl = get_markup_template("abook_edit.tpl");
- if(Apps::system_app_installed(local_channel(),'Affinity Tool')) {
+ if (Apps::system_app_installed(local_channel(), 'Affinity Tool')) {
$sections['affinity'] = [
'label' => t('Affinity'),
@@ -711,12 +582,12 @@ class Connedit extends Controller {
t('Acquaintances'),
t('All')
];
- call_hooks('affinity_labels',$labels);
+ call_hooks('affinity_labels', $labels);
$label_str = '';
- if($labels) {
- foreach($labels as $l) {
- if($label_str) {
+ if ($labels) {
+ foreach ($labels as $l) {
+ if ($label_str) {
$label_str .= ", '|'";
$label_str .= ", '" . $l . "'";
}
@@ -729,14 +600,14 @@ class Connedit extends Controller {
$slideval = intval($contact['abook_closeness']);
- $slide = replace_macros($slider_tpl,array(
- '$min' => 1,
- '$val' => $slideval,
+ $slide = replace_macros($slider_tpl, [
+ '$min' => 1,
+ '$val' => $slideval,
'$labels' => $label_str,
- ));
+ ]);
}
- if(feature_enabled(local_channel(),'connfilter')) {
+ if (feature_enabled(local_channel(), 'connfilter')) {
$sections['filter'] = [
'label' => t('Filter'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/?f=&section=filter',
@@ -745,195 +616,148 @@ class Connedit extends Controller {
];
}
- $rating_val = 0;
- $rating_text = '';
-
- $xl = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc($contact['xchan_hash'])
- );
-
- if($xl) {
- $rating_val = intval($xl[0]['xlink_rating']);
- $rating_text = $xl[0]['xlink_rating_text'];
- }
-
- $rating_enabled = get_config('system','rating_enabled');
-
- if($rating_enabled) {
- $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
- '$min' => -10,
- '$val' => $rating_val
- ));
- }
- else {
- $rating = false;
- }
-
-
- $perms = array();
- $channel = App::get_channel();
-
+ $perms = [];
$global_perms = Permissions::Perms();
+ $existing = get_all_perms(local_channel(), $contact['abook_xchan'], false);
+ $unapproved = ['pending', t('Approve this contact'), '', t('Accept contact to allow communication'), [t('No'), ('Yes')]];
+ $multiprofs = ((feature_enabled(local_channel(), 'multi_profiles')) ? true : false);
- $existing = get_all_perms(local_channel(),$contact['abook_xchan'],false);
-
- $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'), array(t('No'),('Yes')));
-
- $multiprofs = ((feature_enabled(local_channel(),'multi_profiles')) ? true : false);
-
- if($slide && !$multiprofs)
+ if ($slide && !$multiprofs)
$affinity = t('Set Affinity');
- if(!$slide && $multiprofs)
+ if (!$slide && $multiprofs)
$affinity = t('Set Profile');
- if($slide && $multiprofs)
+ if ($slide && $multiprofs)
$affinity = t('Set Affinity & Profile');
$theirs = q("select * from abconfig where chan = %d and xchan = '%s' and cat = 'their_perms'",
- intval(local_channel()),
- dbesc($contact['abook_xchan'])
+ intval(local_channel()),
+ dbesc($contact['abook_xchan'])
);
- $their_perms = array();
- if($theirs) {
- foreach($theirs as $t) {
+
+ $their_perms = [];
+ if ($theirs) {
+ foreach ($theirs as $t) {
$their_perms[$t['k']] = $t['v'];
}
}
- foreach($global_perms as $k => $v) {
- $thisperm = get_abconfig(local_channel(),$contact['abook_xchan'],'my_perms',$k);
-//fixme
-
- $checkinherited = PermissionLimits::Get(local_channel(),$k);
-
- // For auto permissions (when $self is true) we don't want to look at existing
- // permissions because they are enabled for the channel owner
- if((! $self) && ($existing[$k]))
- $thisperm = "1";
-
-
+ foreach ($global_perms as $k => $v) {
+ $thisperm = $existing[$k];
+ $checkinherited = PermissionLimits::Get(local_channel(), $k);
+ $perms[] = ['perms_' . $k, $v, ((array_key_exists($k, $their_perms)) ? intval($their_perms[$k]) : ''), $thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '0' : '1'), '', $checkinherited];
+ }
+ $pcat = new Permcat(local_channel());
+ $pcatlist = $pcat->listing();
+ $default_role = get_pconfig(local_channel(), 'system', 'default_permcat');
+ $current_permcat = (($contact['abook_pending']) ? $default_role : $contact['abook_role']);
- $perms[] = array('perms_' . $k, $v, ((array_key_exists($k,$their_perms)) ? intval($their_perms[$k]) : ''),$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
+ if (!$current_permcat) {
+ notice(t('Please select a role for this contact!') . EOL);
+ $permcats[] = '';
}
- $pcat = new Permcat(local_channel());
- $pcatlist = $pcat->listing();
- $permcats = [];
- if($pcatlist) {
- foreach($pcatlist as $pc) {
+ if ($pcatlist) {
+ foreach ($pcatlist as $pc) {
$permcats[$pc['name']] = $pc['localname'];
}
}
$locstr = locations_by_netid($contact['xchan_hash']);
- if(! $locstr)
+ if (!$locstr) {
$locstr = unpunify($contact['xchan_url']);
+ }
$clone_warn = '';
- $clonable = in_array($contact['xchan_network'], ['zot6', 'rss']);
- if(! $clonable) {
+ $clonable = in_array($contact['xchan_network'], ['zot6', 'rss']);
+ if (!$clonable) {
$clone_warn = '<strong>';
$clone_warn .= ((intval($contact['abook_not_here']))
- ? t('This connection is unreachable from this location.')
- : t('This connection may be unreachable from other channel locations.')
+ ? t('This contact is unreachable from this location.')
+ : t('This contact may be unreachable from other channel locations.')
);
$clone_warn .= '</strong><br>' . t('Location independence is not supported by their network.');
}
-
-
- if(intval($contact['abook_not_here']) && $unclonable)
- $not_here = t('This connection is unreachable from this location. Location independence is not supported by their network.');
-
$o .= replace_macros($tpl, [
- '$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
- '$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no),
- '$permcat' => [ 'permcat', t('Permission role'), '', '<span class="loading invisible">' . t('Loading') . '<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span></span>',$permcats ],
- '$permcat_new' => t('Add permission role'),
- '$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
- '$addr' => unpunify($contact['xchan_addr']),
- '$primeurl' => unpunify($contact['xchan_url']),
- '$section' => $section,
- '$sections' => $sections,
- '$vcard' => $vcard,
- '$addr_text' => t('This connection\'s primary address is'),
- '$loc_text' => t('Available locations:'),
- '$locstr' => $locstr,
- '$unclonable' => $clone_warn,
- '$notself' => (($self) ? '' : '1'),
- '$self' => (($self) ? '1' : ''),
- '$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
- '$tools_label' => t('Connection Tools'),
- '$tools' => (($self) ? '' : $tools),
- '$lbl_slider' => t('Slide to adjust your degree of friendship'),
- '$lbl_rating' => t('Rating'),
- '$lbl_rating_label' => t('Slide to adjust your rating'),
- '$lbl_rating_txt' => t('Optionally explain your rating'),
- '$connfilter' => feature_enabled(local_channel(),'connfilter'),
+ '$header' => sprintf(t('Contact: %s'), $contact['xchan_name']),
+ '$permcat' => ['permcat', t('Contact role'), $current_permcat, '', $permcats],
+ '$permcat_new' => t('Manage contact roles'),
+ '$permcat_value' => bin2hex($current_permcat),
+ '$addr' => unpunify($contact['xchan_addr']),
+ '$primeurl' => unpunify($contact['xchan_url']),
+ '$section' => $section,
+ '$sections' => $sections,
+ '$vcard' => $vcard,
+ '$addr_text' => t('This contacts\'s primary address is'),
+ '$loc_text' => t('Available locations:'),
+ '$locstr' => $locstr,
+ '$unclonable' => $clone_warn,
+ '$notself' => '1',
+ '$self' => '',
+ '$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
+ '$tools_label' => t('Contact Tools'),
+ '$tools' => $tools,
+ '$lbl_slider' => t('Slide to adjust your degree of friendship'),
+ '$connfilter' => feature_enabled(local_channel(), 'connfilter'),
'$connfilter_label' => t('Custom Filter'),
- '$incl' => array('abook_incl',t('Only import posts with this text'), $contact['abook_incl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
- '$excl' => array('abook_excl',t('Do not import posts with this text'), $contact['abook_excl'],t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')),
- '$rating_text' => array('rating_text', t('Optionally explain your rating'),$rating_text,''),
- '$rating_info' => t('This information is public!'),
- '$rating' => $rating,
- '$rating_val' => $rating_val,
- '$slide' => $slide,
- '$affinity' => $affinity,
- '$pending_label' => t('Connection Pending Approval'),
- '$is_pending' => (intval($contact['abook_pending']) ? 1 : ''),
- '$unapproved' => $unapproved,
- '$inherited' => t('inherited'),
- '$submit' => t('Submit'),
- '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
- '$close' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 80),
- '$them' => t('Their Settings'),
- '$me' => t('My Settings'),
- '$perms' => $perms,
- '$permlbl' => t('Individual Permissions'),
- '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
- '$permnote_self' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes.'),
- '$lastupdtext' => t('Last update:'),
- '$last_update' => relative_date($contact['abook_connected']),
- '$profile_select' => contact_profile_assign($contact['abook_profile']),
- '$multiprofs' => $multiprofs,
- '$contact_id' => $contact['abook_id'],
- '$name' => $contact['xchan_name'],
- '$abook_prev' => $abook_prev,
- '$abook_next' => $abook_next,
- '$vcard_label' => t('Details'),
- '$displayname' => $displayname,
- '$name_label' => t('Name'),
- '$org_label' => t('Organisation'),
- '$title_label' => t('Title'),
- '$tel_label' => t('Phone'),
- '$email_label' => t('Email'),
- '$impp_label' => t('Instant messenger'),
- '$url_label' => t('Website'),
- '$adr_label' => t('Address'),
- '$note_label' => t('Note'),
- '$mobile' => t('Mobile'),
- '$home' => t('Home'),
- '$work' => t('Work'),
- '$other' => t('Other'),
- '$add_card' => t('Add Contact'),
- '$add_field' => t('Add Field'),
- '$create' => t('Create'),
- '$update' => t('Update'),
- '$delete' => t('Delete'),
- '$cancel' => t('Cancel'),
- '$po_box' => t('P.O. Box'),
- '$extra' => t('Additional'),
- '$street' => t('Street'),
- '$locality' => t('Locality'),
- '$region' => t('Region'),
- '$zip_code' => t('ZIP Code'),
- '$country' => t('Country')
+ '$incl' => ['abook_incl', t('Only import posts with this text'), $contact['abook_incl'], t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')],
+ '$excl' => ['abook_excl', t('Do not import posts with this text'), $contact['abook_excl'], t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')],
+ '$slide' => $slide,
+ '$affinity' => $affinity,
+ '$pending_label' => t('Contact Pending Approval'),
+ '$is_pending' => (intval($contact['abook_pending']) ? 1 : ''),
+ '$unapproved' => $unapproved,
+ '$inherited' => t('inherited'),
+ '$submit' => ((intval($contact['abook_pending'])) ? t('Approve contact') : t('Submit')),
+ '$lbl_vis2' => sprintf(t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
+ '$close' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 80),
+ '$them' => t('Their'),
+ '$me' => t('My'),
+ '$perms' => $perms,
+ '$permlbl' => t('Individual Permissions'),
+ '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
+ '$permnote_self' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes.'),
+ '$lastupdtext' => t('Last update:'),
+ '$last_update' => relative_date($contact['abook_connected']),
+ '$profile_select' => contact_profile_assign($contact['abook_profile']),
+ '$multiprofs' => $multiprofs,
+ '$contact_id' => $contact['abook_id'],
+ '$name' => $contact['xchan_name'],
+ '$abook_prev' => $abook_prev,
+ '$abook_next' => $abook_next,
+ '$vcard_label' => t('Details'),
+ '$name_label' => t('Name'),
+ '$org_label' => t('Organisation'),
+ '$title_label' => t('Title'),
+ '$tel_label' => t('Phone'),
+ '$email_label' => t('Email'),
+ '$impp_label' => t('Instant messenger'),
+ '$url_label' => t('Website'),
+ '$adr_label' => t('Address'),
+ '$note_label' => t('Note'),
+ '$mobile' => t('Mobile'),
+ '$home' => t('Home'),
+ '$work' => t('Work'),
+ '$other' => t('Other'),
+ '$add_card' => t('Add Contact'),
+ '$add_field' => t('Add Field'),
+ '$create' => t('Create'),
+ '$update' => t('Update'),
+ '$delete' => t('Delete'),
+ '$cancel' => t('Cancel'),
+ '$po_box' => t('P.O. Box'),
+ '$extra' => t('Additional'),
+ '$street' => t('Street'),
+ '$locality' => t('Locality'),
+ '$region' => t('Region'),
+ '$zip_code' => t('ZIP Code'),
+ '$country' => t('Country')
]);
- $arr = array('contact' => $contact,'output' => $o);
+ $arr = ['contact' => $contact, 'output' => $o];
call_hooks('contact_edit', $arr);
diff --git a/Zotlabs/Module/Contactedit.php b/Zotlabs/Module/Contactedit.php
new file mode 100644
index 000000000..b09b5b1ec
--- /dev/null
+++ b/Zotlabs/Module/Contactedit.php
@@ -0,0 +1,668 @@
+<?php
+
+namespace Zotlabs\Module;
+
+/* @file Cobtactedit.php
+ * @brief In this file the connection-editor form is generated and evaluated.
+ *
+ *
+ */
+
+use App;
+use Sabre\VObject\Reader;
+use Zotlabs\Lib\Apps;
+use Zotlabs\Lib\Libzot;
+use Zotlabs\Lib\Libsync;
+use Zotlabs\Daemon\Master;
+use Zotlabs\Web\Controller;
+use Zotlabs\Access\Permissions;
+use Zotlabs\Access\PermissionLimits;
+use Zotlabs\Web\HTTPHeaders;
+use Zotlabs\Lib\Permcat;
+use Zotlabs\Lib\AccessList;
+
+require_once('include/socgraph.php');
+require_once('include/selectors.php');
+require_once('include/group.php');
+require_once('include/photos.php');
+
+class Contactedit extends Controller {
+
+ /* @brief Initialize the connection-editor
+ *
+ *
+ */
+
+ function init() {
+
+ if (!local_channel())
+ return;
+
+ if ((argc() >= 2) && intval(argv(1))) {
+ $r = q("SELECT abook.*, xchan.* FROM abook LEFT JOIN xchan ON abook_xchan = xchan_hash
+ WHERE abook_channel = %d AND abook_id = %d AND abook_self = 0 AND xchan_deleted = 0",
+ intval(local_channel()),
+ intval(argv(1))
+ );
+ if (!$r) {
+ json_return_and_die([
+ 'success' => false,
+ 'message' => t('Invalid abook_id')
+ ]);
+ }
+
+ App::$poi = $r[0];
+
+ }
+ }
+
+
+ /* @brief Evaluate posted values and set changes
+ *
+ */
+
+ function post() {
+
+ if (!local_channel())
+ return;
+
+ $contact_id = intval(argv(1));
+ if (!$contact_id)
+ return;
+
+ $channel = App::get_channel();
+
+ $contact = App::$poi;
+
+ if (!$contact) {
+ notice(t('Could not access contact record.') . EOL);
+ killme();
+ }
+
+ call_hooks('contact_edit_post', $_REQUEST);
+
+ if (Apps::system_app_installed(local_channel(), 'Privacy Groups')) {
+ $pgrp_ids = q("SELECT id FROM pgrp WHERE deleted = 0 AND uid = %d",
+ intval(local_channel())
+ );
+
+ foreach($pgrp_ids as $pgrp) {
+ if (array_key_exists('pgrp_id_' . $pgrp['id'], $_REQUEST)) {
+ AccessList::member_add(local_channel(), '', $contact['abook_xchan'], $pgrp['id']);
+ }
+ else {
+ AccessList::member_remove(local_channel(), '', $contact['abook_xchan'], $pgrp['id']);
+ }
+ }
+ }
+
+ $profile_id = ((array_key_exists('profile_assign', $_REQUEST)) ? $_REQUEST['profile_assign'] : $contact['abook_profile']);
+
+ if ($profile_id) {
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND uid = %d LIMIT 1",
+ dbesc($profile_id),
+ intval(local_channel())
+ );
+ if (!count($r)) {
+ notice(t('Could not locate selected profile.') . EOL);
+ return;
+ }
+ }
+
+ $abook_incl = ((array_key_exists('abook_incl', $_REQUEST)) ? escape_tags($_REQUEST['abook_incl']) : $contact['abook_incl']);
+ $abook_excl = ((array_key_exists('abook_excl', $_REQUEST)) ? escape_tags($_REQUEST['abook_excl']) : $contact['abook_excl']);
+ $abook_role = ((array_key_exists('permcat', $_REQUEST)) ? escape_tags($_REQUEST['permcat']) : $contact['abook_role']);
+
+ if (!array_key_exists('closeness', $_REQUEST)) {
+ $_REQUEST['closeness'] = 80;
+ }
+
+ $closeness = intval($_REQUEST['closeness']);
+
+ if ($closeness < 0 || $closeness > 99) {
+ $closeness = 80;
+ }
+
+ $new_friend = ((intval($contact['abook_pending'])) ? true : false);
+
+ \Zotlabs\Lib\Permcat::assign($channel, $abook_role, [$contact['abook_xchan']]);
+
+ $abook_pending = (($new_friend) ? 0 : $contact['abook_pending']);
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_closeness = %d, abook_pending = %d,
+ abook_incl = '%s', abook_excl = '%s'
+ where abook_id = %d AND abook_channel = %d",
+ dbesc($profile_id),
+ intval($closeness),
+ intval($abook_pending),
+ dbesc($abook_incl),
+ dbesc($abook_excl),
+ intval($contact_id),
+ intval(local_channel())
+ );
+
+ $_REQUEST['success'] = false;
+
+ if ($r) {
+ $_REQUEST['success'] = true;
+ }
+
+
+ if (!intval($contact['abook_self'])) {
+ if ($new_friend) {
+ Master::Summon(['Notifier', 'permission_accept', $contact_id]);
+ }
+
+ Master::Summon([
+ 'Notifier',
+ (($new_friend) ? 'permission_create' : 'permission_update'),
+ $contact_id
+ ]);
+ }
+
+ if ($new_friend) {
+ $default_group = $channel['channel_default_group'];
+ if ($default_group) {
+ $g = AccessList::by_hash(local_channel(), $default_group);
+ if ($g) {
+ AccessList::member_add(local_channel(), '', $contact['abook_xchan'], $g['id']);
+ }
+ }
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+
+ $pr = q("select * from profile where uid = %d and is_default = 1 and hide_friends = 0",
+ intval($channel['channel_id'])
+ );
+ if (($pr) && (!intval($contact['abook_hidden'])) && (intval(get_pconfig($channel['channel_id'], 'system', 'post_newfriend')))) {
+ $xarr = [];
+
+ $xarr['item_wall'] = 1;
+ $xarr['item_origin'] = 1;
+ $xarr['item_thread_top'] = 1;
+ $xarr['owner_xchan'] = $xarr['author_xchan'] = $channel['channel_hash'];
+ $xarr['allow_cid'] = $channel['channel_allow_cid'];
+ $xarr['allow_gid'] = $channel['channel_allow_gid'];
+ $xarr['deny_cid'] = $channel['channel_deny_cid'];
+ $xarr['deny_gid'] = $channel['channel_deny_gid'];
+ $xarr['item_private'] = (($xarr['allow_cid'] || $xarr['allow_gid'] || $xarr['deny_cid'] || $xarr['deny_gid']) ? 1 : 0);
+
+ $xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . $contact['xchan_url'] . ']' . $contact['xchan_name'] . '[/zrl]';
+
+ $xarr['body'] .= "\n\n\n" . '[zrl=' . $contact['xchan_url'] . '][zmg=80x80]' . $contact['xchan_photo_m'] . '[/zmg][/zrl]';
+
+ post_activity_item($xarr);
+
+ }
+
+ // pull in a bit of content if there is any to pull in
+ Master::Summon(['Onepoll', $contact_id]);
+
+ }
+
+ // Refresh the structure in memory with the new data
+ $this->init();
+
+ if ($new_friend) {
+ $arr = ['channel_id' => local_channel(), 'abook' => App::$poi];
+ call_hooks('accept_follow', $arr);
+ }
+
+ $this->contactedit_clone();
+ $this->get();
+
+ killme();
+
+ return;
+
+ }
+
+
+ /* @brief Generate content of contact edit page
+ *
+ *
+ */
+
+ function get() {
+
+ if (!local_channel()) {
+ killme();
+ }
+
+ if (!App::$poi) {
+ killme();
+ }
+
+
+ $channel = App::get_channel();
+ $contact_id = App::$poi['abook_id'];
+ $contact = App::$poi;
+ $section = ((array_key_exists('section', $_REQUEST)) ? $_REQUEST['section'] : 'roles');
+ $sub_section = ((array_key_exists('sub_section', $_REQUEST)) ? $_REQUEST['sub_section'] : '');
+
+
+ if (argc() == 3) {
+ $cmd = argv(2);
+ $ret = $this->do_action($contact, $cmd);
+ $contact = App::$poi;
+
+ $tools_html = replace_macros(get_markup_template("contact_edit_tools.tpl"), [
+ '$tools_label' => t('Contact Tools'),
+ '$tools' => $this->get_tools($contact),
+ ]);
+
+ $ret['tools'] = $tools_html;
+
+ json_return_and_die($ret);
+ }
+
+ $groups = [];
+
+ if (Apps::system_app_installed(local_channel(), 'Privacy Groups')) {
+
+ $r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
+ intval(local_channel())
+ );
+
+ $member_of = AccessList::containing(local_channel(), $contact['xchan_hash']);
+
+ if ($r) {
+ foreach ($r as $rr) {
+ $default_group = false;
+ if ($rr['hash'] === $channel['channel_default_group']) {
+ $default_group = true;
+ }
+
+ $groups[] = [
+ 'pgrp_id_' . $rr['id'],
+ $rr['gname'],
+ // if it's a new contact preset the default group if we have one
+ (($default_group && $contact['abook_pending']) ? 1 : in_array($rr['id'], $member_of)),
+ '',
+ [t('No'), t('Yes')]
+ ];
+ }
+ }
+ }
+
+ $slide = '';
+
+ if (Apps::system_app_installed(local_channel(), 'Affinity Tool')) {
+
+ $labels = [
+ t('Me'),
+ t('Family'),
+ t('Friends'),
+ t('Acquaintances'),
+ t('All')
+ ];
+ call_hooks('affinity_labels', $labels);
+ $label_str = '';
+
+ if ($labels) {
+ foreach ($labels as $l) {
+ if ($label_str) {
+ $label_str .= ", '|'";
+ $label_str .= ", '" . $l . "'";
+ }
+ else
+ $label_str .= "'" . $l . "'";
+ }
+ }
+
+ $slider_tpl = get_markup_template('contact_slider.tpl');
+
+ $slideval = intval($contact['abook_closeness']);
+
+ $slide = replace_macros($slider_tpl, [
+ '$min' => 1,
+ '$val' => $slideval,
+ '$labels' => $label_str,
+ ]);
+ }
+
+ $perms = [];
+ $global_perms = Permissions::Perms();
+ $existing = get_all_perms(local_channel(), $contact['abook_xchan'], false);
+ $unapproved = ['pending', t('Approve this contact'), '', t('Accept contact to allow communication'), [t('No'), ('Yes')]];
+ $multiprofs = ((feature_enabled(local_channel(), 'multi_profiles')) ? true : false);
+
+ $theirs = q("select * from abconfig where chan = %d and xchan = '%s' and cat = 'their_perms'",
+ intval(local_channel()),
+ dbesc($contact['abook_xchan'])
+ );
+
+ $their_perms = [];
+ if ($theirs) {
+ foreach ($theirs as $t) {
+ $their_perms[$t['k']] = $t['v'];
+ }
+ }
+
+ foreach ($global_perms as $k => $v) {
+ $thisperm = $existing[$k];
+ $checkinherited = PermissionLimits::Get(local_channel(), $k);
+ $perms[] = ['perms_' . $k, $v, ((array_key_exists($k, $their_perms)) ? intval($their_perms[$k]) : ''), $thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '0' : '1'), '', $checkinherited];
+ }
+
+ $pcat = new Permcat(local_channel());
+ $pcatlist = $pcat->listing();
+ $default_role = get_pconfig(local_channel(), 'system', 'default_permcat');
+ $current_permcat = (($contact['abook_pending']) ? $default_role : $contact['abook_role']);
+
+ $roles_dict = [];
+ foreach ($pcatlist as $role) {
+ $roles_dict[$role['name']] = $role['localname'];
+ }
+
+
+ if (!$current_permcat) {
+ notice(t('Please select a role for this contact!') . EOL);
+ $permcats[] = '';
+ }
+
+ if ($pcatlist) {
+ foreach ($pcatlist as $pc) {
+ $permcats[$pc['name']] = $pc['localname'];
+ }
+ }
+
+ $locstr = locations_by_netid($contact['xchan_hash']);
+ if (!$locstr) {
+ $locstr = unpunify($contact['xchan_url']);
+ }
+
+ $clone_warn = '';
+ $clonable = in_array($contact['xchan_network'], ['zot6', 'rss']);
+ if (!$clonable) {
+ $clone_warn = '<strong>';
+ $clone_warn .= ((intval($contact['abook_not_here']))
+ ? t('This contact is unreachable from this location.')
+ : t('This contact may be unreachable from other channel locations.')
+ );
+ $clone_warn .= '</strong><br>' . t('Location independence is not supported by their network.');
+ }
+
+ $header_card = '<img src="' . $contact['xchan_photo_s'] . '" class="rounded" style="width: 3rem; height: 3rem;">&nbsp; ' . $contact['xchan_name'];
+
+ $header_html = replace_macros(get_markup_template("contact_edit_header.tpl"), [
+ '$img_src' => $contact['xchan_photo_s'],
+ '$name' => $contact['xchan_name'],
+ '$addr' => (($contact['xchan_addr']) ? $contact['xchan_addr'] : $contact['xchan_url']),
+ '$href' => ((is_matrix_url($contact['xchan_url'])) ? zid($contact['xchan_url']) : $contact['xchan_url']),
+ '$link_label' => t('View profile'),
+ '$is_group' => $contact['xchan_pubforum'],
+ '$group_label' => t('This is a group/forum channel')
+ ]);
+
+ $tools_html = replace_macros(get_markup_template("contact_edit_tools.tpl"), [
+ '$tools_label' => t('Contact Tools'),
+ '$tools' => $this->get_tools($contact),
+ ]);
+
+ $tpl = get_markup_template("contact_edit.tpl");
+
+ $o = replace_macros($tpl, [
+ '$permcat' => ['permcat', t('Select a role for this contact'), $current_permcat, '', $permcats],
+ '$permcat_new' => t('Contact roles'),
+ '$permcat_value' => bin2hex($current_permcat),
+// '$addr' => unpunify($contact['xchan_addr']),
+// '$primeurl' => unpunify($contact['xchan_url']),
+ '$section' => $section,
+ '$sub_section' => $sub_section,
+ '$groups' => $groups,
+// '$addr_text' => t('This contacts\'s primary address is'),
+// '$loc_text' => t('Available locations:'),
+// '$locstr' => $locstr,
+// '$unclonable' => $clone_warn,
+ '$lbl_slider' => t('Slide to adjust your degree of friendship'),
+ '$connfilter' => feature_enabled(local_channel(), 'connfilter'),
+ '$connfilter_label' => t('Custom Filter'),
+ '$incl' => ['abook_incl', t('Only import posts with this text'), $contact['abook_incl'], t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')],
+ '$excl' => ['abook_excl', t('Do not import posts with this text'), $contact['abook_excl'], t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')],
+ '$slide' => $slide,
+// '$pending_label' => t('Contact Pending Approval'),
+// '$is_pending' => (intval($contact['abook_pending']) ? 1 : ''),
+// '$unapproved' => $unapproved,
+ '$submit' => ((intval($contact['abook_pending'])) ? t('Approve contact') : t('Submit')),
+ '$close' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 80),
+ '$them' => t('Their'),
+ '$me' => t('My'),
+ '$perms' => $perms,
+// '$lastupdtext' => t('Last update:'),
+// '$last_update' => relative_date($contact['abook_connected']),
+ '$profile_select' => contact_profile_assign($contact['abook_profile']),
+ '$multiprofs' => $multiprofs,
+ '$contact_id' => $contact['abook_id'],
+// '$name' => $contact['xchan_name'],
+ ]);
+
+ $arr = ['contact' => $contact, 'output' => $o];
+
+ call_hooks('contact_edit', $arr);
+
+ if (is_ajax()) {
+ json_return_and_die([
+ 'success' => ((intval($_REQUEST['success'])) ? intval($_REQUEST['success']) : 1),
+ 'message' => (($_REQUEST['success']) ? t('Contact updated') : t('Contact update failed')),
+ 'id' => $contact_id,
+ 'title' => $header_html,
+ 'role' => ((intval($contact['abook_pending'])) ? '' : $roles_dict[$current_permcat]),
+ 'body' => $arr['output'],
+ 'tools' => $tools_html,
+ 'submit' => ((intval($contact['abook_pending'])) ? t('Approve connection') : t('Submit')),
+ 'pending' => intval($contact['abook_pending'])
+ ]);
+ }
+
+ return $arr['output'];
+
+ }
+
+ function contactedit_clone() {
+
+ if (!App::$poi)
+ return;
+
+ $channel = App::get_channel();
+
+ $clone = App::$poi;
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($channel['channel_id'], $clone['abook_xchan']);
+ if ($abconfig)
+ $clone['abconfig'] = $abconfig;
+
+ Libsync::build_sync_packet(0 /* use the current local_channel */, ['abook' => [$clone]]);
+ }
+
+ function do_action($contact, $cmd) {
+ $ret = [
+ 'sucess' => false,
+ 'message' => ''
+ ];
+
+ if ($cmd === 'resetphoto') {
+ q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
+ dbesc($contact['xchan_hash'])
+ );
+ $cmd = 'refresh';
+ }
+
+ if ($cmd === 'refresh') {
+ if ($contact['xchan_network'] === 'zot6') {
+ if (Libzot::refresh($contact, App::get_channel())) {
+ $ret['success'] = true;
+ $ret['message'] = t('Refresh succeeded');
+ }
+ else {
+ $ret['message'] = t('Refresh failed - channel is currently unavailable');
+ }
+ }
+ else {
+ // if you are on a different network we'll force a refresh of the connection basic info
+ Master::Summon(['Notifier', 'permission_update', $contact['abook_id']]);
+ $ret['success'] = true;
+ $ret['message'] = t('Refresh succeeded');
+ }
+
+ return $ret;
+ }
+
+ if ($cmd === 'block') {
+ if (abook_toggle_flag($contact, ABOOK_FLAG_BLOCKED)) {
+ $this->init(); // refresh data
+
+ $this->contactedit_clone();
+ $ret['success'] = true;
+ $ret['message'] = t('Block status updated');
+ }
+ else {
+ $ret['success'] = false;
+ $ret['message'] = t('Block failed');
+ }
+ return $ret;
+ }
+
+ if ($cmd === 'ignore') {
+ if (abook_toggle_flag($contact, ABOOK_FLAG_IGNORED)) {
+ $this->init(); // refresh data
+
+ $this->contactedit_clone();
+ $ret['success'] = true;
+ $ret['message'] = t('Ignore status updated');
+ }
+ else {
+ $ret['success'] = false;
+ $ret['message'] = t('Ignore failed');
+ }
+ return $ret;
+ }
+
+ if ($cmd === 'archive') {
+ if (abook_toggle_flag($contact, ABOOK_FLAG_ARCHIVED)) {
+ $this->init(); // refresh data
+
+ $this->contactedit_clone();
+ $ret['success'] = true;
+ $ret['message'] = t('Archive status updated');
+ }
+ else {
+ $ret['success'] = false;
+ $ret['message'] = t('Archive failed');
+ }
+ return $ret;
+ }
+
+ if ($cmd === 'hide') {
+ if (abook_toggle_flag($contact, ABOOK_FLAG_HIDDEN)) {
+ $this->init(); // refresh data
+
+ $this->contactedit_clone();
+ $ret['success'] = true;
+ $ret['message'] = t('Hide status updated');
+ }
+ else {
+ $ret['success'] = false;
+ $ret['message'] = t('Hide failed');
+ }
+ return $ret;
+ }
+
+ // We'll prevent somebody from unapproving an already approved contact.
+ // Though maybe somebody will want this eventually (??)
+
+ //if ($cmd === 'approve') {
+ //if (intval($contact['abook_pending'])) {
+ //if (abook_toggle_flag($contact, ABOOK_FLAG_PENDING)) {
+ //$this->contactedit_clone();
+ //}
+ //else
+ //notice(t('Unable to set address book parameters.') . EOL);
+ //}
+ //goaway(z_root() . '/connedit/' . $contact_id);
+ //}
+
+
+ if ($cmd === 'drop') {
+
+ if (contact_remove(local_channel(), $contact['abook_id'])) {
+
+ Master::Summon(['Notifier', 'purge', local_channel(), $contact['xchan_hash']]);
+ Libsync::build_sync_packet(0 /* use the current local_channel */,
+ ['abook' => [
+ [
+ 'abook_xchan' => $contact['abook_xchan'],
+ 'entry_deleted' => true
+ ]
+ ]
+ ]);
+
+ $ret['success'] = true;
+ $ret['message'] = t('Contact removed');
+ }
+ else {
+ $ret['success'] = false;
+ $ret['message'] = t('Delete failed');
+ }
+ return $ret;
+ }
+ }
+
+ function get_tools($contact) {
+ return [
+
+ 'refresh' => [
+ 'label' => t('Refresh Permissions'),
+ 'title' => t('Fetch updated permissions'),
+ ],
+
+ 'rephoto' => [
+ 'label' => t('Refresh Photo'),
+ 'title' => t('Fetch updated photo'),
+ ],
+
+
+ 'block' => [
+ 'label' => (intval($contact['abook_blocked']) ? t('Unblock') : t('Block')),
+ 'sel' => (intval($contact['abook_blocked']) ? 'active' : ''),
+ 'title' => t('Block (or Unblock) all communications with this connection'),
+ 'info' => (intval($contact['abook_blocked']) ? t('This connection is blocked!') : ''),
+ ],
+
+ 'ignore' => [
+ 'label' => (intval($contact['abook_ignored']) ? t('Unignore') : t('Ignore')),
+ 'sel' => (intval($contact['abook_ignored']) ? 'active' : ''),
+ 'title' => t('Ignore (or Unignore) all inbound communications from this connection'),
+ 'info' => (intval($contact['abook_ignored']) ? t('This connection is ignored!') : ''),
+ ],
+
+ 'archive' => [
+ 'label' => (intval($contact['abook_archived']) ? t('Unarchive') : t('Archive')),
+ 'sel' => (intval($contact['abook_archived']) ? 'active' : ''),
+ 'title' => t('Archive (or Unarchive) this connection - mark channel dead but keep content'),
+ 'info' => (intval($contact['abook_archived']) ? t('This connection is archived!') : ''),
+ ],
+
+ 'hide' => [
+ 'label' => (intval($contact['abook_hidden']) ? t('Unhide') : t('Hide')),
+ 'sel' => (intval($contact['abook_hidden']) ? 'active' : ''),
+ 'title' => t('Hide or Unhide this connection from your other connections'),
+ 'info' => (intval($contact['abook_hidden']) ? t('This connection is hidden!') : ''),
+ ],
+
+ 'delete' => [
+ 'label' => t('Delete'),
+ 'sel' => '',
+ 'title' => t('Delete this connection'),
+ ],
+
+ ];
+ }
+
+}
diff --git a/Zotlabs/Module/Contactgroup.php b/Zotlabs/Module/Contactgroup.php
index 36aaf7da0..3e88179fb 100644
--- a/Zotlabs/Module/Contactgroup.php
+++ b/Zotlabs/Module/Contactgroup.php
@@ -1,17 +1,17 @@
<?php
namespace Zotlabs\Module;
-require_once('include/group.php');
+use Zotlabs\Lib\AccessList;
+use Zotlabs\Web\Controller;
-
-class Contactgroup extends \Zotlabs\Web\Controller {
+class Contactgroup extends Controller {
function get() {
-
+
if(! local_channel()) {
killme();
}
-
+
if((argc() > 2) && (intval(argv(1))) && (argv(2))) {
$r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1",
dbesc(base64url_decode(argv(2))),
@@ -20,9 +20,9 @@ class Contactgroup extends \Zotlabs\Web\Controller {
if($r)
$change = $r[0]['abook_xchan'];
}
-
+
if((argc() > 1) && (intval(argv(1)))) {
-
+
$r = q("SELECT * FROM pgrp WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
@@ -30,25 +30,25 @@ class Contactgroup extends \Zotlabs\Web\Controller {
if(! $r) {
killme();
}
-
+
$group = $r[0];
- $members = group_get_members($group['id']);
+ $members = AccessList::members(local_channel(), $group['id']);
$preselected = array();
if(count($members)) {
foreach($members as $member)
$preselected[] = $member['xchan_hash'];
}
-
+
if($change) {
if(in_array($change,$preselected)) {
- group_rmv_member(local_channel(),$group['gname'],$change);
+ AccessList::member_remove(local_channel(),$group['gname'],$change);
}
else {
- group_add_member(local_channel(),$group['gname'],$change);
+ AccessList::member_add(local_channel(),$group['gname'],$change);
}
}
}
-
+
killme();
}
}
diff --git a/Zotlabs/Module/Defperms.php b/Zotlabs/Module/Defperms.php
index 309a5a65a..70270d36b 100644
--- a/Zotlabs/Module/Defperms.php
+++ b/Zotlabs/Module/Defperms.php
@@ -8,7 +8,6 @@ use Zotlabs\Lib\Libsync;
require_once('include/socgraph.php');
require_once('include/selectors.php');
-require_once('include/group.php');
require_once('include/photos.php');
class Defperms extends Controller {
@@ -23,8 +22,8 @@ class Defperms extends Controller {
if(! local_channel())
return;
- if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
- return;
+ //if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
+ // return;
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
@@ -50,8 +49,8 @@ class Defperms extends Controller {
if(! local_channel())
return;
- if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
- return;
+ //if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
+ // return;
$contact_id = intval(argv(1));
if(! $contact_id)
@@ -183,12 +182,12 @@ class Defperms extends Controller {
return login();
}
- if(! Apps::system_app_installed(local_channel(), 'Default Permissions')) {
- //Do not display any associated widgets at this point
- App::$pdl = '';
- $papp = Apps::get_papp('Default Permissions');
- return Apps::app_render($papp, 'module');
- }
+ //~ if(! Apps::system_app_installed(local_channel(), 'Default Permissions')) {
+ //~ //Do not display any associated widgets at this point
+ //~ App::$pdl = '';
+ //~ $papp = Apps::get_papp('Default Permissions');
+ //~ return Apps::app_render($papp, 'module');
+ //~ }
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = App::get_channel();
diff --git a/Zotlabs/Module/Follow.php b/Zotlabs/Module/Follow.php
index 4fe20f56b..94daa4c70 100644
--- a/Zotlabs/Module/Follow.php
+++ b/Zotlabs/Module/Follow.php
@@ -108,7 +108,7 @@ class Follow extends Controller {
}
Libsync::build_sync_packet(0, [ 'abook' => [ $clone ] ], true);
- $can_view_stream = their_perms_contains($channel['channel_id'],$clone['abook_xchan'],'view_stream');
+ $can_view_stream = intval(get_abconfig($channel['channel_id'], $clone['abook_xchan'], 'their_perms', 'view_stream'));
// If we can view their stream, pull in some posts
@@ -117,7 +117,7 @@ class Follow extends Controller {
}
if ($interactive) {
- goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?follow=1');
+ goaway(z_root() . '/connections#' . $result['abook']['abook_id']);
}
else {
json_return_and_die([ 'success' => true ]);
diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php
index a2d55a325..1dce08757 100644
--- a/Zotlabs/Module/Group.php
+++ b/Zotlabs/Module/Group.php
@@ -5,8 +5,7 @@ use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
use Zotlabs\Lib\Libsync;
-
-require_once('include/group.php');
+use Zotlabs\Lib\AccessList;
class Group extends Controller {
@@ -41,16 +40,17 @@ class Group extends Controller {
$name = notags(trim($_POST['groupname']));
$public = intval($_POST['public']);
- $r = group_add(local_channel(),$name,$public);
+ $r = AccessList::add(local_channel(),$name,$public);
+ $group_hash = $r;
+
if($r) {
info( t('Privacy group created.') . EOL );
}
else {
notice( t('Could not create privacy group.') . EOL );
}
- goaway(z_root() . '/group');
-
}
+
if((argc() == 2) && (intval(argv(1)))) {
check_form_security_token_redirectOnErr('/group', 'group_edit');
@@ -65,10 +65,11 @@ class Group extends Controller {
}
$group = $r[0];
$groupname = notags(trim($_POST['groupname']));
+ $group_hash = $group['hash'];
$public = intval($_POST['public']);
$hookinfo = [ 'pgrp_extras' => '', 'group'=>$group['id'] ];
- call_hooks ('privacygroup_extras_post',$hookinfo);
+ call_hooks('privacygroup_extras_post',$hookinfo);
if((strlen($groupname)) && (($groupname != $group['gname']) || ($public != $group['visible']))) {
$r = q("UPDATE pgrp SET gname = '%s', visible = %d WHERE uid = %d AND id = %d",
@@ -79,13 +80,25 @@ class Group extends Controller {
);
if($r)
info( t('Privacy group updated.') . EOL );
+ }
+ }
+ $channel = App::get_channel();
- Libsync::build_sync_packet(local_channel(),null,true);
- }
+ $default_group = ((isset($_POST['set_default_group'])) ? $group_hash : (($channel['channel_default_group'] === $group_hash) ? '' : $channel['channel_default_group']));
+ $default_acl = ((isset($_POST['set_default_acl'])) ? '<' . $group_hash . '>' : (($channel['channel_allow_gid'] === '<' . $group_hash . '>') ? '' : $channel['channel_allow_gid']));
+
+ q("update channel set channel_default_group = '%s', channel_allow_gid = '%s'
+ where channel_id = %d",
+ dbesc($default_group),
+ dbesc($default_acl),
+ intval(local_channel())
+ );
+
+ Libsync::build_sync_packet(local_channel(),null,true);
+
+ goaway(z_root() . '/group/' . argv(1) . ((argv(2)) ? '/' . argv(2) : ''));
- goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
- }
return;
}
@@ -117,51 +130,32 @@ class Group extends Controller {
if((argc() == 1) || ((argc() == 2) && (argv(1) === 'new'))) {
- $new = (((argc() == 2) && (argv(1) === 'new')) ? true : false);
-
- $groups = q("SELECT id, gname FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
- intval(local_channel())
- );
-
- $i = 0;
- foreach($groups as $group) {
- $entries[$i]['name'] = $group['gname'];
- $entries[$i]['id'] = $group['id'];
- $entries[$i]['count'] = count(group_get_members($group['id']));
- $i++;
- }
-
$hookinfo = [ 'pgrp_extras' => '', 'group'=>argv(1) ];
call_hooks ('privacygroup_extras',$hookinfo);
$pgrp_extras = $hookinfo['pgrp_extras'];
+ $is_default_acl = ['set_default_acl', t('Post to this group by default'), 0, '', [t('No'), t('Yes')]];
+ $is_default_group = ['set_default_group', t('Add new contacts to this group by default'), 0, '', [t('No'), t('Yes')]];
+
+
$tpl = get_markup_template('privacy_groups.tpl');
$o = replace_macros($tpl, [
'$title' => t('Privacy Groups'),
- '$add_new_label' => t('Add Group'),
- '$new' => $new,
// new group form
'$gname' => array('groupname',t('Privacy group name')),
- '$public' => array('public',t('Members are visible to other channels'), false),
+ '$public' => array('public',t('Members are visible to other channels'), 0, '', [t('No'), t('Yes')]),
'$pgrp_extras' => $pgrp_extras,
'$form_security_token' => get_form_security_token("group_edit"),
'$submit' => t('Submit'),
-
- // groups list
- '$title' => t('Privacy Groups'),
- '$name_label' => t('Name'),
- '$count_label' => t('Members'),
- '$entries' => $entries
+ '$is_default_acl' => $is_default_acl,
+ '$is_default_group' => $is_default_group,
]);
return $o;
}
-
-
-
$context = array('$submit' => t('Submit'));
$tpl = get_markup_template('group_edit.tpl');
@@ -174,7 +168,7 @@ class Group extends Controller {
intval(local_channel())
);
if($r)
- $result = group_rmv(local_channel(),$r[0]['gname']);
+ $result = AccessList::remove(local_channel(),$r[0]['gname']);
if($result) {
$hookinfo = [ 'pgrp_extras' => '', 'group' => argv(2) ];
call_hooks ('privacygroup_extras_drop',$hookinfo);
@@ -215,7 +209,7 @@ class Group extends Controller {
$group = $r[0];
- $members = group_get_members($group['id']);
+ $members = AccessList::members(local_channel(), $group['id']);
$preselected = array();
if(count($members)) {
@@ -227,13 +221,13 @@ class Group extends Controller {
if($change) {
if(in_array($change,$preselected)) {
- group_rmv_member(local_channel(),$group['gname'],$change);
+ AccessList::member_remove(local_channel(),$group['gname'],$change);
}
else {
- group_add_member(local_channel(),$group['gname'],$change);
+ AccessList::member_add(local_channel(),$group['gname'],$change);
}
- $members = group_get_members($group['id']);
+ $members = AccessList::members(local_channel(), $group['id']);
$preselected = array();
if(count($members)) {
@@ -252,9 +246,9 @@ class Group extends Controller {
'$gname' => array('groupname',t('Privacy group name: '),$group['gname'], ''),
'$gid' => $group['id'],
'$drop' => $drop_txt,
- '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
+ '$public' => array('public',t('Members are visible to other channels'), $group['visible'], '', [t('No'), t('Yes')]),
'$form_security_token_edit' => get_form_security_token('group_edit'),
- '$delete' => t('Delete Group'),
+ '$delete' => t('Delete'),
'$form_security_token_drop' => get_form_security_token("group_drop"),
'$pgrp_extras' => $pgrp_extras,
);
@@ -280,7 +274,7 @@ class Group extends Controller {
$groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
}
else
- group_rmv_member(local_channel(),$group['gname'],$member['xchan_hash']);
+ AccessList::member_remove(local_channel(),$group['gname'],$member['xchan_hash']);
}
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
@@ -302,6 +296,12 @@ class Group extends Controller {
$context['$desc'] = t('Click a channel to toggle membership');
$context['$pgrp_extras'] = $pgrp_extras;
+ $channel = App::get_channel();
+
+ $context['$is_default_acl'] = ['set_default_acl', t('Post to this group by default'), intval($group['hash'] === trim($channel['channel_allow_gid'], '<>')), '', [t('No'), t('Yes')]];
+ $context['$is_default_group'] = ['set_default_group', t('Add new contacts to this group by default'), intval($group['hash'] === $channel['channel_default_group']), '', [t('No'), t('Yes')]];
+
+
if($change) {
$tpl = get_markup_template('groupeditor.tpl');
echo replace_macros($tpl, $context);
diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php
index e05027d9f..869de2669 100644
--- a/Zotlabs/Module/Impel.php
+++ b/Zotlabs/Module/Impel.php
@@ -1,5 +1,9 @@
<?php
-namespace Zotlabs\Module; /** @file */
+namespace Zotlabs\Module;
+
+use URLify;
+
+/** @file */
// import page design element
@@ -9,33 +13,33 @@ require_once('include/menu.php');
class Impel extends \Zotlabs\Web\Controller {
function init() {
-
+
$ret = array('success' => false);
-
+
if(! local_channel())
json_return_and_die($ret);
-
+
logger('impel: ' . print_r($_REQUEST,true), LOGGER_DATA);
-
+
$elm = $_REQUEST['element'];
$x = base64url_decode($elm);
if(! $x)
json_return_and_die($ret);
-
+
$j = json_decode($x,true);
if(! $j)
json_return_and_die($ret);
-
+
// logger('element: ' . print_r($j,true));
$channel = \App::get_channel();
-
+
$arr = array();
$is_menu = false;
-
+
// a portable menu has its links rewritten with the local baseurl
$portable_menu = false;
-
+
switch($j['type']) {
case 'webpage':
$arr['item_type'] = ITEM_TYPE_WEBPAGE;
@@ -58,12 +62,12 @@ class Impel extends \Zotlabs\Web\Controller {
case 'menu':
$is_menu = true;
$installed_type = t('menu');
- break;
+ break;
default:
logger('mod_impel: unrecognised element type' . print_r($j,true));
break;
}
-
+
if($is_menu) {
$m = array();
$m['menu_channel_id'] = local_channel();
@@ -73,23 +77,23 @@ class Impel extends \Zotlabs\Web\Controller {
$m['menu_created'] = datetime_convert($j['created']);
if($j['edited'])
$m['menu_edited'] = datetime_convert($j['edited']);
-
+
$m['menu_flags'] = 0;
if($j['flags']) {
if(in_array('bookmark',$j['flags']))
$m['menu_flags'] |= MENU_BOOKMARK;
if(in_array('system',$j['flags']))
$m['menu_flags'] |= MENU_SYSTEM;
-
+
}
-
+
$menu_id = menu_create($m);
-
+
if($menu_id) {
if(is_array($j['items'])) {
foreach($j['items'] as $it) {
$mitem = array();
-
+
$mitem['mitem_link'] = str_replace('[channelurl]',z_root() . '/channel/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[pageurl]',z_root() . '/page/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[cloudurl]',z_root() . '/cloud/' . $channel['channel_address'],$it['link']);
@@ -115,7 +119,7 @@ class Impel extends \Zotlabs\Web\Controller {
intval(local_channel())
);
}
- }
+ }
$ret['success'] = true;
}
$x = $ret;
@@ -132,22 +136,21 @@ class Impel extends \Zotlabs\Web\Controller {
$arr['owner_xchan'] = get_observer_hash();
$arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash());
$arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode');
-
+
if(! $j['mid']) {
$j['uuid'] = item_message_id();
$j['mid'] = z_root() . '/item/' . $j['uuid'];
}
$arr['uuid'] = $j['uuid'];
$arr['mid'] = $arr['parent_mid'] = $j['mid'];
-
-
+
+
if($j['pagetitle']) {
- require_once('library/urlify/URLify.php');
- $pagetitle = strtolower(\URLify::transliterate($j['pagetitle']));
+ $pagetitle = strtolower(URLify::transliterate($j['pagetitle']));
}
-
+
// Verify ability to use html or php!!!
-
+
$execflag = ((intval($channel['channel_id']) == intval(local_channel()) && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
$i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
@@ -156,7 +159,7 @@ class Impel extends \Zotlabs\Web\Controller {
);
\Zotlabs\Lib\IConfig::Set($arr,'system',$namespace,(($pagetitle) ? $pagetitle : substr($arr['mid'],0,16)),true);
-
+
if($i) {
$arr['id'] = $i[0]['id'];
// don't update if it has the same timestamp as the original
@@ -174,24 +177,24 @@ class Impel extends \Zotlabs\Web\Controller {
else
$x = item_store($arr,$execflag);
}
-
+
if($x && $x['success']) {
$item_id = $x['item_id'];
}
}
-
+
if($x['success']) {
$ret['success'] = true;
- info( sprintf( t('%s element installed'), $installed_type));
+ info( sprintf( t('%s element installed'), $installed_type));
}
else {
- notice( sprintf( t('%s element installation failed'), $installed_type));
+ notice( sprintf( t('%s element installation failed'), $installed_type));
}
-
- //??? should perhaps return ret?
+
+ //??? should perhaps return ret?
json_return_and_die(true);
-
+
}
-
+
}
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index c4c844b25..ec47e370b 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -5,14 +5,12 @@ namespace Zotlabs\Module;
require_once('include/channel.php');
require_once('include/import.php');
require_once('include/perm_upgrade.php');
-require_once('library/urlify/URLify.php');
use App;
+use URLify;
use Zotlabs\Daemon\Master;
use Zotlabs\Lib\Libzot;
use Zotlabs\Web\Controller;
-use Zotlabs\Web\HTTPSig;
-use Zotlabs\Lib\PConfig;
/**
@@ -35,17 +33,17 @@ class Import extends Controller {
return;
}
- $max_friends = account_service_class_fetch($account_id, 'total_channels');
- $max_feeds = account_service_class_fetch($account_id, 'total_feeds');
- $data = null;
- $seize = ((x($_REQUEST, 'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
+ $max_friends = account_service_class_fetch($account_id, 'total_channels');
+ $max_feeds = account_service_class_fetch($account_id, 'total_feeds');
+ $data = null;
+ $seize = ((x($_REQUEST, 'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
$import_posts = ((x($_REQUEST, 'import_posts')) ? intval($_REQUEST['import_posts']) : 0);
- $moving = false; //intval($_REQUEST['moving']);
- $src = $_FILES['filename']['tmp_name'];
- $filename = basename($_FILES['filename']['name']);
- $filesize = intval($_FILES['filename']['size']);
- $filetype = $_FILES['filename']['type'];
- $newname = trim(strtolower($_REQUEST['newname']));
+ $moving = false; //intval($_REQUEST['moving']);
+ $src = $_FILES['filename']['tmp_name'];
+ $filename = basename($_FILES['filename']['name']);
+ $filesize = intval($_FILES['filename']['size']);
+ $filetype = $_FILES['filename']['type'];
+ $newname = trim(strtolower($_REQUEST['newname']));
// import channel from file
if ($src) {
@@ -71,16 +69,17 @@ class Import extends Controller {
logger('Nothing to import.');
notice(t('Nothing to import.') . EOL);
return;
- } else if (strpos($old_address, '@')) {
+ }
+ else if (strpos($old_address, '@')) {
// if you copy the identity address from your profile page, make it work for convenience - WARNING: this is a utf-8 variant and NOT an ASCII ampersand. Please do not edit.
$old_address = str_replace('@', '@', $old_address);
}
- $email = ((x($_REQUEST, 'email')) ? $_REQUEST['email'] : '');
+ $email = ((x($_REQUEST, 'email')) ? $_REQUEST['email'] : '');
$password = ((x($_REQUEST, 'password')) ? $_REQUEST['password'] : '');
$channelname = substr($old_address, 0, strpos($old_address, '@'));
- $servername = substr($old_address, strpos($old_address, '@') + 1);
+ $servername = substr($old_address, strpos($old_address, '@') + 1);
$api_path = probe_api_path($servername);
if (!$api_path) {
@@ -90,13 +89,14 @@ class Import extends Controller {
$api_path .= 'channel/export/basic?f=&channel=' . $channelname;
- $binary = false;
+ $binary = false;
$redirects = 0;
- $opts = array('http_auth' => $email . ':' . $password);
- $ret = z_fetch_url($api_path, $binary, $redirects, $opts);
+ $opts = ['http_auth' => $email . ':' . $password];
+ $ret = z_fetch_url($api_path, $binary, $redirects, $opts);
if ($ret['success']) {
$data = $ret['body'];
- } else {
+ }
+ else {
notice(t('Unable to download data from old server') . EOL);
return;
}
@@ -173,14 +173,15 @@ class Import extends Controller {
}
if ((!$x) || strlen($x) > 64) {
- $x = strtolower(\URLify::transliterate($newname));
+ $x = strtolower(URLify::transliterate($newname));
}
$newname = $x;
}
$channel = import_channel($data['channel'], $account_id, $seize, $newname);
- } else {
- $moving = false;
+ }
+ else {
+ $moving = false;
$channel = App::get_channel();
}
@@ -216,20 +217,20 @@ class Import extends Controller {
$r = hubloc_store_lowlevel(
[
- 'hubloc_guid' => $channel['channel_guid'],
+ 'hubloc_guid' => $channel['channel_guid'],
'hubloc_guid_sig' => $channel['channel_guid_sig'],
- 'hubloc_hash' => $channel['channel_hash'],
- 'hubloc_addr' => channel_reddress($channel),
- 'hubloc_network' => 'zot6',
- 'hubloc_primary' => (($seize) ? 1 : 0),
- 'hubloc_url' => z_root(),
- 'hubloc_url_sig' => Libzot::sign(z_root(),$channel['channel_prvkey']),
- 'hubloc_host' => App::get_hostname(),
+ 'hubloc_hash' => $channel['channel_hash'],
+ 'hubloc_addr' => channel_reddress($channel),
+ 'hubloc_network' => 'zot6',
+ 'hubloc_primary' => (($seize) ? 1 : 0),
+ 'hubloc_url' => z_root(),
+ 'hubloc_url_sig' => Libzot::sign(z_root(), $channel['channel_prvkey']),
+ 'hubloc_host' => App::get_hostname(),
'hubloc_callback' => z_root() . '/zot',
- 'hubloc_sitekey' => get_config('system', 'pubkey'),
- 'hubloc_updated' => datetime_convert(),
- 'hubloc_id_url' => channel_url($channel),
- 'hubloc_site_id' => Libzot::make_xchan_hash(z_root(), get_config('system', 'pubkey'))
+ 'hubloc_sitekey' => get_config('system', 'pubkey'),
+ 'hubloc_updated' => datetime_convert(),
+ 'hubloc_id_url' => channel_url($channel),
+ 'hubloc_site_id' => Libzot::make_xchan_hash(z_root(), get_config('system', 'pubkey'))
]
);
@@ -257,21 +258,21 @@ class Import extends Controller {
$r = xchan_store_lowlevel(
[
- 'xchan_hash' => $channel['channel_hash'],
- 'xchan_guid' => $channel['channel_guid'],
- 'xchan_guid_sig' => $channel['channel_guid_sig'],
- 'xchan_pubkey' => $channel['channel_pubkey'],
- 'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
- 'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
- 'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
- 'xchan_addr' => channel_reddress($channel),
- 'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
- 'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
- 'xchan_follow' => z_root() . '/follow?f=&url=%s',
- 'xchan_name' => $channel['channel_name'],
- 'xchan_network' => 'zot6',
+ 'xchan_hash' => $channel['channel_hash'],
+ 'xchan_guid' => $channel['channel_guid'],
+ 'xchan_guid_sig' => $channel['channel_guid_sig'],
+ 'xchan_pubkey' => $channel['channel_pubkey'],
+ 'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
+ 'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
+ 'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
+ 'xchan_addr' => channel_reddress($channel),
+ 'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
+ 'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
+ 'xchan_follow' => z_root() . '/follow?f=&url=%s',
+ 'xchan_name' => $channel['channel_name'],
+ 'xchan_network' => 'zot6',
'xchan_photo_date' => datetime_convert(),
- 'xchan_name_date' => datetime_convert()
+ 'xchan_name_date' => datetime_convert()
]
);
@@ -293,13 +294,13 @@ class Import extends Controller {
}
if (!array_key_exists('xchan_hidden', $xchan)) {
- $xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
- $xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
- $xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
+ $xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
+ $xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
+ $xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
$xchan['xchan_selfcensored'] = (($xchan['xchan_flags'] & 0x0008) ? 1 : 0);
- $xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
- $xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
- $xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
+ $xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
+ $xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
+ $xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
}
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
@@ -319,7 +320,8 @@ class Import extends Controller {
dbesc(z_root() . '/photo/profile/s/' . $channel['channel_id']),
dbesc($xchan['xchan_hash'])
);
- } else {
+ }
+ else {
$photos = import_xchan_photo($xchan['xchan_photo_l'], $xchan['xchan_hash']);
if ($photos[4])
$photodate = NULL_DATE;
@@ -348,7 +350,7 @@ class Import extends Controller {
}
$friends = 0;
- $feeds = 0;
+ $feeds = 0;
// import contacts
$abooks = $data['abook'];
@@ -372,14 +374,14 @@ class Import extends Controller {
$abook['abook_account'] = $account_id;
$abook['abook_channel'] = $channel['channel_id'];
if (!array_key_exists('abook_blocked', $abook)) {
- $abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001) ? 1 : 0);
- $abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002) ? 1 : 0);
- $abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004) ? 1 : 0);
- $abook['abook_archived'] = (($abook['abook_flags'] & 0x0008) ? 1 : 0);
- $abook['abook_pending'] = (($abook['abook_flags'] & 0x0010) ? 1 : 0);
+ $abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001) ? 1 : 0);
+ $abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002) ? 1 : 0);
+ $abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004) ? 1 : 0);
+ $abook['abook_archived'] = (($abook['abook_flags'] & 0x0008) ? 1 : 0);
+ $abook['abook_pending'] = (($abook['abook_flags'] & 0x0010) ? 1 : 0);
$abook['abook_unconnected'] = (($abook['abook_flags'] & 0x0020) ? 1 : 0);
- $abook['abook_self'] = (($abook['abook_flags'] & 0x0080) ? 1 : 0);
- $abook['abook_feed'] = (($abook['abook_flags'] & 0x0100) ? 1 : 0);
+ $abook['abook_self'] = (($abook['abook_flags'] & 0x0080) ? 1 : 0);
+ $abook['abook_feed'] = (($abook['abook_flags'] & 0x0100) ? 1 : 0);
}
if (array_key_exists('abook_instance', $abook) && $abook['abook_instance'] && strpos($abook['abook_instance'], z_root()) === false) {
@@ -393,7 +395,8 @@ class Import extends Controller {
dbesc($abook['abook_xchan'])
);
}
- } else {
+ }
+ else {
if ($max_friends !== false && $friends > $max_friends)
continue;
if ($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
@@ -413,7 +416,8 @@ class Import extends Controller {
intval($channel['channel_id'])
);
}
- } else {
+ }
+ else {
abook_store_lowlevel($abook);
$friends++;
@@ -438,9 +442,9 @@ class Import extends Controller {
// import groups
$groups = $data['group'];
if ($groups) {
- $saved = array();
+ $saved = [];
foreach ($groups as $group) {
- $saved[$group['hash']] = array('old' => $group['id']);
+ $saved[$group['hash']] = ['old' => $group['id']];
if (array_key_exists('name', $group)) {
$group['gname'] = $group['name'];
unset($group['name']);
@@ -507,7 +511,7 @@ class Import extends Controller {
if (is_array($data['webpages']))
import_items($channel, $data['webpages'], false, $relocate);
- $addon = array('channel' => $channel, 'data' => $data);
+ $addon = ['channel' => $channel, 'data' => $data];
call_hooks('import_channel', $addon);
if ($import_posts && array_key_exists('item', $data) && $data['item']) {
@@ -515,10 +519,10 @@ class Import extends Controller {
}
// Immediately notify old server about the new clone
- Master::Summon( [ 'Notifier', 'refresh_all', $channel['channel_id'] ] );
+ Master::Summon(['Notifier', 'refresh_all', $channel['channel_id']]);
// This will indirectly perform a refresh_all *and* update the directory
- Master::Summon(array('Directory', $channel['channel_id']));
+ Master::Summon(['Directory', $channel['channel_id']]);
$cf_api_compat = true;
@@ -529,14 +533,14 @@ class Import extends Controller {
$hz_server = $m['scheme'] . '://' . $m['host'];
- $since = datetime_convert(date_default_timezone_get(),date_default_timezone_get(),'0001-01-01 00:00');
- $until = datetime_convert(date_default_timezone_get(),date_default_timezone_get(),'now + 1 day');
+ $since = datetime_convert(date_default_timezone_get(), date_default_timezone_get(), '0001-01-01 00:00');
+ $until = datetime_convert(date_default_timezone_get(), date_default_timezone_get(), 'now + 1 day');
- $poll_interval = get_config('system','poll_interval',3);
- $page = 0;
+ $poll_interval = get_config('system', 'poll_interval', 3);
+ $page = 0;
- Master::Summon([ 'Content_importer', sprintf('%d',$page), $since, $until, $channel['channel_address'], urlencode($hz_server) ]);
- Master::Summon([ 'File_importer',sprintf('%d',$page), $channel['channel_address'], urlencode($hz_server) ]);
+ Master::Summon(['Content_importer', sprintf('%d', $page), $since, $until, $channel['channel_address'], urlencode($hz_server)]);
+ Master::Summon(['File_importer', sprintf('%d', $page), $channel['channel_address'], urlencode($hz_server)]);
}
else {
$cf_api_compat = false;
@@ -550,7 +554,7 @@ class Import extends Controller {
}
if (!$cf_api_compat) {
- notice(t('Automatic content and files import was not possible due to API version incompatiblity. Please import content and files manually!') . EOL);
+ notice(t('Automatic content and files import was not possible due to API version incompatiblity. Please import content and files manually!') . EOL);
}
goaway(z_root());
@@ -584,28 +588,28 @@ class Import extends Controller {
nav_set_selected('Channel Import');
- $o = replace_macros(get_markup_template('channel_import.tpl'), array(
- '$title' => t('Channel Import'),
- '$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
+ $o = replace_macros(get_markup_template('channel_import.tpl'), [
+ '$title' => t('Channel Import'),
+ '$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
'$label_filename' => t('File to Upload'),
- '$choice' => t('Or provide the old server/hub details'),
+ '$choice' => t('Or provide the old server/hub details'),
- '$old_address' => ['old_address', t('Your old identity address (xyz@example.com)'), '', ''],
- '$email' => ['email', t('Your old login email address'), '', ''],
- '$password' => ['password', t('Your old login password'), '', ''],
+ '$old_address' => ['old_address', t('Your old identity address (xyz@example.com)'), '', ''],
+ '$email' => ['email', t('Your old login email address'), '', ''],
+ '$password' => ['password', t('Your old login password'), '', ''],
'$import_posts' => ['import_posts', t('Import your items and files (limited by available memory)'), false, '', [t('No'), t('Yes')]],
'$common' => t('For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media.'),
'$make_primary' => ['make_primary', t('Make this hub my primary location'), false, '', [t('No'), t('Yes')]],
- '$moving' => ['moving', t('Move this channel (disable all previous locations)'), false, '', [t('No'), t('Yes')]],
- '$newname' => ['newname', t('Use this channel nickname instead of the one provided'), '', t('Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site.')],
+ '$moving' => ['moving', t('Move this channel (disable all previous locations)'), false, '', [t('No'), t('Yes')]],
+ '$newname' => ['newname', t('Use this channel nickname instead of the one provided'), '', t('Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site.')],
'$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
'$form_security_token' => get_form_security_token('channel_import'),
- '$submit' => t('Submit')
- ));
+ '$submit' => t('Submit')
+ ]);
return $o;
}
diff --git a/Zotlabs/Module/Import_items.php b/Zotlabs/Module/Import_items.php
index c2b2506fe..1a1e8d061 100644
--- a/Zotlabs/Module/Import_items.php
+++ b/Zotlabs/Module/Import_items.php
@@ -1,6 +1,11 @@
<?php
+
namespace Zotlabs\Module;
+use App;
+use ZipArchive;
+use Zotlabs\Web\Controller;
+
require_once('include/import.php');
/**
@@ -8,128 +13,184 @@ require_once('include/import.php');
*
* Import existing posts and content from an export file.
*/
-class Import_items extends \Zotlabs\Web\Controller {
+class Import_items extends Controller {
function post() {
- if(! local_channel())
+ if (!local_channel())
return;
check_form_security_token_redirectOnErr('/import_items', 'import_items');
- $data = null;
+ $data = null;
$src = $_FILES['filename']['tmp_name'];
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
- if($src) {
+ $channel = App::get_channel();
+
+ if ($src) {
+
+ if ($filetype === 'application/zip') {
+ $zip = new ZipArchive;
+
+ $r = $zip->open($src);
+ if ($r === true) {
+ for ($i = 0; $i < $zip->count(); $i++) {
+ $data = $zip->getFromIndex($i);
+ self::import($channel, $data);
+ }
+ $zip->close();
+ unlink($src);
+ return;
+ }
+
+ notice(t('Not a zip file or zip file corrupted.') . EOL);
+ unlink($src);
+ return;
+ }
+
// This is OS specific and could also fail if your tmpdir isn't very large
// mostly used for Diaspora which exports gzipped files.
- if(strpos($filename,'.gz')){
- @rename($src,$src . '.gz');
- @system('gunzip ' . escapeshellarg($src . '.gz'));
- }
+ //if(strpos($filename,'.gz')){
+ //@rename($src,$src . '.gz');
+ //@system('gunzip ' . escapeshellarg($src . '.gz'));
+ //}
- if($filesize) {
+ if ($filesize) {
$data = @file_get_contents($src);
+ self::import($channel, $data);
}
unlink($src);
+ return;
}
+ /*
+ if(! $src) {
+
+ $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
+
+ if(! $old_address) {
+ logger('Nothing to import.');
+ notice( t('Nothing to import.') . EOL);
+ return;
+ }
+
+ $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
+ $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
+
+ $year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
+
+ $channelname = substr($old_address,0,strpos($old_address,'@'));
+ $servername = substr($old_address,strpos($old_address,'@')+1);
+
+ $scheme = 'https://';
+ $api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
+ $binary = false;
+ $redirects = 0;
+ $opts = array('http_auth' => $email . ':' . $password);
+ $url = $scheme . $servername . $api_path;
+ $ret = z_fetch_url($url, $binary, $redirects, $opts);
+ if(! $ret['success'])
+ $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
+ if($ret['success'])
+ $data = $ret['body'];
+ else
+ notice( t('Unable to download data from old server') . EOL);
+ }
+ */
- if(! $src) {
+ }
- $old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
- if(! $old_address) {
- logger('Nothing to import.');
- notice( t('Nothing to import.') . EOL);
- return;
- }
+ /**
+ * @brief Generate item import page.
+ *
+ * @return string with parsed HTML.
+ */
+ function get() {
- $email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
- $password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
- $year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
-
- $channelname = substr($old_address,0,strpos($old_address,'@'));
- $servername = substr($old_address,strpos($old_address,'@')+1);
-
- $scheme = 'https://';
- $api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
- $binary = false;
- $redirects = 0;
- $opts = array('http_auth' => $email . ':' . $password);
- $url = $scheme . $servername . $api_path;
- $ret = z_fetch_url($url, $binary, $redirects, $opts);
- if(! $ret['success'])
- $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
- if($ret['success'])
- $data = $ret['body'];
- else
- notice( t('Unable to download data from old server') . EOL);
+ if (!local_channel()) {
+ notice(t('Permission denied') . EOL);
+ return login();
}
- if(! $data) {
+ $o = replace_macros(get_markup_template('item_import.tpl'), [
+ '$title' => t('Import Items'),
+ '$desc' => t('Use this form to import existing posts and content from an export file.'),
+ '$label_filename' => t('File to Upload'),
+ '$form_security_token' => get_form_security_token('import_items'),
+ '$submit' => t('Submit')
+ ]);
+
+ return $o;
+ }
+
+
+ public static function import($channel, $data) {
+
+ if (!$data) {
logger('Empty file.');
- notice( t('Imported file is empty.') . EOL);
+ notice(t('Imported file is empty.') . EOL);
return;
}
$data = json_decode($data, true);
-
//logger('import: data: ' . print_r($data,true));
//print_r($data);
- if(! is_array($data))
+ if (!is_array($data)) {
return;
+ }
- if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
- $v1 = substr($data['compatibility']['database'],-4);
- $v2 = substr(DB_UPDATE_VERSION,-4);
- if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
- notice($t . EOL);
- }
+ //if (array_key_exists('compatibility', $data) && array_key_exists('database', $data['compatibility'])) {
+ //$v1 = substr($data['compatibility']['database'], -4);
+ //$v2 = substr(DB_UPDATE_VERSION, -4);
+ //if ($v2 > $v1) {
+ //$t = sprintf(t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1);
+ //notice($t . EOL);
+ //}
+ //}
+
+ if (array_key_exists('item', $data) && is_array($data['item'])) {
+ import_items($channel, $data['item'], false, ((array_key_exists('relocate', $data)) ? $data['relocate'] : null));
+ info(t('Content import completed') . EOL);
}
- $channel = \App::get_channel();
+ if (array_key_exists('chatroom', $data) && is_array($data['chatroom'])) {
+ import_chatrooms($channel, $data['chatroom']);
+ info(t('Chatroom import completed') . EOL);
- if(array_key_exists('item',$data) && $data['item']) {
- import_items($channel,$data['item'],false,((array_key_exists('relocate',$data)) ? $data['relocate'] : null));
}
- if(array_key_exists('item_id',$data) && $data['item_id']) {
- import_item_ids($channel,$data['item_id']);
- }
+ if (array_key_exists('event', $data) && is_array($data['event'])) {
+ import_events($channel, $data['event']);
+ info(t('Channel calendar import 1/2 completed') . EOL);
- info( t('Import completed') . EOL);
- }
+ }
+ if (array_key_exists('event_item', $data) && is_array($data['event_item'])) {
+ import_items($channel, $data['event_item'], false, ((array_key_exists('relocate', $data)) ? $data['relocate'] : null));
+ info(t('Channel calendar import 2/2 completed') . EOL);
+ }
- /**
- * @brief Generate item import page.
- *
- * @return string with parsed HTML.
- */
- function get() {
+ if (array_key_exists('menu', $data) && is_array($data['menu'])) {
+ import_menus($channel, $data['menu']);
+ info(t('Menu import completed') . EOL);
+ }
- if(! local_channel()) {
- notice( t('Permission denied') . EOL);
- return login();
+ if (array_key_exists('wiki', $data) && is_array($data['wiki'])) {
+ import_items($channel, $data['wiki'], false, ((array_key_exists('relocate', $data)) ? $data['relocate'] : null));
+ info(t('Wiki import completed') . EOL);
}
- $o = replace_macros(get_markup_template('item_import.tpl'), array(
- '$title' => t('Import Items'),
- '$desc' => t('Use this form to import existing posts and content from an export file.'),
- '$label_filename' => t('File to Upload'),
- '$form_security_token' => get_form_security_token('import_items'),
- '$submit' => t('Submit')
- ));
+ if (array_key_exists('webpages', $data) && is_array($data['webpages'])) {
+ import_items($channel, $data['webpages'], false, ((array_key_exists('relocate', $data)) ? $data['relocate'] : null));
+ info(t('Webpages import completed') . EOL);
+ }
- return $o;
}
}
diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php
index 40f972385..2a126ac27 100644
--- a/Zotlabs/Module/Invite.php
+++ b/Zotlabs/Module/Invite.php
@@ -129,11 +129,11 @@ class Invite extends Controller {
if(! $recip) continue;
// see if we have an email address who@domain.tld
- if (!preg_match('/^.{2,64}\@[a-z0-9.-]{4,32}\.[a-z]{2,12}$/', $recip)) {
- $feedbk .= 'ZAI0203E ' . ($n+1) . ': ' . sprintf( t('(%s) : Not a valid email address'), $recip) . $eol;
- $ko++;
- continue;
- }
+ //if (!preg_match('/^.{2,64}\@[a-z0-9.-]{2,32}\.[a-z]{2,12}$/', $recip)) {
+ //$feedbk .= 'ZAI0203E ' . ($n+1) . ': ' . sprintf( t('(%s) : Not a valid email address'), $recip) . $eol;
+ //$ko++;
+ //continue;
+ //}
if(! validate_email($recip)) {
$feedbk .= 'ZAI0204E ' . ($n+1) . ': ' . sprintf( t('(%s) : Not a real email address'), $recip) . $eol;
$ko++;
@@ -225,7 +225,7 @@ class Invite extends Controller {
'$projectname' => t('$Projectname'),
'$invite_code' => $invite_code,
'$invite_where' => z_root() . '/register',
- '$invite_whereami' => str_replace('@', '@+', $reonar['whereami']),
+ '$invite_whereami' => $reonar['whereami'],
'$invite_whoami' => z_root() . '/channel/' . $reonar['whoami'],
'$invite_anywhere' => z_root() . '/pubsites'
)
@@ -422,8 +422,6 @@ class Invite extends Controller {
// let take one descriptive for template (as said is never used)
$invite_code = 'INVITATE2020';
- // what languages we use now
- $lccmy = ((isset(App::$config['system']['language'])) ? App::$config['system']['language'] : 'en');
// and all the localized templates belonging to invite
$tpls = glob('view/*/invite.*.tpl');
@@ -444,6 +442,9 @@ class Invite extends Controller {
$langs = array_keys($tpla);
asort($langs);
+ // Use the current language if we have a template for it. Otherwise fall back to 'en'.
+ $lccmy = ((in_array(App::$language, $langs)) ? App::$language : 'en');
+
$tplx = array_unique($tplx);
asort($tplx);
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 7099a54e5..41979006e 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -2,6 +2,8 @@
namespace Zotlabs\Module;
+use App;
+use URLify;
use Zotlabs\Lib\Config;
use Zotlabs\Lib\IConfig;
use Zotlabs\Lib\Enotify;
@@ -15,7 +17,6 @@ use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libsync;
use Zotlabs\Lib\ThreadListener;
use Zotlabs\Access\PermissionRoles;
-use App;
require_once('include/crypto.php');
require_once('include/items.php');
@@ -37,8 +38,6 @@ require_once('include/conversation.php');
* posting categories go through item_store() instead of this function.
*
*/
-
-
class Item extends Controller {
@@ -46,11 +45,9 @@ class Item extends Controller {
if (Libzot::is_zot_request()) {
- $conversation = false;
-
$item_id = argv(1);
- if(! $item_id)
+ if (!$item_id)
http_status_exit(404, 'Not found');
$portable_id = EMPTY_STR;
@@ -70,8 +67,8 @@ class Item extends Controller {
dbesc(z_root() . '/item/' . $item_id)
);
- if (! $r) {
- http_status_exit(404,'Not found');
+ if (!$r) {
+ http_status_exit(404, 'Not found');
}
// process an authenticated fetch
@@ -79,10 +76,10 @@ class Item extends Controller {
$sigdata = HTTPSig::verify(($_SERVER['REQUEST_METHOD'] === 'POST') ? file_get_contents('php://input') : EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
- if (! check_channelallowed($portable_id)) {
+ if (!check_channelallowed($portable_id)) {
http_status_exit(403, 'Permission denied');
}
- if (! check_siteallowed($sigdata['signer'])) {
+ if (!check_siteallowed($sigdata['signer'])) {
http_status_exit(403, 'Permission denied');
}
observer_auth($portable_id);
@@ -92,8 +89,8 @@ class Item extends Controller {
dbesc($portable_id)
);
}
- elseif (Config::get('system','require_authenticated_fetch',false)) {
- http_status_exit(403,'Permission denied');
+ elseif (Config::get('system', 'require_authenticated_fetch', false)) {
+ http_status_exit(403, 'Permission denied');
}
// if we don't have a parent id belonging to the signer see if we can obtain one as a visitor that we have permission to access
@@ -101,47 +98,47 @@ class Item extends Controller {
$sql_extra = item_permissions_sql(0);
- if (! $i) {
+ if (!$i) {
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra order by item_wall desc limit 1",
dbesc($r[0]['parent_mid'])
);
}
- if(! $i) {
- http_status_exit(403,'Forbidden');
+ if (!$i) {
+ http_status_exit(403, 'Forbidden');
}
- $parents_str = ids_to_querystr($i,'item_id');
+ $parents_str = ids_to_querystr($i, 'item_id');
$items = q("SELECT item.*, item.id AS item_id FROM item WHERE item.parent IN ( %s ) $item_normal order by item.id asc",
dbesc($parents_str)
);
- if(! $items) {
+ if (!$items) {
http_status_exit(404, 'Not found');
}
- xchan_query($items,true);
- $items = fetch_post_tags($items,true);
+ xchan_query($items, true);
+ $items = fetch_post_tags($items, true);
- if(! $items)
+ if (!$items)
http_status_exit(404, 'Not found');
$chan = channelx_by_n($items[0]['uid']);
- if(! $chan)
+ if (!$chan)
http_status_exit(404, 'Not found');
- if(! perm_is_allowed($chan['channel_id'],get_observer_hash(),'view_stream'))
+ if (!perm_is_allowed($chan['channel_id'], get_observer_hash(), 'view_stream'))
http_status_exit(403, 'Forbidden');
$i = Activity::encode_item_collection($items, 'conversation/' . $item_id, 'OrderedCollection');
- if(! $i)
+ if (!$i)
http_status_exit(404, 'Not found');
- if($portable_id && (! intval($items[0]['item_private']))) {
+ if ($portable_id && (!intval($items[0]['item_private']))) {
ThreadListener::store(z_root() . '/item/' . $item_id, $portable_id);
}
@@ -149,25 +146,25 @@ class Item extends Controller {
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
- ]], $i);
+ ]], $i);
- $headers = [];
- $headers['Content-Type'] = 'application/x-zot+json' ;
- $x['signature'] = LDSignatures::sign($x,$chan);
- $ret = json_encode($x, JSON_UNESCAPED_SLASHES);
- $headers['Digest'] = HTTPSig::generate_digest_header($ret);
+ $headers = [];
+ $headers['Content-Type'] = 'application/x-zot+json';
+ $x['signature'] = LDSignatures::sign($x, $chan);
+ $ret = json_encode($x, JSON_UNESCAPED_SLASHES);
+ $headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
- $h = HTTPSig::create_sig($headers,$chan['channel_prvkey'],channel_url($chan));
+ $h = HTTPSig::create_sig($headers, $chan['channel_prvkey'], channel_url($chan));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
- if(ActivityStreams::is_as_request()) {
+ if (ActivityStreams::is_as_request()) {
$item_id = argv(1);
- if(! $item_id)
+ if (!$item_id)
http_status_exit(404, 'Not found');
$portable_id = EMPTY_STR;
@@ -189,8 +186,8 @@ class Item extends Controller {
dbesc($item_id)
);
- if (! $r) {
- http_status_exit(404,'Not found');
+ if (!$r) {
+ http_status_exit(404, 'Not found');
}
// process an authenticated fetch
@@ -198,10 +195,10 @@ class Item extends Controller {
$sigdata = HTTPSig::verify(EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
- if (! check_channelallowed($portable_id)) {
+ if (!check_channelallowed($portable_id)) {
http_status_exit(403, 'Permission denied');
}
- if (! check_siteallowed($sigdata['signer'])) {
+ if (!check_siteallowed($sigdata['signer'])) {
http_status_exit(403, 'Permission denied');
}
observer_auth($portable_id);
@@ -211,8 +208,8 @@ class Item extends Controller {
dbesc($portable_id)
);
}
- elseif (Config::get('system','require_authenticated_fetch',false)) {
- http_status_exit(403,'Permission denied');
+ elseif (Config::get('system', 'require_authenticated_fetch', false)) {
+ http_status_exit(403, 'Permission denied');
}
// if we don't have a parent id belonging to the signer see if we can obtain one as a visitor that we have permission to access
@@ -220,40 +217,40 @@ class Item extends Controller {
$sql_extra = item_permissions_sql(0);
- if (! $i) {
+ if (!$i) {
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra order by item_wall desc limit 1",
dbesc($r[0]['parent_mid'])
);
}
- if(! $i) {
- http_status_exit(403,'Forbidden');
+ if (!$i) {
+ http_status_exit(403, 'Forbidden');
}
// If we get to this point we have determined we can access the original in $r (fetched much further above), so use it.
- xchan_query($r,true);
- $items = fetch_post_tags($r,false);
+ xchan_query($r, true);
+ $items = fetch_post_tags($r, false);
$chan = channelx_by_n($items[0]['uid']);
- if(! $chan)
+ if (!$chan)
http_status_exit(404, 'Not found');
- if(! perm_is_allowed($chan['channel_id'],get_observer_hash(),'view_stream'))
+ if (!perm_is_allowed($chan['channel_id'], get_observer_hash(), 'view_stream'))
http_status_exit(403, 'Forbidden');
- $i = Activity::encode_item($items[0],true);
+ $i = Activity::encode_item($items[0]);
- if(! $i)
+ if (!$i)
http_status_exit(404, 'Not found');
- if ($portable_id && (! intval($items[0]['item_private']))) {
+ if ($portable_id && (!intval($items[0]['item_private']))) {
$c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s'",
intval($items[0]['uid']),
dbesc($portable_id)
);
- if (! $c) {
+ if (!$c) {
ThreadListener::store(z_root() . '/item/' . $item_id, $portable_id);
}
}
@@ -262,16 +259,16 @@ class Item extends Controller {
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
- ]], $i);
-
- $headers = [];
- $headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ;
- $x['signature'] = LDSignatures::sign($x,$chan);
- $ret = json_encode($x, JSON_UNESCAPED_SLASHES);
- $headers['Date'] = datetime_convert('UTC','UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
- $headers['Digest'] = HTTPSig::generate_digest_header($ret);
+ ]], $i);
+
+ $headers = [];
+ $headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"';
+ $x['signature'] = LDSignatures::sign($x, $chan);
+ $ret = json_encode($x, JSON_UNESCAPED_SLASHES);
+ $headers['Date'] = datetime_convert('UTC', 'UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
+ $headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
- $h = HTTPSig::create_sig($headers,$chan['channel_prvkey'],channel_url($chan));
+ $h = HTTPSig::create_sig($headers, $chan['channel_prvkey'], channel_url($chan));
HTTPSig::set_headers($h);
echo $ret;
killme();
@@ -279,14 +276,14 @@ class Item extends Controller {
}
- if(argc() > 1 && argv(1) !== 'drop') {
+ if (argc() > 1 && argv(1) !== 'drop') {
$x = q("select uid, item_wall, llink, mid from item where mid = '%s' or mid = '%s' or uuid = '%s'",
dbesc(z_root() . '/item/' . argv(1)),
dbesc(z_root() . '/activity/' . argv(1)),
dbesc(argv(1))
);
- if($x) {
- foreach($x as $xv) {
+ if ($x) {
+ foreach ($x as $xv) {
if (intval($xv['item_wall'])) {
$c = channelx_by_n($xv['uid']);
if ($c) {
@@ -302,17 +299,16 @@ class Item extends Controller {
}
-
function post() {
// This will change. Figure out who the observer is and whether or not
// they have permission to post here. Else ignore the post.
- if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'anonname')))
+ if ((!local_channel()) && (!remote_channel()) && (!x($_REQUEST, 'anonname')))
return;
- $uid = local_channel();
- $channel = null;
+ $uid = local_channel();
+ $channel = null;
$observer = null;
$datarray = [];
@@ -321,34 +317,34 @@ class Item extends Controller {
* Is this a reply to something?
*/
- $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
- $parent_mid = ((x($_REQUEST,'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
- $mode = (($_REQUEST['conv_mode'] === 'channel') ? 'channel' : 'network');
+ $parent = ((x($_REQUEST, 'parent')) ? intval($_REQUEST['parent']) : 0);
+ $parent_mid = ((x($_REQUEST, 'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
+ $mode = (($_REQUEST['conv_mode'] === 'channel') ? 'channel' : 'network');
- $remote_xchan = ((x($_REQUEST,'remote_xchan')) ? trim($_REQUEST['remote_xchan']) : false);
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ $remote_xchan = ((x($_REQUEST, 'remote_xchan')) ? trim($_REQUEST['remote_xchan']) : false);
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($remote_xchan)
);
- if($r)
+ if ($r)
$remote_observer = $r[0];
else
$remote_xchan = $remote_observer = false;
- $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
+ $profile_uid = ((x($_REQUEST, 'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
require_once('include/channel.php');
$sys = get_sys_channel();
- if($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
- $uid = intval($sys['channel_id']);
- $channel = $sys;
+ if ($sys && $profile_uid && ($sys['channel_id'] == $profile_uid) && is_site_admin()) {
+ $uid = intval($sys['channel_id']);
+ $channel = $sys;
$observer = $sys;
}
- if(x($_REQUEST,'dropitems')) {
+ if (x($_REQUEST, 'dropitems')) {
require_once('include/items.php');
- $arr_drop = explode(',',$_REQUEST['dropitems']);
+ $arr_drop = explode(',', $_REQUEST['dropitems']);
drop_items($arr_drop);
- $json = array('success' => 1);
+ $json = ['success' => 1];
echo json_encode($json);
killme();
}
@@ -357,7 +353,7 @@ class Item extends Controller {
// logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
- $api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
+ $api_source = ((x($_REQUEST, 'api_source') && $_REQUEST['api_source']) ? true : false);
$consensus = intval($_REQUEST['consensus']);
$nocomment = intval($_REQUEST['nocomment']);
@@ -373,77 +369,75 @@ class Item extends Controller {
// If you are unsure, it is prudent (and important) to leave it unset.
- $origin = (($api_source && array_key_exists('origin',$_REQUEST)) ? intval($_REQUEST['origin']) : 1);
+ $origin = (($api_source && array_key_exists('origin', $_REQUEST)) ? intval($_REQUEST['origin']) : 1);
// To represent message-ids on other networks - this will create an iconfig record
- $namespace = (($api_source && array_key_exists('namespace',$_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
- $remote_id = (($api_source && array_key_exists('remote_id',$_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
+ $namespace = (($api_source && array_key_exists('namespace', $_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
+ $remote_id = (($api_source && array_key_exists('remote_id', $_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
$owner_hash = null;
- $message_id = ((x($_REQUEST,'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
- $created = ((x($_REQUEST,'created')) ? datetime_convert(date_default_timezone_get(),'UTC',$_REQUEST['created']) : datetime_convert());
- $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
- $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
- $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
- $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
- $item_obscured = ((x($_REQUEST,'obscured')) ? intval($_REQUEST['obscured']) : 0);
- $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags(urlencode($_REQUEST['pagetitle'])) : '');
- $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
- $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
- $obj_type = ((x($_REQUEST,'obj_type')) ? escape_tags($_REQUEST['obj_type']) : ACTIVITY_OBJ_NOTE);
+ $message_id = ((x($_REQUEST, 'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
+ $created = ((x($_REQUEST, 'created')) ? datetime_convert(date_default_timezone_get(), 'UTC', $_REQUEST['created']) : datetime_convert());
+ $post_id = ((x($_REQUEST, 'post_id')) ? intval($_REQUEST['post_id']) : 0);
+ $app = ((x($_REQUEST, 'source')) ? strip_tags($_REQUEST['source']) : '');
+ $return_path = ((x($_REQUEST, 'return')) ? $_REQUEST['return'] : '');
+ $preview = ((x($_REQUEST, 'preview')) ? intval($_REQUEST['preview']) : 0);
+ $categories = ((x($_REQUEST, 'category')) ? escape_tags($_REQUEST['category']) : '');
+ $webpage = ((x($_REQUEST, 'webpage')) ? intval($_REQUEST['webpage']) : 0);
+ $item_obscured = ((x($_REQUEST, 'obscured')) ? intval($_REQUEST['obscured']) : 0);
+ $pagetitle = ((x($_REQUEST, 'pagetitle')) ? escape_tags(urlencode($_REQUEST['pagetitle'])) : '');
+ $layout_mid = ((x($_REQUEST, 'layout_mid')) ? escape_tags($_REQUEST['layout_mid']) : '');
+ $plink = ((x($_REQUEST, 'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
+ $obj_type = ((x($_REQUEST, 'obj_type')) ? escape_tags($_REQUEST['obj_type']) : ACTIVITY_OBJ_NOTE);
// allow API to bulk load a bunch of imported items with sending out a bunch of posts.
- $nopush = ((x($_REQUEST,'nopush')) ? intval($_REQUEST['nopush']) : 0);
+ $nopush = ((x($_REQUEST, 'nopush')) ? intval($_REQUEST['nopush']) : 0);
/*
* Check service class limits
*/
- if ($uid && !(x($_REQUEST,'parent')) && !(x($_REQUEST,'post_id'))) {
- $ret = $this->item_check_service_class($uid,(($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
+ if ($uid && !(x($_REQUEST, 'parent')) && !(x($_REQUEST, 'post_id'))) {
+ $ret = $this->item_check_service_class($uid, (($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
if (!$ret['success']) {
- notice( t($ret['message']) . EOL) ;
- if($api_source)
- return ( [ 'success' => false, 'message' => 'service class exception' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ notice(t($ret['message']) . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'service class exception']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
}
- if($pagetitle) {
- require_once('library/urlify/URLify.php');
- $pagetitle = strtolower(\URLify::transliterate($pagetitle));
+ if ($pagetitle) {
+ $pagetitle = strtolower(URLify::transliterate($pagetitle));
}
- $item_flags = $item_restrict = 0;
$expires = NULL_DATE;
+ $comments_closed = NULL_DATE;
- $route = '';
- $parent_item = null;
+ $route = '';
+ $parent_item = null;
$parent_contact = null;
- $thr_parent = '';
- $parid = 0;
- $r = false;
+ $thr_parent = '';
+ $r = false;
- if($parent || $parent_mid) {
+ if ($parent || $parent_mid) {
- if(! x($_REQUEST,'type'))
+ if (!x($_REQUEST, 'type'))
$_REQUEST['type'] = 'net-comment';
- if($obj_type == ACTIVITY_OBJ_NOTE)
+ if ($obj_type == ACTIVITY_OBJ_NOTE)
$obj_type = ACTIVITY_OBJ_COMMENT;
- if($parent) {
+ if ($parent) {
$r = q("SELECT * FROM item WHERE id = %d LIMIT 1",
intval($parent)
);
}
- elseif($parent_mid && $uid) {
+ elseif ($parent_mid && $uid) {
// This is coming from an API source, and we are logged in
$r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($parent_mid),
@@ -451,10 +445,10 @@ class Item extends Controller {
);
}
// if this isn't the real parent of the conversation, find it
- if($r) {
- $parid = $r[0]['parent'];
+ if ($r) {
+ $parid = $r[0]['parent'];
$parent_mid = $r[0]['mid'];
- if($r[0]['id'] != $r[0]['parent']) {
+ if ($r[0]['id'] != $r[0]['parent']) {
$r = q("SELECT * FROM item WHERE id = parent AND parent = %d LIMIT 1",
intval($parid)
);
@@ -463,24 +457,24 @@ class Item extends Controller {
// if interacting with a pubstream item,
// create a copy of the parent in your stream
- if($r[0]['uid'] === $sys['channel_id'] && local_channel()) {
- $r = [ copy_of_pubitem(\App::get_channel(), $r[0]['mid']) ];
+ if ($r[0]['uid'] === $sys['channel_id'] && local_channel()) {
+ $r = [copy_of_pubitem(App::get_channel(), $r[0]['mid'])];
}
}
- if(! $r) {
- notice( t('Unable to locate original post.') . EOL);
- if($api_source)
- return ( [ 'success' => false, 'message' => 'invalid post id' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ if (!$r) {
+ notice(t('Unable to locate original post.') . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'invalid post id']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
- xchan_query($r,true);
+ xchan_query($r, true);
$parent_item = $r[0];
- $parent = $r[0]['id'];
+ $parent = $r[0]['id'];
// multi-level threading - preserve the info but re-parent to our single level threading
@@ -492,52 +486,52 @@ class Item extends Controller {
$moderated = false;
- if(! $observer) {
- $observer = \App::get_observer();
- if(! $observer) {
+ if (!$observer) {
+ $observer = App::get_observer();
+ if (!$observer) {
$observer = anon_identity_init($_REQUEST);
- if($observer) {
- $moderated = true;
+ if ($observer) {
+ $moderated = true;
$remote_xchan = $remote_observer = $observer;
}
}
}
- if(! $observer) {
- notice( t('Permission denied.') . EOL) ;
- if($api_source)
- return ( [ 'success' => false, 'message' => 'permission denied' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ if (!$observer) {
+ notice(t('Permission denied.') . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'permission denied']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
- if($parent) {
+ if ($parent) {
logger('mod_item: item_post parent=' . $parent);
$can_comment = false;
- $can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
- if (!$can_comment) {
- if((array_key_exists('owner',$parent_item)) && intval($parent_item['owner']['abook_self'])==1 )
- $can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
- }
-
- if(! $can_comment) {
- notice( t('Permission denied.') . EOL) ;
- if($api_source)
- return ( [ 'success' => false, 'message' => 'permission denied' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ $can_comment = can_comment_on_post($observer['xchan_hash'], $parent_item);
+ if (!$can_comment) {
+ if ((array_key_exists('owner', $parent_item)) && intval($parent_item['owner']['abook_self']) == 1)
+ $can_comment = perm_is_allowed($profile_uid, $observer['xchan_hash'], 'post_comments');
+ }
+
+ if (!$can_comment) {
+ notice(t('Permission denied.') . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'permission denied']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
}
else {
- if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],($webpage) ? 'write_pages' : 'post_wall')) {
- notice( t('Permission denied.') . EOL) ;
- if($api_source)
- return ( [ 'success' => false, 'message' => 'permission denied' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ if (!perm_is_allowed($profile_uid, $observer['xchan_hash'], ($webpage) ? 'write_pages' : 'post_wall')) {
+ notice(t('Permission denied.') . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'permission denied']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
}
@@ -547,53 +541,53 @@ class Item extends Controller {
$orig_post = null;
- if($namespace && $remote_id) {
+ if ($namespace && $remote_id) {
// It wasn't an internally generated post - see if we've got an item matching this remote service id
$i = q("select iid from iconfig where cat = 'system' and k = '%s' and v = '%s' limit 1",
dbesc($namespace),
dbesc($remote_id)
);
- if($i)
+ if ($i)
$post_id = $i[0]['iid'];
}
$iconfig = null;
- if($post_id) {
+ if ($post_id) {
$i = q("SELECT * FROM item WHERE uid = %d AND id = %d LIMIT 1",
intval($profile_uid),
intval($post_id)
);
- if(! count($i))
+ if (!count($i))
killme();
$orig_post = $i[0];
- $iconfig = q("select * from iconfig where iid = %d",
+ $iconfig = q("select * from iconfig where iid = %d",
intval($post_id)
);
}
- if(! $channel) {
- if($uid && $uid == $profile_uid) {
- $channel = \App::get_channel();
+ if (!$channel) {
+ if ($uid && $uid == $profile_uid) {
+ $channel = App::get_channel();
}
else {
// posting as yourself but not necessarily to a channel you control
$r = q("select * from channel left join account on channel_account_id = account_id where channel_id = %d LIMIT 1",
intval($profile_uid)
);
- if($r)
+ if ($r)
$channel = $r[0];
}
}
- if(! $channel) {
+ if (!$channel) {
logger("mod_item: no channel.");
- if($api_source)
- return ( [ 'success' => false, 'message' => 'no channel' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ if ($api_source)
+ return (['success' => false, 'message' => 'no channel']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
@@ -602,37 +596,37 @@ class Item extends Controller {
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($channel['channel_hash'])
);
- if($r && count($r)) {
+ if ($r && count($r)) {
$owner_xchan = $r[0];
}
else {
logger("mod_item: no owner.");
- if($api_source)
- return ( [ 'success' => false, 'message' => 'no owner' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ if ($api_source)
+ return (['success' => false, 'message' => 'no owner']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
- $walltowall = false;
+ $walltowall = false;
$walltowall_comment = false;
- if($remote_xchan && ! $moderated)
+ if ($remote_xchan && !$moderated)
$observer = $remote_observer;
- if($observer) {
+ if ($observer) {
logger('mod_item: post accepted from ' . $observer['xchan_name'] . ' for ' . $owner_xchan['xchan_name'], LOGGER_DEBUG);
// wall-to-wall detection.
// For top-level posts, if the author and owner are different it's a wall-to-wall
// For comments, We need to additionally look at the parent and see if it's a wall post that originated locally.
- if($observer['xchan_name'] != $owner_xchan['xchan_name']) {
- if(($parent_item) && ($parent_item['item_wall'] && $parent_item['item_origin'])) {
+ if ($observer['xchan_name'] != $owner_xchan['xchan_name']) {
+ if (($parent_item) && ($parent_item['item_wall'] && $parent_item['item_origin'])) {
$walltowall_comment = true;
- $walltowall = true;
+ $walltowall = true;
}
- if(! $parent) {
+ if (!$parent) {
$walltowall = true;
}
}
@@ -640,83 +634,79 @@ class Item extends Controller {
$acl = new \Zotlabs\Access\AccessList($channel);
- $view_policy = \Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_stream');
- $comment_policy = \Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'post_comments');
+ $view_policy = \Zotlabs\Access\PermissionLimits::Get($channel['channel_id'], 'view_stream');
+ $comment_policy = \Zotlabs\Access\PermissionLimits::Get($channel['channel_id'], 'post_comments');
- $public_policy = ((x($_REQUEST,'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope($view_policy,true));
- if($webpage)
+ $public_policy = ((x($_REQUEST, 'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope($view_policy, true));
+ if ($webpage)
$public_policy = '';
- if($public_policy)
+ if ($public_policy)
$private = 1;
- if($orig_post) {
+ if ($orig_post) {
$private = 0;
// webpages are allowed to change ACLs after the fact. Normal conversation items aren't.
- if($webpage) {
+ if ($webpage) {
$acl->set_from_array($_REQUEST);
}
else {
$acl->set($orig_post);
- $public_policy = $orig_post['public_policy'];
- $private = $orig_post['item_private'];
+ $public_policy = $orig_post['public_policy'];
+ $private = $orig_post['item_private'];
}
- if($public_policy || $acl->is_private()) {
+ if ($public_policy || $acl->is_private()) {
$private = (($private) ? $private : 1);
}
- $location = $orig_post['location'];
- $coord = $orig_post['coord'];
- $verb = $orig_post['verb'];
- $app = $orig_post['app'];
- $title = escape_tags(trim($_REQUEST['title']));
- $summary = trim($_REQUEST['summary']);
- $body = trim($_REQUEST['body']);
- $item_flags = $orig_post['item_flags'];
-
- $item_origin = $orig_post['item_origin'];
- $item_unseen = $orig_post['item_unseen'];
- $item_starred = $orig_post['item_starred'];
- $item_uplink = $orig_post['item_uplink'];
- $item_consensus = $orig_post['item_consensus'];
- $item_wall = $orig_post['item_wall'];
- $item_thread_top = $orig_post['item_thread_top'];
- $item_notshown = $orig_post['item_notshown'];
- $item_nsfw = $orig_post['item_nsfw'];
- $item_relay = $orig_post['item_relay'];
- $item_mentionsme = $orig_post['item_mentionsme'];
- $item_nocomment = $orig_post['item_nocomment'];
- $item_obscured = $orig_post['item_obscured'];
- $item_verified = $orig_post['item_verified'];
- $item_retained = $orig_post['item_retained'];
- $item_rss = $orig_post['item_rss'];
- $item_deleted = $orig_post['item_deleted'];
- $item_type = $orig_post['item_type'];
- $item_hidden = $orig_post['item_hidden'];
- $item_unpublished = $orig_post['item_unpublished'];
- $item_delayed = $orig_post['item_delayed'];
- $item_pending_remove = $orig_post['item_pending_remove'];
- $item_blocked = $orig_post['item_blocked'];
-
-
-
- $postopts = $orig_post['postopts'];
- $created = $orig_post['created'];
- $expires = $orig_post['expires'];
- $mid = $orig_post['mid'];
- $parent_mid = $orig_post['parent_mid'];
- $plink = $orig_post['plink'];
-
+ $location = $orig_post['location'];
+ $coord = $orig_post['coord'];
+ $verb = $orig_post['verb'];
+ $app = $orig_post['app'];
+ $title = escape_tags(trim($_REQUEST['title']));
+ $summary = trim($_REQUEST['summary']);
+ $body = trim($_REQUEST['body']);
+ $item_flags = $orig_post['item_flags'];
+ $item_origin = $orig_post['item_origin'];
+ $item_unseen = $orig_post['item_unseen'];
+ $item_starred = $orig_post['item_starred'];
+ $item_uplink = $orig_post['item_uplink'];
+ $item_consensus = $orig_post['item_consensus'];
+ $item_wall = $orig_post['item_wall'];
+ $item_thread_top = $orig_post['item_thread_top'];
+ $item_notshown = $orig_post['item_notshown'];
+ $item_nsfw = $orig_post['item_nsfw'];
+ $item_relay = $orig_post['item_relay'];
+ $item_mentionsme = $orig_post['item_mentionsme'];
+ $item_nocomment = $orig_post['item_nocomment'];
+ $item_obscured = $orig_post['item_obscured'];
+ $item_verified = $orig_post['item_verified'];
+ $item_retained = $orig_post['item_retained'];
+ $item_rss = $orig_post['item_rss'];
+ $item_deleted = $orig_post['item_deleted'];
+ $item_type = $orig_post['item_type'];
+ $item_hidden = $orig_post['item_hidden'];
+ $item_unpublished = $orig_post['item_unpublished'];
+ $item_delayed = $orig_post['item_delayed'];
+ $item_pending_remove = $orig_post['item_pending_remove'];
+ $item_blocked = $orig_post['item_blocked'];
+ $postopts = $orig_post['postopts'];
+ $created = $orig_post['created'];
+ $expires = $orig_post['expires'];
+ $comments_closed = $orig_post['comments_closed'];
+ $mid = $orig_post['mid'];
+ $parent_mid = $orig_post['parent_mid'];
+ $plink = $orig_post['plink'];
}
else {
- if(! $walltowall) {
- if((array_key_exists('contact_allow',$_REQUEST))
- || (array_key_exists('group_allow',$_REQUEST))
- || (array_key_exists('contact_deny',$_REQUEST))
- || (array_key_exists('group_deny',$_REQUEST))) {
+ if (!$walltowall) {
+ if ((array_key_exists('contact_allow', $_REQUEST))
+ || (array_key_exists('group_allow', $_REQUEST))
+ || (array_key_exists('contact_deny', $_REQUEST))
+ || (array_key_exists('group_deny', $_REQUEST))) {
$acl->set_from_array($_REQUEST);
}
- elseif(! $api_source) {
+ elseif (!$api_source) {
// if no ACL has been defined and we aren't using the API, the form
// didn't send us any parameters. This means there's no ACL or it has
@@ -724,27 +714,27 @@ class Item extends Controller {
// If $api_source is set and there are no ACL parameters, we default
// to the channel permissions which were set in the ACL contructor.
- $acl->set(array('allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
+ $acl->set(['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '']);
}
}
- $location = notags(trim($_REQUEST['location']));
- $coord = notags(trim($_REQUEST['coord']));
- $verb = notags(trim($_REQUEST['verb']));
- $title = escape_tags(trim($_REQUEST['title']));
- $summary = trim($_REQUEST['summary']);
- $body = trim($_REQUEST['body']);
- $body .= trim($_REQUEST['attachment']);
- $postopts = '';
+ $location = notags(trim($_REQUEST['location']));
+ $coord = notags(trim($_REQUEST['coord']));
+ $verb = notags(trim($_REQUEST['verb']));
+ $title = escape_tags(trim($_REQUEST['title']));
+ $summary = trim($_REQUEST['summary']);
+ $body = trim($_REQUEST['body']);
+ $body .= trim($_REQUEST['attachment']);
+ $postopts = '';
- $allow_empty = ((array_key_exists('allow_empty',$_REQUEST)) ? intval($_REQUEST['allow_empty']) : 0);
+ $allow_empty = ((array_key_exists('allow_empty', $_REQUEST)) ? intval($_REQUEST['allow_empty']) : 0);
$private = (($private) ? $private : intval($acl->is_private() || ($public_policy)));
// If this is a comment, set the permissions from the parent.
- if($parent_item) {
+ if ($parent_item) {
$acl->set($parent_item);
$private = intval($parent_item['item_private']);
$public_policy = $parent_item['public_policy'];
@@ -752,51 +742,50 @@ class Item extends Controller {
$webpage = $parent_item['item_type'];
}
- if((! $allow_empty) && (! strlen($body))) {
- if($preview)
+ if ((!$allow_empty) && (!strlen($body))) {
+ if ($preview)
killme();
- info( t('Empty post discarded.') . EOL );
- if($api_source)
- return ( [ 'success' => false, 'message' => 'no content' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
+ info(t('Empty post discarded.') . EOL);
+ if ($api_source)
+ return (['success' => false, 'message' => 'no content']);
+ if (x($_REQUEST, 'return'))
+ goaway(z_root() . "/" . $return_path);
killme();
}
}
-
- if(feature_enabled($profile_uid,'content_expire')) {
- if(x($_REQUEST,'expire')) {
- $expires = datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expire']);
- if($expires <= datetime_convert())
+ if (feature_enabled($profile_uid, 'content_expire')) {
+ if (x($_REQUEST, 'expire')) {
+ $expires = datetime_convert(date_default_timezone_get(), 'UTC', $_REQUEST['expire']);
+ if ($expires <= datetime_convert())
$expires = NULL_DATE;
}
}
$mimetype = notags(trim($_REQUEST['mimetype']));
- if(! $mimetype)
+ if (!$mimetype)
$mimetype = 'text/bbcode';
$execflag = ((intval($uid) == intval($profile_uid)
&& ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
- if($preview) {
- $summary = z_input_filter($summary,$mimetype,$execflag);
- $body = z_input_filter($body,$mimetype,$execflag);
+ if ($preview) {
+ $summary = z_input_filter($summary, $mimetype, $execflag);
+ $body = z_input_filter($body, $mimetype, $execflag);
}
- $arr = [ 'profile_uid' => $profile_uid, 'summary' => $summary, 'content' => $body, 'mimetype' => $mimetype ];
- call_hooks('post_content',$arr);
- $summary = $arr['summary'];
- $body = $arr['content'];
+ $arr = ['profile_uid' => $profile_uid, 'summary' => $summary, 'content' => $body, 'mimetype' => $mimetype];
+ call_hooks('post_content', $arr);
+ $summary = $arr['summary'];
+ $body = $arr['content'];
$mimetype = $arr['mimetype'];
- $gacl = $acl->get();
+ $gacl = $acl->get();
$str_contact_allow = $gacl['allow_cid'];
$str_group_allow = $gacl['allow_gid'];
$str_contact_deny = $gacl['deny_cid'];
@@ -807,25 +796,18 @@ class Item extends Controller {
// if this is a wall-to-wall post to a group, turn it into a direct message
- $role = get_pconfig($profile_uid,'system','permissions_role');
-
- $rolesettings = PermissionRoles::role_perms($role);
-
- $channel_type = isset($rolesettings['channel_type']) ? $rolesettings['channel_type'] : 'normal';
+ $is_group = get_pconfig($profile_uid, 'system', 'group_actor');
- $is_group = (($channel_type === 'group') ? true : false);
-
- if (($is_group) && ($walltowall) && (! $walltowall_comment)) {
- $groupww = true;
+ if (($is_group) && ($walltowall) && (!$walltowall_comment)) {
+ $groupww = true;
$str_contact_allow = $owner_xchan['xchan_hash'];
- $str_group_allow = '';
+ $str_group_allow = '';
}
$post_tags = [];
-
- if($mimetype === 'text/bbcode') {
+ if ($mimetype === 'text/bbcode') {
require_once('include/text.php');
@@ -840,27 +822,27 @@ class Item extends Controller {
$results = linkify_tags($body, ($uid) ? $uid : $profile_uid);
- if($results) {
+ if ($results) {
// Set permissions based on tag replacements
set_linkified_perms($results, $str_contact_allow, $str_group_allow, $profile_uid, $private, $parent_item);
- foreach($results as $result) {
+ foreach ($results as $result) {
$success = $result['success'];
- if($success['replaced']) {
- $post_tags[] = array(
+ if ($success['replaced']) {
+ $post_tags[] = [
'uid' => $profile_uid,
'ttype' => $success['termtype'],
'otype' => TERM_OBJ_POST,
'term' => $success['term'],
'url' => $success['url']
- );
+ ];
}
}
}
- if(($str_contact_allow) && (! $str_group_allow)) {
+ if (($str_contact_allow) && (!$str_group_allow)) {
// direct message - private between individual channels but not groups
$private = 2;
}
@@ -885,45 +867,45 @@ class Item extends Controller {
*
*/
- if(! $preview) {
- fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
- fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($summary,'[/crypt]')) ? $_POST['media_str'] : $summary),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
- fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ if (!$preview) {
+ fix_attached_photo_permissions($profile_uid, $owner_xchan['xchan_hash'], ((strpos($body, '[/crypt]')) ? $_POST['media_str'] : $body), $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+ fix_attached_photo_permissions($profile_uid, $owner_xchan['xchan_hash'], ((strpos($summary, '[/crypt]')) ? $_POST['media_str'] : $summary), $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+ fix_attached_file_permissions($channel, $observer['xchan_hash'], ((strpos($body, '[/crypt]')) ? $_POST['media_str'] : $body), $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
}
$attachments = '';
- $match = false;
+ $match = false;
- if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
- $attachments = array();
- $i = 0;
- foreach($match[2] as $mtch) {
+ if (preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/', $body, $match)) {
+ $attachments = [];
+ $i = 0;
+ foreach ($match[2] as $mtch) {
$attach_link = '';
- $hash = substr($mtch,0,strpos($mtch,','));
- $rev = intval(substr($mtch,strpos($mtch,',')));
- $r = attach_by_hash_nodata($hash, $observer['xchan_hash'], $rev);
- if($r['success']) {
- $attachments[] = array(
+ $hash = substr($mtch, 0, strpos($mtch, ','));
+ $rev = intval(substr($mtch, strpos($mtch, ',')));
+ $r = attach_by_hash_nodata($hash, $observer['xchan_hash'], $rev);
+ if ($r['success']) {
+ $attachments[] = [
'href' => z_root() . '/attach/' . $r['data']['hash'],
'length' => $r['data']['filesize'],
'type' => $r['data']['filetype'],
'title' => urlencode($r['data']['filename']),
'revision' => $r['data']['revision']
- );
+ ];
}
- $body = str_replace($match[1][$i],$attach_link,$body);
+ $body = str_replace($match[1][$i], $attach_link, $body);
$i++;
}
}
- if(preg_match_all('/(\[share=(.*?)\](.*?)\[\/share\])/',$body,$match)) {
+ if (preg_match_all('/(\[share=(.*?)\](.*?)\[\/share\])/', $body, $match)) {
// process share by id
$i = 0;
- foreach($match[2] as $mtch) {
+ foreach ($match[2] as $mtch) {
$reshare = new \Zotlabs\Lib\Share($mtch);
- $body = str_replace($match[1][$i],$reshare->bbcode(),$body);
+ $body = str_replace($match[1][$i], $reshare->bbcode(), $body);
$i++;
}
}
@@ -931,32 +913,32 @@ class Item extends Controller {
// BBCODE end alert
}
- if(strlen($categories)) {
+ if (strlen($categories)) {
- $cats = explode(',',$categories);
- foreach($cats as $cat) {
+ $cats = explode(',', $categories);
+ foreach ($cats as $cat) {
- if($webpage == ITEM_TYPE_CARD) {
+ if ($webpage == ITEM_TYPE_CARD) {
$catlink = z_root() . '/cards/' . $channel['channel_address'] . '?f=&cat=' . urlencode(trim($cat));
}
- elseif($webpage == ITEM_TYPE_ARTICLE) {
+ elseif ($webpage == ITEM_TYPE_ARTICLE) {
$catlink = z_root() . '/articles/' . $channel['channel_address'] . '?f=&cat=' . urlencode(trim($cat));
}
else {
$catlink = $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat));
}
- $post_tags[] = array(
+ $post_tags[] = [
'uid' => $profile_uid,
'ttype' => TERM_CATEGORY,
'otype' => TERM_OBJ_POST,
'term' => trim($cat),
'url' => $catlink
- );
+ ];
}
}
- if($orig_post) {
+ if ($orig_post) {
// preserve original tags
$t = q("select * from term where oid = %d and otype = %d and uid = %d and ttype in ( %d, %d, %d )",
intval($orig_post['id']),
@@ -966,120 +948,133 @@ class Item extends Controller {
intval(TERM_FILE),
intval(TERM_COMMUNITYTAG)
);
- if($t) {
- foreach($t as $t1) {
- $post_tags[] = array(
+ if ($t) {
+ foreach ($t as $t1) {
+ $post_tags[] = [
'uid' => $profile_uid,
'ttype' => $t1['ttype'],
'otype' => TERM_OBJ_POST,
'term' => $t1['term'],
'url' => $t1['url'],
- );
+ ];
}
}
}
- $item_unseen = ((local_channel() != $profile_uid) ? 1 : 0);
- $item_wall = (($_REQUEST['type'] === 'wall' || $_REQUEST['type'] === 'wall-comment') ? 1 : 0);
- $item_origin = (($origin) ? 1 : 0);
+ $item_unseen = ((local_channel() != $profile_uid) ? 1 : 0);
+ $item_wall = (($_REQUEST['type'] === 'wall' || $_REQUEST['type'] === 'wall-comment') ? 1 : 0);
+ $item_origin = (($origin) ? 1 : 0);
$item_consensus = (($consensus) ? 1 : 0);
$item_nocomment = (($nocomment) ? 1 : 0);
// determine if this is a wall post
- if($parent) {
+ if ($parent) {
$item_wall = $parent_item['item_wall'];
}
else {
- if(! $webpage) {
+ if (!$webpage) {
$item_wall = 1;
}
}
- if($moderated)
+ if ($moderated)
$item_blocked = ITEM_MODERATED;
- if(! strlen($verb))
- $verb = ACTIVITY_POST ;
+ if (!strlen($verb))
+ $verb = ACTIVITY_POST;
- $notify_type = (($parent) ? 'comment-new' : 'wall-new' );
+ $notify_type = (($parent) ? 'comment-new' : 'wall-new');
- if(! $mid) {
- $uuid = (($message_id) ? $message_id : item_message_id());
- $mid = z_root() . '/item/' . $uuid;
+ $uuid = (($message_id) ? $message_id : item_message_id());
+
+ if (!$mid) {
+ $mid = z_root() . '/item/' . $uuid;
}
- if($is_poll) {
+ if ($is_poll) {
$poll = [
- 'question' => $body,
- 'answers' => $_REQUEST['poll_answers'],
+ 'question' => $body,
+ 'answers' => $_REQUEST['poll_answers'],
'multiple_answers' => $_REQUEST['poll_multiple_answers'],
- 'expire_value' => $_REQUEST['poll_expire_value'],
- 'expire_unit' => $_REQUEST['poll_expire_unit']
+ 'expire_value' => $_REQUEST['poll_expire_value'],
+ 'expire_unit' => $_REQUEST['poll_expire_unit']
];
- $obj = $this->extract_poll_data($poll, [ 'item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny ]);
+ $obj = $this->extract_poll_data($poll, ['item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny]);
}
else {
- $obj = $this->extract_bb_poll_data($body,[ 'item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny ]);
+ $obj = $this->extract_bb_poll_data($body, ['item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny]);
}
if ($obj) {
- $obj['url'] = $mid;
- $obj['attributedTo'] = channel_url($channel);
- $datarray['obj'] = $obj;
+ $obj['url'] = $mid;
+ $obj['id'] = $mid;
+ $obj['diaspora:guid'] = $uuid;
+ $obj['attributedTo'] = channel_url($channel);
+ $obj['published'] = $created;
+ $obj['name'] = $title;
+
+ $datarray['obj'] = $obj;
+
+ if ($obj['endTime']) {
+ $d = datetime_convert('UTC','UTC', $obj['endTime']);
+ if ($d > NULL_DATE) {
+ $comments_closed = $d;
+ }
+ }
+
$obj_type = 'Question';
}
- if(! $parent_mid) {
+ if (!$parent_mid) {
$parent_mid = $mid;
}
- if($parent_item)
+ if ($parent_item)
$parent_mid = $parent_item['mid'];
-
// Fallback so that we alway have a thr_parent
- if(!$thr_parent)
+ if (!$thr_parent)
$thr_parent = $mid;
- $item_thread_top = ((! $parent) ? 1 : 0);
+ $item_thread_top = ((!$parent) ? 1 : 0);
// fix permalinks for cards
- if($webpage == ITEM_TYPE_CARD) {
+ if ($webpage == ITEM_TYPE_CARD) {
$plink = z_root() . '/cards/' . $channel['channel_address'] . '/' . (($pagetitle) ? $pagetitle : $uuid);
}
- if(($parent_item) && ($parent_item['item_type'] == ITEM_TYPE_CARD)) {
+ if (($parent_item) && ($parent_item['item_type'] == ITEM_TYPE_CARD)) {
$r = q("select v from iconfig where iconfig.cat = 'system' and iconfig.k = 'CARD' and iconfig.iid = %d limit 1",
intval($parent_item['id'])
);
- if($r) {
+ if ($r) {
$plink = z_root() . '/cards/' . $channel['channel_address'] . '/' . $r[0]['v'];
}
}
- if($webpage == ITEM_TYPE_ARTICLE) {
+ if ($webpage == ITEM_TYPE_ARTICLE) {
$plink = z_root() . '/articles/' . $channel['channel_address'] . '/' . (($pagetitle) ? $pagetitle : $uuid);
}
- if(($parent_item) && ($parent_item['item_type'] == ITEM_TYPE_ARTICLE)) {
+ if (($parent_item) && ($parent_item['item_type'] == ITEM_TYPE_ARTICLE)) {
$r = q("select v from iconfig where iconfig.cat = 'system' and iconfig.k = 'ARTICLE' and iconfig.iid = %d limit 1",
intval($parent_item['id'])
);
- if($r) {
+ if ($r) {
$plink = z_root() . '/articles/' . $channel['channel_address'] . '/' . $r[0]['v'];
}
}
- if ((! $plink) && ($item_thread_top)) {
+ if ((!$plink) && ($item_thread_top)) {
// $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . gen_link_id($mid);
// $plink = substr($plink,0,190);
$plink = $mid;
@@ -1097,6 +1092,7 @@ class Item extends Controller {
$datarray['created'] = $created;
$datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
$datarray['expires'] = $expires;
+ $datarray['comments_closed'] = $comments_closed;
$datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
$datarray['received'] = (($orig_post) ? datetime_convert() : $created);
$datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
@@ -1152,33 +1148,33 @@ class Item extends Controller {
// A specific ACL over-rides public_policy completely
- if(! empty_acl($datarray))
+ if (!empty_acl($datarray))
$datarray['public_policy'] = '';
- if($iconfig)
+ if ($iconfig)
$datarray['iconfig'] = $iconfig;
// preview mode - prepare the body for display and send it via json
- if($preview) {
+ if ($preview) {
require_once('include/conversation.php');
- $datarray['owner'] = $owner_xchan;
+ $datarray['owner'] = $owner_xchan;
$datarray['author'] = $observer;
$datarray['attach'] = json_encode($datarray['attach']);
- $o = conversation(array($datarray),'search',false,'preview');
- // logger('preview: ' . $o, LOGGER_DEBUG);
- echo json_encode(array('preview' => $o));
+ $o = conversation([$datarray], 'search', false, 'preview');
+ // logger('preview: ' . $o, LOGGER_DEBUG);
+ echo json_encode(['preview' => $o]);
killme();
}
- if($orig_post)
+ if ($orig_post)
$datarray['edit'] = true;
// suppress duplicates, *unless* you're editing an existing post. This could get picked up
// as a duplicate if you're editing it very soon after posting it initially and you edited
// some attribute besides the content, such as title or categories.
- if(feature_enabled($profile_uid,'suppress_duplicates') && (! $orig_post)) {
+ if (feature_enabled($profile_uid, 'suppress_duplicates') && (!$orig_post)) {
$z = q("select created from item where uid = %d and created > %s - INTERVAL %s and body = '%s' limit 1",
intval($profile_uid),
@@ -1187,45 +1183,45 @@ class Item extends Controller {
dbesc($body)
);
- if($z) {
+ if ($z) {
$datarray['cancel'] = 1;
- notice( t('Duplicate post suppressed.') . EOL);
+ notice(t('Duplicate post suppressed.') . EOL);
logger('Duplicate post. Faking plugin cancel.');
}
}
- call_hooks('post_local',$datarray);
+ call_hooks('post_local', $datarray);
- if(x($datarray,'cancel')) {
+ if (x($datarray, 'cancel')) {
logger('mod_item: post cancelled by plugin or duplicate suppressed.');
- if($return_path)
+ if ($return_path)
goaway(z_root() . "/" . $return_path);
- if($api_source)
- return ( [ 'success' => false, 'message' => 'operation cancelled' ] );
- $json = array('cancel' => 1);
+ if ($api_source)
+ return (['success' => false, 'message' => 'operation cancelled']);
+ $json = ['cancel' => 1];
$json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
echo json_encode($json);
killme();
}
- if(mb_strlen($datarray['title']) > 191)
- $datarray['title'] = mb_substr($datarray['title'],0,191);
+ if (mb_strlen($datarray['title']) > 191)
+ $datarray['title'] = mb_substr($datarray['title'], 0, 191);
- if($webpage) {
- IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
+ if ($webpage) {
+ IConfig::Set($datarray, 'system', webpage_to_namespace($webpage),
(($pagetitle) ? $pagetitle : basename($datarray['mid'])), true);
}
- elseif($namespace) {
- IConfig::Set($datarray,'system', $namespace,
+ elseif ($namespace) {
+ IConfig::Set($datarray, 'system', $namespace,
(($remote_id) ? $remote_id : basename($datarray['mid'])), true);
}
- if($orig_post) {
+ if ($orig_post) {
$datarray['id'] = $post_id;
- $x = item_store_update($datarray,$execflag);
+ $x = item_store_update($datarray, $execflag);
// We only need edit activities for other federated protocols
// which do not support edits natively. While this does federate
@@ -1239,82 +1235,80 @@ class Item extends Controller {
// item_create_edit_activity($x);
- if(! $parent) {
+ if (!$parent) {
$r = q("select * from item where id = %d",
intval($post_id)
);
- if($r) {
+ if ($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- Libsync::build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
+ Libsync::build_sync_packet($profile_uid, ['item' => [encode_item($sync_item[0], true)]]);
}
}
- if(! $nopush)
- Master::Summon([ 'Notifier', 'edit_post', $post_id ]);
+ if (!$nopush)
+ Master::Summon(['Notifier', 'edit_post', $post_id]);
- if($api_source)
- return($x);
+ if ($api_source)
+ return ($x);
- if((x($_REQUEST,'return')) && strlen($return_path)) {
+ if ((x($_REQUEST, 'return')) && strlen($return_path)) {
logger('return: ' . $return_path);
- goaway(z_root() . "/" . $return_path );
+ goaway(z_root() . "/" . $return_path);
}
killme();
}
- else
- $post_id = 0;
- $post = item_store($datarray,$execflag);
+ $post = item_store($datarray, $execflag);
$post_id = $post['item_id'];
$datarray = $post['item'];
- if($post_id) {
+ if ($post_id) {
logger('mod_item: saved item ' . $post_id);
- if($parent) {
+ if ($parent) {
// prevent conversations which you are involved from being expired
- if(local_channel())
+ if (local_channel())
retain_item($parent);
// only send comment notification if this is a wall-to-wall comment,
// otherwise it will happen during delivery
- if(($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
- Enotify::submit(array(
- 'type' => NOTIFY_COMMENT,
- 'from_xchan' => $datarray['author_xchan'],
- 'to_xchan' => $datarray['owner_xchan'],
- 'item' => $datarray,
- 'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $parent,
- 'parent_mid' => $parent_item['mid']
- ));
+ if (($datarray['owner_xchan'] != $datarray['author_xchan']) && (intval($parent_item['item_wall']))) {
+ Enotify::submit([
+ 'type' => NOTIFY_COMMENT,
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
+ 'item' => $datarray,
+ 'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'item',
+ 'parent' => $parent,
+ 'parent_mid' => $parent_item['mid']
+ ]);
}
}
else {
$parent = $post_id;
- if(($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
- Enotify::submit(array(
- 'type' => NOTIFY_WALL,
- 'from_xchan' => $datarray['author_xchan'],
- 'to_xchan' => $datarray['owner_xchan'],
- 'item' => $datarray,
- 'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item'
- ));
+ if (($datarray['owner_xchan'] != $datarray['author_xchan']) && ($datarray['item_type'] == ITEM_TYPE_POST)) {
+ Enotify::submit([
+ 'type' => NOTIFY_WALL,
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
+ 'item' => $datarray,
+ 'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'item'
+ ]);
}
- if($uid && $uid == $profile_uid && (is_item_normal($datarray))) {
+ if ($uid && $uid == $profile_uid && (is_item_normal($datarray))) {
q("update channel set channel_lastpost = '%s' where channel_id = %d",
dbesc(datetime_convert()),
intval($uid)
@@ -1326,7 +1320,7 @@ class Item extends Controller {
// This way we don't see every picture in your new photo album posted to your wall at once.
// They will show up as people comment on them.
- if(intval($parent_item['item_hidden'])) {
+ if (intval($parent_item['item_hidden'])) {
$r = q("UPDATE item SET item_hidden = 0 WHERE id = %d",
intval($parent_item['id'])
);
@@ -1334,22 +1328,22 @@ class Item extends Controller {
}
else {
logger('mod_item: unable to retrieve post that was just stored.');
- notice( t('System error. Post not saved.') . EOL);
- if($return_path)
- goaway(z_root() . "/" . $return_path );
- if($api_source)
- return ( [ 'success' => false, 'message' => 'system error' ] );
+ notice(t('System error. Post not saved.') . EOL);
+ if ($return_path)
+ goaway(z_root() . "/" . $return_path);
+ if ($api_source)
+ return (['success' => false, 'message' => 'system error']);
killme();
}
- if($parent || $datarray['item_private'] == 1) {
+ if ($parent || $datarray['item_private'] == 1) {
$r = q("select * from item where id = %d",
intval($post_id)
);
- if($r) {
+ if ($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- Libsync::build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
+ Libsync::build_sync_packet($profile_uid, ['item' => [encode_item($sync_item[0], true)]]);
}
}
@@ -1362,46 +1356,46 @@ class Item extends Controller {
$nopush = false;
}
- if(! $nopush)
- Master::Summon([ 'Notifier', $notify_type, $post_id ]);
+ if (!$nopush)
+ Master::Summon(['Notifier', $notify_type, $post_id]);
logger('post_complete');
- if($moderated) {
+ if ($moderated) {
info(t('Your comment is awaiting approval.') . EOL);
}
// figure out how to return, depending on from whence we came
- if($api_source)
+ if ($api_source)
return $post;
- if($return_path) {
- if($return_path === 'hq') {
+ if ($return_path) {
+ if ($return_path === 'hq') {
goaway(z_root() . '/hq/' . gen_link_id($datarray['mid']));
}
goaway(z_root() . "/" . $return_path);
}
- if($mode === 'channel')
+ if ($mode === 'channel')
profile_load($channel['channel_address']);
- $item[] = $datarray;
- $item[0]['owner'] = $owner_xchan;
+ $item[] = $datarray;
+ $item[0]['owner'] = $owner_xchan;
$item[0]['author'] = $observer;
$item[0]['attach'] = $datarray['attach'];
$json = [
'success' => 1,
- 'id' => $post_id,
- 'html' => conversation($item,$mode,true,'r_preview'),
+ 'id' => $post_id,
+ 'html' => conversation($item, $mode, true, 'r_preview'),
];
- if(x($_REQUEST,'jsreload') && strlen($_REQUEST['jsreload']))
+ if (x($_REQUEST, 'jsreload') && strlen($_REQUEST['jsreload']))
$json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
- logger('post_json: ' . print_r($json,true), LOGGER_DEBUG);
+ logger('post_json: ' . print_r($json, true), LOGGER_DEBUG);
echo json_encode($json);
killme();
@@ -1411,10 +1405,10 @@ class Item extends Controller {
function get() {
- if((! local_channel()) && (! remote_channel()))
+ if ((!local_channel()) && (!remote_channel()))
return;
- if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
+ if ((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
require_once('include/items.php');
@@ -1423,16 +1417,16 @@ class Item extends Controller {
intval(argv(2))
);
- if($i) {
- $can_delete = false;
+ if ($i) {
+ $can_delete = false;
$local_delete = false;
- if(local_channel() && local_channel() == $i[0]['uid']) {
+ if (local_channel() && local_channel() == $i[0]['uid']) {
$local_delete = true;
}
$ob_hash = get_observer_hash();
- if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan'])) {
+ if ($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan'])) {
$can_delete = true;
}
@@ -1440,15 +1434,15 @@ class Item extends Controller {
// If the item originated on this site+channel the deletion will propagate downstream.
// Otherwise just the local copy is removed.
- if(is_site_admin()) {
+ if (is_site_admin()) {
$local_delete = true;
- if(intval($i[0]['item_origin']))
+ if (intval($i[0]['item_origin']))
$can_delete = true;
}
- if(! ($can_delete || $local_delete)) {
- notice( t('Permission denied.') . EOL);
+ if (!($can_delete || $local_delete)) {
+ notice(t('Permission denied.') . EOL);
return;
}
@@ -1457,35 +1451,34 @@ class Item extends Controller {
$complex = false;
- if(intval($i[0]['item_type']) || ($local_delete && (! $can_delete))) {
+ if (intval($i[0]['item_type']) || ($local_delete && (!$can_delete))) {
drop_item($i[0]['id']);
}
else {
// complex deletion that needs to propagate and be performed in phases
- drop_item($i[0]['id'],true,DROPITEM_PHASE1);
+ drop_item($i[0]['id'], true, DROPITEM_PHASE1);
$complex = true;
}
$r = q("select * from item where id = %d",
intval($i[0]['id'])
);
- if($r) {
+ if ($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- Libsync::build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
+ Libsync::build_sync_packet($i[0]['uid'], ['item' => [encode_item($sync_item[0], true)]]);
}
- if($complex) {
- tag_deliver($i[0]['uid'],$i[0]['id']);
+ if ($complex) {
+ tag_deliver($i[0]['uid'], $i[0]['id']);
}
}
}
}
-
- function item_check_service_class($channel_id,$iswebpage) {
- $ret = array('success' => false, 'message' => '');
+ function item_check_service_class($channel_id, $iswebpage) {
+ $ret = ['success' => false, 'message' => ''];
if ($iswebpage) {
$r = q("select count(i.id) as total from item i
@@ -1501,23 +1494,23 @@ class Item extends Controller {
);
}
- if(! $r) {
+ if (!$r) {
$ret['message'] = t('Unable to obtain post information from database.');
return $ret;
}
if (!$iswebpage) {
- $max = engr_units_to_bytes(service_class_fetch($channel_id,'total_items'));
- if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {
- $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f top level posts.'),$max);
- return $result;
+ $max = engr_units_to_bytes(service_class_fetch($channel_id, 'total_items'));
+ if (!service_class_allows($channel_id, 'total_items', $r[0]['total'])) {
+ $ret['message'] .= upgrade_message() . sprintf(t('You have reached your limit of %1$.0f top level posts.'), $max);
+ return $ret;
}
}
else {
- $max = engr_units_to_bytes(service_class_fetch($channel_id,'total_pages'));
- if(! service_class_allows($channel_id,'total_pages',$r[0]['total'])) {
- $result['message'] .= upgrade_message() . sprintf( t('You have reached your limit of %1$.0f webpages.'),$max);
- return $result;
+ $max = engr_units_to_bytes(service_class_fetch($channel_id, 'total_pages'));
+ if (!service_class_allows($channel_id, 'total_pages', $r[0]['total'])) {
+ $ret['message'] .= upgrade_message() . sprintf(t('You have reached your limit of %1$.0f webpages.'), $max);
+ return $ret;
}
}
@@ -1525,51 +1518,51 @@ class Item extends Controller {
return $ret;
}
- function extract_bb_poll_data(&$body,$item) {
+ function extract_bb_poll_data(&$body, $item) {
$multiple = false;
- if (strpos($body,'[/question]') === false && strpos($body,'[/answer]') === false) {
+ if (strpos($body, '[/question]') === false && strpos($body, '[/answer]') === false) {
return false;
}
- if (strpos($body,'[nobb]') !== false) {
+ if (strpos($body, '[nobb]') !== false) {
return false;
}
- $obj = [];
- $ptr = [];
- $matches = null;
+ $obj = [];
+ $ptr = [];
+ $matches = null;
$obj['type'] = 'Question';
- if (preg_match_all('/\[answer\](.*?)\[\/answer\]/ism',$body,$matches,PREG_SET_ORDER)) {
+ if (preg_match_all('/\[answer\](.*?)\[\/answer\]/ism', $body, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
- $ptr[] = [ 'name' => $match[1], 'type' => 'Note', 'replies' => [ 'type' => 'Collection', 'totalItems' => 0 ]];
- $body = str_replace('[answer]' . $match[1] . '[/answer]', EMPTY_STR, $body);
+ $ptr[] = ['name' => $match[1], 'type' => 'Note', 'replies' => ['type' => 'Collection', 'totalItems' => 0]];
+ $body = str_replace('[answer]' . $match[1] . '[/answer]', EMPTY_STR, $body);
}
}
$matches = null;
- if (preg_match('/\[question\](.*?)\[\/question\]/ism',$body,$matches)) {
+ if (preg_match('/\[question\](.*?)\[\/question\]/ism', $body, $matches)) {
$obj['content'] = bbcode($matches[1]);
- $body = str_replace('[question]' . $matches[1] . '[/question]', $matches[1], $body);
- $obj['oneOf'] = $ptr;
+ $body = str_replace('[question]' . $matches[1] . '[/question]', $matches[1], $body);
+ $obj['oneOf'] = $ptr;
}
$matches = null;
- if (preg_match('/\[question=multiple\](.*?)\[\/question\]/ism',$body,$matches)) {
+ if (preg_match('/\[question=multiple\](.*?)\[\/question\]/ism', $body, $matches)) {
$obj['content'] = bbcode($matches[1]);
- $body = str_replace('[question=multiple]' . $matches[1] . '[/question]', $matches[1], $body);
- $obj['anyOf'] = $ptr;
+ $body = str_replace('[question=multiple]' . $matches[1] . '[/question]', $matches[1], $body);
+ $obj['anyOf'] = $ptr;
}
$matches = null;
- if (preg_match('/\[ends\](.*?)\[\/ends\]/ism',$body,$matches)) {
- $obj['endTime'] = datetime_convert(date_default_timezone_get(),'UTC', $matches[1],ATOM_TIME);
- $body = str_replace('[ends]' . $matches[1] . '[/ends]', EMPTY_STR, $body);
+ if (preg_match('/\[ends\](.*?)\[\/ends\]/ism', $body, $matches)) {
+ $obj['endTime'] = datetime_convert(date_default_timezone_get(), 'UTC', $matches[1], ATOM_TIME);
+ $body = str_replace('[ends]' . $matches[1] . '[/ends]', EMPTY_STR, $body);
}
@@ -1577,7 +1570,7 @@ class Item extends Controller {
$obj['to'] = Activity::map_acl($item);
}
else {
- $obj['to'] = [ ACTIVITY_PUBLIC_INBOX ];
+ $obj['to'] = [ACTIVITY_PUBLIC_INBOX];
}
return $obj;
@@ -1587,23 +1580,23 @@ class Item extends Controller {
function extract_poll_data($poll, $item) {
- $multiple = intval($poll['multiple_answers']);
+ $multiple = intval($poll['multiple_answers']);
$expire_value = intval($poll['expire_value']);
- $expire_unit = $poll['expire_unit'];
- $question = $poll['question'];
- $answers = $poll['answers'];
+ $expire_unit = $poll['expire_unit'];
+ $question = $poll['question'];
+ $answers = $poll['answers'];
- $obj = [];
- $ptr = [];
- $obj['type'] = 'Question';
+ $obj = [];
+ $ptr = [];
+ $obj['type'] = 'Question';
$obj['content'] = bbcode($question);
- foreach($answers as $answer) {
- if(trim($answer))
- $ptr[] = [ 'name' => escape_tags($answer), 'type' => 'Note', 'replies' => [ 'type' => 'Collection', 'totalItems' => 0 ]];
+ foreach ($answers as $answer) {
+ if (trim($answer))
+ $ptr[] = ['name' => escape_tags($answer), 'type' => 'Note', 'replies' => ['type' => 'Collection', 'totalItems' => 0]];
}
- if($multiple) {
+ if ($multiple) {
$obj['anyOf'] = $ptr;
}
else {
@@ -1612,11 +1605,13 @@ class Item extends Controller {
$obj['endTime'] = datetime_convert(date_default_timezone_get(), 'UTC', 'now + ' . $expire_value . ' ' . $expire_unit, ATOM_TIME);
+ $obj['directMessage'] = (intval($item['item_private']) === 2);
+
if ($item['item_private']) {
$obj['to'] = Activity::map_acl($item);
}
else {
- $obj['to'] = [ ACTIVITY_PUBLIC_INBOX ];
+ $obj['to'] = [ACTIVITY_PUBLIC_INBOX];
}
return $obj;
@@ -1624,5 +1619,4 @@ class Item extends Controller {
}
-
}
diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php
index e3fe4a954..8b36e8396 100644
--- a/Zotlabs/Module/Like.php
+++ b/Zotlabs/Module/Like.php
@@ -91,6 +91,12 @@ class Like extends Controller {
'id' => $arr['item']['id'],
'html' => conversation($items, $conv_mode, true, $page_mode),
];
+
+ // mod photos
+ if (isset($_REQUEST['reload']) && $_REQUEST['reload']) {
+ $ret['reload'] = 1;
+ }
+
return $ret;
}
diff --git a/Zotlabs/Module/Lockview.php b/Zotlabs/Module/Lockview.php
index 11c781df0..3637482c7 100644
--- a/Zotlabs/Module/Lockview.php
+++ b/Zotlabs/Module/Lockview.php
@@ -1,21 +1,30 @@
<?php
+
namespace Zotlabs\Module;
+use Zotlabs\Lib\AccessList;
+use Zotlabs\Web\Controller;
+
require_once('include/security.php');
-class Lockview extends \Zotlabs\Web\Controller {
+class Lockview extends Controller {
function get() {
- $atokens = array();
+ $atokens = [];
+ $atoken_xchans = [];
+ $access_list = [];
+ $guest_access_list = [];
- if(local_channel()) {
+ if (local_channel()) {
$at = q("select * from atoken where atoken_uid = %d",
intval(local_channel())
);
- if($at) {
- foreach($at as $t) {
- $atokens[] = atoken_xchan($t);
+ if ($at) {
+ foreach ($at as $t) {
+ $atoken_xchan = atoken_xchan($t);
+ $atokens[] = array_merge($t, $atoken_xchan);
+ $atoken_xchans[] = $atoken_xchan['xchan_hash'];
}
}
}
@@ -23,20 +32,20 @@ class Lockview extends \Zotlabs\Web\Controller {
$type = ((argc() > 1) ? argv(1) : 0);
if (is_numeric($type)) {
$item_id = intval($type);
- $type='item';
+ $type = 'item';
}
else {
$item_id = ((argc() > 2) ? intval(argv(2)) : 0);
}
- if(! $item_id)
+ if (!$item_id)
killme();
- if (! in_array($type, array('item', 'photo', 'attach', 'event', 'menu_item', 'chatroom')))
+ if (!in_array($type, ['item', 'photo', 'attach', 'menu_item', 'chatroom']))
killme();
// we have different naming in in menu_item table and chatroom table
- switch($type) {
+ switch ($type) {
case 'menu_item':
$id = 'mitem_id';
break;
@@ -53,134 +62,177 @@ class Lockview extends \Zotlabs\Web\Controller {
intval($item_id)
);
- if(! $r)
+ if (!$r)
killme();
$item = $r[0];
+ $uid = null;
+ $url = '';
- //we have different naming in in menu_item table and chatroom table
- switch($type) {
+ switch ($type) {
case 'menu_item':
$uid = $item['mitem_channel_id'];
break;
case 'chatroom':
- $uid = $item['cr_uid'];
+ $uid = $item['cr_uid'];
+ $channel = channelx_by_n($uid);
+ $url = z_root() . '/chat/' . $channel['channel_address'] . '/' . $item['cr_id'];
break;
- default:
+ case 'item':
$uid = $item['uid'];
+ $url = $item['plink'];
+ break;
+ case 'photo':
+ $uid = $item['uid'];
+ $channel = channelx_by_n($uid);
+ $url = z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $item['resource_id'];
+ break;
+ case 'attach':
+ $uid = $item['uid'];
+ $channel = channelx_by_n($uid);
+ $url = z_root() . '/cloud/' . $channel['channel_address'] . '/' . $item['display_path'];
+ break;
+ default:
break;
}
- if($uid != local_channel()) {
- echo '<div class="dropdown-item">' . t('Remote privacy information not available.') . '</div>';
+ if (intval($uid) !== local_channel()) {
+ echo '<div class="dropdown-item-text">' . t('Remote privacy information not available') . '</div>';
killme();
}
- if(intval($item['item_private']) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
- && (! strlen($item['deny_cid'])) && (! strlen($item['deny_gid']))) {
+ if (intval($item['item_private']) && (!strlen($item['allow_cid'])) && (!strlen($item['allow_gid']))
+ && (!strlen($item['deny_cid'])) && (!strlen($item['deny_gid']))) {
// if the post is private, but public_policy is blank ("visible to the internet"), and there aren't any
// specific recipients, we're the recipient of a post with "bcc" or targeted recipients; so we'll just show it
// as unknown specific recipients. The sender will have the visibility list and will fall through to the
// next section.
- echo '<div class="dropdown-item">' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</div>';
+ echo '<div class="dropdown-item-text">' . translate_scope((!$item['public_policy']) ? 'specific' : $item['public_policy']) . '</div>';
killme();
}
- $allowed_users = expand_acl($item['allow_cid']);
+ $allowed_users = expand_acl($item['allow_cid']);
$allowed_groups = expand_acl($item['allow_gid']);
- $deny_users = expand_acl($item['deny_cid']);
- $deny_groups = expand_acl($item['deny_gid']);
-
- $o = '<div class="dropdown-item">' . t('Visible to:') . '</div>';
- $l = array();
+ $deny_users = expand_acl($item['deny_cid']);
+ $deny_groups = expand_acl($item['deny_gid']);
- stringify_array_elms($allowed_groups,true);
- stringify_array_elms($allowed_users,true);
- stringify_array_elms($deny_groups,true);
- stringify_array_elms($deny_users,true);
+ stringify_array_elms($allowed_groups, true);
+ stringify_array_elms($allowed_users, true);
+ stringify_array_elms($deny_groups, true);
+ stringify_array_elms($deny_users, true);
+ $allowed_xchans = [];
$profile_groups = [];
- if($allowed_groups) {
- foreach($allowed_groups as $g) {
- if(substr($g,0,4) === '\'vp.') {
- $profile_groups[] = '\'' . substr($g,4);
+ if ($allowed_groups) {
+ foreach ($allowed_groups as $g) {
+ if (substr($g, 0, 4) === '\'vp.') {
+ $profile_groups[] = '\'' . substr($g, 4);
}
}
}
- if(count($profile_groups)) {
- $r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item"><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></div>';
- }
-
- if(count($allowed_groups)) {
- $r = q("SELECT gname FROM pgrp WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item"><b>' . $rr['gname'] . '</b></div>';
- }
- if(count($allowed_users)) {
- $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item">' . $rr['xchan_name'] . '</div>';
- if($atokens) {
- foreach($atokens as $at) {
- if(in_array("'" . $at['xchan_hash'] . "'",$allowed_users)) {
- $l[] = '<div class="dropdown-item">' . $at['xchan_name'] . '</div>';
- }
+
+ if ($profile_groups) {
+ $r = q("SELECT id, profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
+ if ($r) {
+ foreach ($r as $rr) {
+ $pgrp_members = AccessList::profile_members_xchan($uid, $rr['id']);
+ $allowed_xchans = array_merge($allowed_xchans, $pgrp_members);
+ $access_list[] = '<div class="dropdown-item-text" title="' . t('Profile', 'acl') . '">' . $rr['profile_name'] . '</div>';
+ }
+ }
+ }
+
+ if ($allowed_groups) {
+ $r = q("SELECT id, gname FROM pgrp WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
+ if ($r) {
+ foreach ($r as $rr) {
+ $pgrp_members = AccessList::members_xchan($uid, $rr['id']);
+ $allowed_xchans = array_merge($allowed_xchans, $pgrp_members);
+ $access_list[] = '<div class="dropdown-item-text" title="' . t('Privacy group') . '">' . $rr['gname'] . '</div>';
}
}
}
+ if ($allowed_users) {
+ $r = q("SELECT xchan_name, xchan_hash FROM xchan WHERE xchan_hash IN ( " . implode(', ', $allowed_users) . " )");
+ if ($r) {
+ foreach ($r as $rr) {
+ $allowed_xchans[] = $rr['xchan_hash'];
+ if (!in_array($rr['xchan_hash'], $atoken_xchans)) {
+ $access_list[] = '<div class="dropdown-item-text">' . $rr['xchan_name'] . '</div>';
+ }
+ }
+ }
+ }
$profile_groups = [];
- if($deny_groups) {
- foreach($deny_groups as $g) {
- if(substr($g,0,4) === '\'vp.') {
- $profile_groups[] = '\'' . substr($g,4);
+ if ($deny_groups) {
+ foreach ($deny_groups as $g) {
+ if (substr($g, 0, 4) === '\'vp.') {
+ $profile_groups[] = '\'' . substr($g, 4);
}
}
}
- if(count($profile_groups)) {
+
+ if ($profile_groups) {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item"><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></div>';
+ if ($r) {
+ foreach ($r as $rr) {
+ $access_list[] = '<div class="dropdown-item-text" title="' . t('Profile', 'acl') . '"><strike>' . $rr['profile_name'] . '</strike></b></div>';
+ }
+ }
}
-
-
- if(count($deny_groups)) {
+ if ($deny_groups) {
$r = q("SELECT gname FROM pgrp WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item"><b><strike>' . $rr['gname'] . '</strike></b></div>';
+ if ($r) {
+ foreach ($r as $rr) {
+ $access_list[] = '<div class="dropdown-item-text" title="' . t('Privacy group') . '"><strike>' . $rr['gname'] . '</strike></b></div>';
+ }
+ }
}
- if(count($deny_users)) {
+
+ if ($deny_users) {
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
- if($r)
- foreach($r as $rr)
- $l[] = '<div class="dropdown-item"><strike>' . $rr['xchan_name'] . '</strike></div>';
-
- if($atokens) {
- foreach($atokens as $at) {
- if(in_array("'" . $at['xchan_hash'] . "'",$deny_users)) {
- $l[] = '<div class="dropdown-item"><strike>' . $at['xchan_name'] . '</strike></div>';
- }
+ if ($r) {
+ foreach ($r as $rr) {
+ $access_list[] = '<div class="dropdown-item-text"><strike>' . $rr['xchan_name'] . '</strike></div>';
}
}
+ }
+
+ if ($atokens && $allowed_xchans && $url) {
+ $guest_access_list = [];
+ $allowed_xchans = array_unique($allowed_xchans);
+ foreach ($atokens as $atoken) {
+ if (in_array($atoken['xchan_hash'], $allowed_xchans)) {
+ $guest_access_list[] = '<div class="dropdown-item d-flex justify-content-between cursor-pointer" title="' . sprintf(t('Click to copy link to this ressource for guest %s to clipboard'), $atoken['xchan_name']) . '" data-token="' . $url . '?zat=' . $atoken['atoken_token'] . '" onclick="navigator.clipboard.writeText(this.dataset.token); $.jGrowl(\'' . t('Link copied') . '\', { sticky: false, theme: \'info\', life: 1000 });"><span>' . $atoken['xchan_name'] . '</span><i class="fa fa-copy p-1"></i></div>';
+ }
+ }
}
- echo $o . implode($l);
- killme();
+ $access_list_header = '';
+ if ($access_list) {
+ $access_list_header = '<div class="dropdown-header text-uppercase h6">' . t('Access') . '</div>';
+ }
+ $guest_access_list_header = '';
+ if ($guest_access_list) {
+ $guest_access_list_header = '<div class="dropdown-header text-uppercase h6">' . t('Guest access') . '</div>';
+ }
+
+ $divider = '';
+ if ($access_list && $guest_access_list) {
+ $divider = '<div class="dropdown-divider"></div>';
+ }
+
+ echo $access_list_header . implode($access_list) . $divider . $guest_access_list_header . implode($guest_access_list);
+ killme();
}
diff --git a/Zotlabs/Module/Manifest.php b/Zotlabs/Module/Manifest.php
index 6fe468a14..4c418a56a 100644
--- a/Zotlabs/Module/Manifest.php
+++ b/Zotlabs/Module/Manifest.php
@@ -4,11 +4,15 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\System;
+use Zotlabs\Render\Theme;
class Manifest extends Controller {
function init() {
+ // populate App::$theme_info
+ Theme::current();
+
$ret = [
'name' => ucfirst(System::get_platform_name()),
'short_name' => ucfirst(System::get_platform_name()),
@@ -18,15 +22,16 @@ class Manifest extends Controller {
[ 'src' => '/images/app/hz-128.png', 'sizes' => '128x128', 'type' => 'image/png' ],
[ 'src' => '/images/app/hz-144.png', 'sizes' => '144x144', 'type' => 'image/png' ],
[ 'src' => '/images/app/hz-152.png', 'sizes' => '152x152', 'type' => 'image/png' ],
- [ 'src' => '/images/app/hz-192.png', 'sizes' => '192x192', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-192.png', 'sizes' => '192x192', 'type' => 'image/png', 'purpose' => 'any maskable' ],
[ 'src' => '/images/app/hz-348.png', 'sizes' => '384x384', 'type' => 'image/png' ],
[ 'src' => '/images/app/hz-512.png', 'sizes' => '512x512', 'type' => 'image/png' ],
[ 'src' => '/images/app/hz.svg', 'sizes' => '64x64', 'type' => 'image/xml+svg' ]
],
+ 'theme_color' => App::$theme_info['theme_color'],
+ 'background_color' => App::$theme_info['background_color'],
'scope' => '/',
'start_url' => z_root(),
'display' => 'standalone',
- 'orientation' => 'any',
'share_target' => [
'action' => '/rpost',
'method' => 'POST',
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 03c56b9a2..016a0a309 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -1,12 +1,11 @@
<?php
namespace Zotlabs\Module;
-use Zotlabs\Lib\Group;
+use Zotlabs\Lib\AccessList;
use Zotlabs\Lib\Apps;
use App;
require_once('include/items.php');
-require_once('include/group.php');
require_once('include/contact_widgets.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
@@ -233,7 +232,7 @@ class Network extends \Zotlabs\Web\Controller {
if($group) {
$contact_str = '';
- $contacts = group_get_members($group);
+ $contacts = AccessList::members(local_channel(), $group);
if($contacts) {
$contact_str = ids_to_querystr($contacts, 'xchan', true);
}
@@ -246,7 +245,7 @@ class Network extends \Zotlabs\Web\Controller {
$item_thread_top = '';
$sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent $item_normal ) ";
- $x = group_rec_byhash(local_channel(), $group_hash);
+ $x = AccessList::by_hash(local_channel(), $group_hash);
if($x) {
$title = replace_macros(get_markup_template('section_title.tpl'), array(
diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php
index 84d492f8f..5989e3da6 100644
--- a/Zotlabs/Module/New_channel.php
+++ b/Zotlabs/Module/New_channel.php
@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
+use URLify;
+
require_once('include/channel.php');
require_once('include/permissions.php');
@@ -13,7 +15,6 @@ class New_channel extends \Zotlabs\Web\Controller {
$cmd = ((argc() > 1) ? argv(1) : '');
if($cmd === 'autofill.json') {
- require_once('library/urlify/URLify.php');
$result = array('error' => false, 'message' => '');
$n = trim($_REQUEST['name']);
@@ -24,7 +25,7 @@ class New_channel extends \Zotlabs\Web\Controller {
}
if((! $x) || strlen($x) > 64)
- $x = strtolower(\URLify::transliterate($n));
+ $x = strtolower(URLify::transliterate($n));
$test = array();
@@ -46,7 +47,6 @@ class New_channel extends \Zotlabs\Web\Controller {
}
if($cmd === 'checkaddr.json') {
- require_once('library/urlify/URLify.php');
$result = array('error' => false, 'message' => '');
$n = trim($_REQUEST['nick']);
if(! $n) {
@@ -60,7 +60,7 @@ class New_channel extends \Zotlabs\Web\Controller {
}
if((! $x) || strlen($x) > 64)
- $x = strtolower(\URLify::transliterate($n));
+ $x = strtolower(URLify::transliterate($n));
$test = array();
@@ -170,12 +170,12 @@ class New_channel extends \Zotlabs\Web\Controller {
$privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "" );
- $perm_roles = \Zotlabs\Access\PermissionRoles::roles();
+ $perm_roles = \Zotlabs\Access\PermissionRoles::channel_roles();
$name = array('name', t('Channel name'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), $name_help, "*");
$nickhub = '@' . \App::get_hostname();
$nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), $nick_help, "*");
- $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel permission role compatible with your usage needs and privacy requirements.') . '<br>' . '<a href="help/member/member_guide#Channel_Permission_Roles" target="_blank">' . t('Read more about channel permission roles') . '</a>',$perm_roles);
+ $role = array('permissions_role' , t('Channel role'), ($privacy_role) ? $privacy_role : 'personal', '', $perm_roles);
$o = replace_macros(get_markup_template('new_channel.tpl'), array(
'$title' => t('Create a Channel'),
diff --git a/Zotlabs/Module/Permcats.php b/Zotlabs/Module/Permcats.php
index 58566373a..8be5bba88 100644
--- a/Zotlabs/Module/Permcats.php
+++ b/Zotlabs/Module/Permcats.php
@@ -6,6 +6,7 @@ use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
use Zotlabs\Lib\Libsync;
+use Zotlabs\Lib\AccessList;
class Permcats extends Controller {
@@ -14,24 +15,94 @@ class Permcats extends Controller {
if(! local_channel())
return;
- if(! Apps::system_app_installed(local_channel(), 'Permission Categories'))
- return;
-
$channel = App::get_channel();
check_form_security_token_redirectOnErr('/permcats', 'permcats');
+ $name = escape_tags(trim($_REQUEST['name']));
+ $is_system_role = isset($_REQUEST['is_system_role']);
+ $return_path = z_root() . '/permcats/' . $_REQUEST['return_path'];
+ $group_hash = $_REQUEST['group_select'] ?? '';
+ $deleted_role = $_REQUEST['deleted_role'] ?? '';
+ $new_role = $_REQUEST['new_role'] ?? '';
+ $contacts = [];
- $all_perms = \Zotlabs\Access\Permissions::Perms();
+ if (argv(1) && hex2bin(argv(1)) !== $name) {
+ $return_path = z_root() . '/permcats/' . bin2hex($name);
+ }
+
+ if($deleted_role && $new_role) {
+ $r = q("SELECT abook_xchan FROM abook WHERE abook_channel = %d AND abook_role = '%s' AND abook_self = 0 AND abook_pending = 0",
+ intval(local_channel()),
+ dbesc($deleted_role)
+ );
+
+ if ($r) {
+ $contacts = ids_to_array($r, 'abook_xchan');
+ }
+
+ if ($contacts) {
+ \Zotlabs\Lib\Permcat::assign($channel, $new_role, $contacts);
+ }
+
+ \Zotlabs\Lib\Permcat::delete(local_channel(), $deleted_role);
+
+ $default_role = get_pconfig(local_channel(), 'system', 'default_permcat', 'default');
+ if($deleted_role === $default_role) {
+ set_pconfig(local_channel(), 'system', 'default_permcat', $new_role);
+ }
+
+ Libsync::build_sync_packet();
+ info(t('Contact role deleted.') . EOL);
- $name = escape_tags(trim($_POST['name']));
- if(! $name) {
+ goaway(z_root() . '/permcats/' . bin2hex($new_role));
+
+ return;
+ }
+
+ if ($group_hash === 'all_contacts') {
+ $r = q("SELECT abook_xchan FROM abook WHERE abook_channel = %d and abook_self = 0 and abook_pending = 0",
+ intval(local_channel())
+ );
+
+ if ($r) {
+ $contacts = ids_to_array($r, 'abook_xchan');
+ }
+ }
+
+ if (!$contacts && $group_hash) {
+ $group = AccessList::by_hash(local_channel(), $group_hash);
+ }
+
+ if ($group) {
+ $contacts = AccessList::members_xchan(local_channel(), $group['id']);
+ }
+
+ if(! $name ) {
notice( t('Permission category name is required.') . EOL);
return;
}
+ set_pconfig(local_channel(), 'system', 'default_permcat', 'default');
+
+ if (isset($_REQUEST['default_role'])) {
+ set_pconfig(local_channel(), 'system', 'default_permcat', $name);
+ }
+
+ if ($is_system_role) {
+ // if we have a system role just set the default and assign if aplicable and be done with it
+ if ($contacts) {
+ \Zotlabs\Lib\Permcat::assign($channel, $name, $contacts);
+ }
+
+ info( t('Contact role saved.') . EOL);
+ Libsync::build_sync_packet();
+ goaway($return_path);
+ return;
+ }
$pcarr = [];
+ $all_perms = \Zotlabs\Access\Permissions::Perms();
if($all_perms) {
foreach($all_perms as $perm => $desc) {
@@ -41,11 +112,16 @@ class Permcats extends Controller {
}
}
- \Zotlabs\Lib\Permcat::update(local_channel(),$name,$pcarr);
+ \Zotlabs\Lib\Permcat::update(local_channel(), $name, $pcarr);
+
+ if ($contacts) {
+ \Zotlabs\Lib\Permcat::assign($channel, $name, $contacts);
+ }
Libsync::build_sync_packet();
- info( t('Permission category saved.') . EOL);
+ info( t('Contact role saved.') . EOL);
+ goaway($return_path);
return;
}
@@ -56,41 +132,51 @@ class Permcats extends Controller {
if(! local_channel())
return;
- if(! Apps::system_app_installed(local_channel(), 'Permission Categories')) {
- //Do not display any associated widgets at this point
- App::$pdl = '';
- $papp = Apps::get_papp('Permission Categories');
- return Apps::app_render($papp, 'module');
- }
+ nav_set_selected('Contact Roles');
$channel = App::get_channel();
- if(argc() > 1)
+ if(argc() > 1) {
$name = hex2bin(argv(1));
-
- if(argc() > 2 && argv(2) === 'drop') {
- \Zotlabs\Lib\Permcat::delete(local_channel(),$name);
- Libsync::build_sync_packet();
- json_return_and_die([ 'success' => true ]);
}
-
- $desc = t('Use this form to create permission rules for various classes of people or connections.');
-
$existing = [];
$pcat = new \Zotlabs\Lib\Permcat(local_channel());
$pcatlist = $pcat->listing();
- $permcats = [];
+
+ $is_system_role = false;
+ $delete_role_select_options = [];
+ $is_default_role = (get_pconfig(local_channel(),'system','default_permcat','default') === $name);
+
if($pcatlist) {
foreach($pcatlist as $pc) {
- if(($pc['name']) && ($name) && ($pc['name'] == $name))
+ if(($pc['name']) && ($name) && ($pc['name'] == $name)) {
$existing = $pc['perms'];
- if(! $pc['system'])
- $permcats[bin2hex($pc['name'])] = $pc['localname'];
+ if (isset($pc['system']) && intval($pc['system']))
+ $is_system_role = $pc['name'];
+ }
+
+ if($pc['name'] == $name) {
+ $localname = $pc['localname'];
+ }
+
+ if ($pc['name'] !== $name) {
+ $delete_role_select_options[$pc['name']] = $pc['localname'];
+ }
+
}
}
+ // select for delete action
+ $delete_role_select = [
+ 'new_role',
+ (($is_default_role) ? t('Role to assign affected contacts and default role to') : t('Role to assign affected contacts to')),
+ '',
+ '',
+ $delete_role_select_options
+ ];
+
$global_perms = \Zotlabs\Access\Permissions::Perms();
foreach($global_perms as $k => $v) {
@@ -98,33 +184,53 @@ class Permcats extends Controller {
$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$k);
if($existing[$k])
- $thisperm = "1";
-
- $perms[] = array('perms_' . $k, $v, '',$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
+ $thisperm = 1;
+
+ $perms[] = [
+ 'perms_' . $k,
+ $v,
+ '',
+ $thisperm,
+ 1,
+ (($checkinherited & PERMS_SPECIFIC) ? '' : '1'),
+ '',
+ $checkinherited
+ ];
}
+ $group_select_options = [
+ 'selected' => '',
+ 'form_id' => 'group_select',
+ 'label' => t('Assign this role to'),
+ 'after' => [
+ 'name' => t('All my contacts'),
+ 'id' => 'all_contacts',
+ 'selected' => false
+ ]
+ ];
+
+ $group_select = AccessList::select(local_channel(), $group_select_options);
$tpl = get_markup_template("permcats.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("permcats"),
- '$title' => t('Permission Categories'),
- '$desc' => $desc,
- '$desc2' => $desc2,
- '$tokens' => $t,
- '$permcats' => $permcats,
- '$atoken' => $atoken,
- '$url1' => z_root() . '/channel/' . $channel['channel_address'],
- '$url2' => z_root() . '/photos/' . $channel['channel_address'],
- '$name' => array('name', t('Permission category name') . ' <span class="required">*</span>', (($name) ? $name : ''), ''),
- '$me' => t('My Settings'),
+ '$default_role' => array('default_role', t('Automatically assign this role to new contacts'), intval($is_default_role), '', [t('No'), t('Yes')]),
+ '$title' => t('Contact Roles'),
+ '$name' => ['name', t('Role name') . ' <span class="required">*</span>', (($localname) ? $localname : ''), (($is_system_role) ? t('System role - not editable') : '') , '', (($is_system_role) ? 'disabled' : '')],
+ '$delete_label' => t('Deleting') . ' ' . $localname,
+ '$current_role' => $name,
'$perms' => $perms,
'$inherited' => t('inherited'),
- '$notself' => 0,
- '$self' => 1,
- '$permlbl' => t('Individual Permissions'),
- '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
- '$submit' => t('Submit')
+ '$is_system_role' => $is_system_role,
+ '$permlbl' => t('Role Permissions'),
+ '$permnote' => t('Some permissions may be inherited from your <a href="settings">channel role</a>, which have higher priority than contact role settings.'),
+ '$submit' => t('Submit'),
+ '$return_path' => argv(1),
+ '$group_select' => $group_select,
+ '$delete_role_select' => $delete_role_select,
+ '$delet_role_button' => t('Delete')
+
));
return $o;
}
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index d6c80b653..661694d18 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -1,7 +1,11 @@
<?php
+
namespace Zotlabs\Module;
+use App;
+use Zotlabs\Daemon\Master;
use Zotlabs\Lib\Libsync;
+use Zotlabs\Web\Controller;
/*
* @file Profile_photo.php
@@ -15,109 +19,123 @@ require_once('include/photos.php');
require_once('include/channel.php');
/* @brief Function for sync'ing permissions of profile-photos and their profile
-*
-* @param $profileid The id number of the profile to sync
-* @return void
-*/
-
+ *
+ */
+class Profile_photo extends Controller {
-class Profile_photo extends \Zotlabs\Web\Controller {
-
/* @brief Initalize the profile-photo edit view
*
- * @return void
- *
*/
-
+
function init() {
-
- if(! local_channel()) {
+
+ if (!local_channel()) {
return;
}
-
- $channel = \App::get_channel();
- profile_load($channel['channel_address']);
-
+
+ $channel = App::get_channel();
+ $profile = App::$argv[1];
+
+ profile_load($channel['channel_address'], $profile);
+
+
}
-
+
/* @brief Evaluate posted values
*
- * @param $a Current application
- * @return void
- *
*/
-
+
function post() {
-
- if(! local_channel()) {
+
+ if (!local_channel()) {
return;
}
-
- $channel = \App::get_channel();
-
+
+ $channel = App::get_channel();
+
check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
-
- // Remove cover photo
- if(isset($_POST['remove'])) {
-
- $r = q("SELECT resource_id FROM photo WHERE photo_usage = %d AND uid = %d LIMIT 1",
- intval(PHOTO_PROFILE),
- intval(local_channel())
- );
-
- if($r) {
- q("update photo set photo_usage = %d where photo_usage = %d and uid = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval(local_channel())
- );
-
- $sync = attach_export_data($channel,$r[0]['resource_id']);
- if($sync)
- Libsync:: build_sync_packet($channel['channel_id'],array('file' => array($sync)));
+
+ $r = q("select id, profile_guid, is_default, gender from profile where uid = %d",
+ intval(local_channel())
+ );
+
+ $profile_id = intval($_POST['profile']);
+ $default_profile_id = null;
+ $profile = [];
+
+ foreach ($r as $rr) {
+ if ($rr['is_default']) {
+ $default_profile_id = intval($rr['id']);
}
-
+
+ if ($profile_id === intval($rr['id'])) {
+ $profile = $rr;
+ }
+ }
+
+ $is_default_profile = ($profile_id === $default_profile_id);
+
+ // Remove profile photo
+ if (isset($_POST['remove'])) {
+
+ if ($is_default_profile) {
+
+ $r = q("SELECT resource_id FROM photo WHERE photo_usage = %d AND uid = %d LIMIT 1",
+ intval(PHOTO_PROFILE),
+ intval(local_channel())
+ );
+
+ if ($r) {
+ q("update photo set photo_usage = %d where photo_usage = %d and uid = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval(local_channel())
+ );
+
+ q("update profile set photo = '%s', thumb = '%s' where is_default = 1 and uid = %d",
+ dbesc(z_root() . '/photo/profile/l/' . local_channel()),
+ dbesc(z_root() . '/photo/profile/m/' . local_channel()),
+ intval(local_channel())
+ );
+ }
+ }
+ else {
+ q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
+ dbesc(z_root() . '/' . get_default_profile_photo(300)),
+ dbesc(z_root() . '/' . get_default_profile_photo(80)),
+ intval($profile_id),
+ intval(local_channel())
+ );
+ }
+
+ $sync = attach_export_data($channel, $r[0]['resource_id']);
+ if ($sync)
+ Libsync:: build_sync_packet($channel['channel_id'], ['file' => [$sync]]);
+
$_SESSION['reload_avatar'] = true;
-
- goaway(z_root() . '/profiles');
+
+ goaway(z_root() . '/profiles/' . $profile_id);
}
-
- if((array_key_exists('cropfinal',$_POST)) && (intval($_POST['cropfinal']) == 1)) {
-
+
+ if ((array_key_exists('cropfinal', $_POST)) && (intval($_POST['cropfinal']) == 1)) {
+
// logger('crop: ' . print_r($_POST,true));
// phase 2 - we have finished cropping
-
- if(argc() != 2) {
- notice( t('Image uploaded but image cropping failed.') . EOL );
+
+ if (argc() != 2) {
+ notice(t('Image uploaded but image cropping failed.') . EOL);
return;
}
-
- $image_id = argv(1);
-
- if(substr($image_id,-2,1) == '-') {
- $scale = substr($image_id,-1,1);
- $image_id = substr($image_id,0,-2);
- }
+ $image_id = argv(1);
- // unless proven otherwise
- $is_default_profile = 1;
-
- if($_REQUEST['profile']) {
- $r = q("select id, profile_guid, is_default, gender from profile where id = %d and uid = %d limit 1",
- intval($_REQUEST['profile']),
- intval(local_channel())
- );
- if($r) {
- $profile = $r[0];
- if(! intval($profile['is_default']))
- $is_default_profile = 0;
- }
- }
+ if (substr($image_id, -2, 1) == '-') {
+ $scale = substr($image_id, -1, 1);
+ $image_id = substr($image_id, 0, -2);
+ }
-
$srcX = intval($_POST['xstart']);
$srcY = intval($_POST['ystart']);
$srcW = intval($_POST['xfinal']) - $srcX;
@@ -126,45 +144,45 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND imgscale = %d LIMIT 1",
dbesc($image_id),
dbesc(local_channel()),
- intval($scale));
- if($r) {
-
- $base_image = $r[0];
+ intval($scale)
+ );
+
+ if ($r) {
+
+ $base_image = $r[0];
$base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($base_image['content'])) : dbunescbin($base_image['content']));
-
+
$im = photo_factory($base_image['content'], $base_image['mimetype']);
- if($im->is_valid()) {
-
- $im->cropImage(300,$srcX,$srcY,$srcW,$srcH);
-
+ if ($im->is_valid()) {
+
+ $im->cropImage(300, $srcX, $srcY, $srcW, $srcH);
+
$aid = get_account_id();
-
- $p = [
- 'aid' => $aid,
- 'uid' => local_channel(),
+
+ $p = [
+ 'aid' => $aid,
+ 'uid' => local_channel(),
'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'],
+ 'filename' => $base_image['filename'],
'album' => t('Profile Photos'),
'os_path' => $base_image['os_path'],
'display_path' => $base_image['display_path'],
- 'photo_usage' => PHOTO_PROFILE,
- 'edited' => dbescdate($base_image['edited'])
+ 'photo_usage' => (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL),
+ 'edited' => dbescdate($base_image['edited'])
];
-
- $p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
-
+
$r1 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_300);
-
+
$im->scaleImage(80);
$r2 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_80);
-
+
$im->scaleImage(48);
$r3 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_48);
- if($r1 === false || $r2 === false || $r3 === false) {
+ if ($r1 === false || $r2 === false || $r3 === false) {
// if one failed, delete them all so we can start over.
- notice( t('Image resize failed.') . EOL );
- $x = q("delete from photo where resource_id = '%s' and uid = %d and imgscale in ( %d, %d, %d )",
+ notice(t('Image resize failed.') . EOL);
+ q("delete from photo where resource_id = '%s' and uid = %d and imgscale in ( %d, %d, %d )",
dbesc($base_image['resource_id']),
local_channel(),
intval(PHOTO_RES_PROFILE_300),
@@ -179,59 +197,55 @@ class Profile_photo extends \Zotlabs\Web\Controller {
intval(PHOTO_RES_PROFILE_80),
intval(PHOTO_RES_PROFILE_48)
);
- if($x) {
- foreach($x as $xx) {
+ if ($x) {
+ foreach ($x as $xx) {
@unlink(dbunescbin($xx['content']));
}
}
-
+
return;
}
-
+
// If setting for the default profile, unset the profile photo flag from any other photos I own
-
- if($is_default_profile) {
- $r = q("update profile set photo = '%s', thumb = '%s' where is_default = 1 and uid = %d",
+ if ($is_default_profile) {
+ q("update profile set photo = '%s', thumb = '%s' where is_default = 1 and uid = %d",
dbesc(z_root() . '/photo/profile/l/' . local_channel()),
dbesc(z_root() . '/photo/profile/m/' . local_channel()),
intval(local_channel())
);
-
- $r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d
+ q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d
AND resource_id != '%s' AND uid = %d",
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE),
dbesc($base_image['resource_id']),
intval(local_channel())
);
-
- send_profile_photo_activity($channel,$base_image,$profile);
-
+ send_profile_photo_activity($channel, $base_image, $profile);
}
else {
- $r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
+ q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-4'),
dbesc(z_root() . '/photo/' . $base_image['resource_id'] . '-5'),
- intval($_REQUEST['profile']),
+ intval($profile_id),
intval(local_channel())
);
}
-
+
// set $send to false in profiles_build_sync() to return the data
- // so that we only send one sync packet.
+ // so that we only send one sync packet.
+
+ $sync_profiles = profiles_build_sync(local_channel(), false);
- $sync_profiles = profiles_build_sync(local_channel(),false);
-
// We'll set the updated profile-photo timestamp even if it isn't the default profile,
// so that browsers will do a cache update unconditionally
// Also set links back to site-specific profile photo url in case it was
- // changed to a generic URL by a clone operation. Otherwise the new photo may
+ // changed to a generic URL by a clone operation. Otherwise the new photo may
// not get pushed to other sites correctly.
-
- $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s'
+
+ q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s'
where xchan_hash = '%s'",
dbesc($im->getType()),
dbescdate($base_image['edited']),
@@ -241,341 +255,372 @@ class Profile_photo extends \Zotlabs\Web\Controller {
dbesc($channel['xchan_hash'])
);
- photo_profile_setperms(local_channel(),$base_image['resource_id'],$_REQUEST['profile']);
+ photo_profile_setperms(local_channel(), $base_image['resource_id'], $profile_id);
- $sync = attach_export_data($channel,$base_image['resource_id']);
- if($sync)
- Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync), 'profile' => $sync_profiles));
+ $sync = attach_export_data($channel, $base_image['resource_id']);
+ if ($sync)
+ Libsync::build_sync_packet($channel['channel_id'], ['file' => [$sync], 'profile' => $sync_profiles]);
// Similarly, tell the nav bar to bypass the cache and update the avatar image.
$_SESSION['reload_avatar'] = true;
-
- info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
-
+
+ info(t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
+
// Update directory in background
- \Zotlabs\Daemon\Master::Summon(array('Directory',$channel['channel_id']));
-
+ Master::Summon(['Directory', $channel['channel_id']]);
+
}
else
- notice( t('Unable to process image') . EOL);
+ notice(t('Unable to process image') . EOL);
}
-
- goaway(z_root() . '/profiles');
+
+ goaway(z_root() . '/profiles/' . $profile_id);
return; // NOTREACHED
}
-
+
// A new photo was uploaded. Store it and save some important details
// in App::$data for use in the cropping function
-
-
- $hash = photo_new_resource();
+
+ $hash = photo_new_resource();
$importing = false;
- $smallest = 0;
-
+ $smallest = 0;
- if($_REQUEST['importfile']) {
- $hash = $_REQUEST['importfile'];
+ if ($_REQUEST['importfile']) {
+ $hash = $_REQUEST['importfile'];
$importing = true;
}
else {
- require_once('include/attach.php');
-
- $res = attach_store(\App::get_channel(), get_observer_hash(), '', array('album' => t('Profile Photos'), 'hash' => $hash, 'nosync' => true));
-
- logger('attach_store: ' . print_r($res,true));
+
+ $matches = [];
+ $partial = false;
+
+ if (array_key_exists('HTTP_CONTENT_RANGE', $_SERVER)) {
+ $pm = preg_match('/bytes (\d*)\-(\d*)\/(\d*)/', $_SERVER['HTTP_CONTENT_RANGE'], $matches);
+ if ($pm) {
+ logger('Content-Range: ' . print_r($matches, true));
+ $partial = true;
+ }
+ }
+
+ if ($partial) {
+ $x = save_chunk($channel, $matches[1], $matches[2], $matches[3]);
+
+ if ($x['partial']) {
+ header('Range: bytes=0-' . (($x['length']) ? $x['length'] - 1 : 0));
+ json_return_and_die($x);
+ }
+ else {
+ header('Range: bytes=0-' . (($x['size']) ? $x['size'] - 1 : 0));
+
+ $_FILES['userfile'] = [
+ 'name' => $x['name'],
+ 'type' => $x['type'],
+ 'tmp_name' => $x['tmp_name'],
+ 'error' => $x['error'],
+ 'size' => $x['size']
+ ];
+ }
+ }
+ else {
+ if (!array_key_exists('userfile', $_FILES)) {
+ $_FILES['userfile'] = [
+ 'name' => $_FILES['files']['name'],
+ 'type' => $_FILES['files']['type'],
+ 'tmp_name' => $_FILES['files']['tmp_name'],
+ 'error' => $_FILES['files']['error'],
+ 'size' => $_FILES['files']['size']
+ ];
+ }
+ }
+
+ $res = attach_store(App::get_channel(), get_observer_hash(), '', ['album' => t('Profile Photos'), 'hash' => $hash, 'nosync' => true, 'source' => 'photos']);
+
+ json_return_and_die(['message' => $hash]);
+
}
-
- if(($res && intval($res['data']['is_photo'])) || $importing) {
+
+ if (($res && intval($res['data']['is_photo'])) || $importing) {
$i = q("select * from photo where resource_id = '%s' and uid = %d order by imgscale",
dbesc($hash),
intval(local_channel())
);
-
- if(! $i) {
- notice( t('Image upload failed.') . EOL );
+
+ if (!$i) {
+ notice(t('Image upload failed.') . EOL);
return;
}
+
$os_storage = false;
-
- foreach($i as $ii) {
- if(intval($ii['imgscale']) < PHOTO_RES_640) {
- $smallest = intval($ii['imgscale']);
+
+ foreach ($i as $ii) {
+ if (intval($ii['imgscale']) < PHOTO_RES_640) {
+ $smallest = intval($ii['imgscale']);
$os_storage = intval($ii['os_storage']);
- $imagedata = $ii['content'];
- $filetype = $ii['mimetype'];
+ $imagedata = $ii['content'];
+ $filetype = $ii['mimetype'];
}
}
}
-
+
$imagedata = (($os_storage) ? @file_get_contents(dbunescbin($imagedata)) : dbunescbin($imagedata));
- $ph = photo_factory($imagedata, $filetype);
-
- if(! $ph->is_valid()) {
- notice( t('Unable to process image.') . EOL );
+ $ph = photo_factory($imagedata, $filetype);
+
+ if (!$ph->is_valid()) {
+ notice(t('Unable to process image.') . EOL);
return;
}
-
- return $this->profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+
+ return $this->profile_photo_crop_ui_head($ph, $hash, $smallest);
// This will "fall through" to the get() method, and since
- // App::$data['imagecrop'] is set, it will proceed to cropping
- // rather than present the upload form
+ // App::$data['imagecrop'] is set, it will proceed to cropping
+ // rather than present the upload form
}
-
-
+
+
/* @brief Generate content of profile-photo view
*
- * @param $a Current application
- * @return void
- *
*/
-
-
+
+
function get() {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL );
+
+ if (!local_channel()) {
+ notice(t('Permission denied.') . EOL);
return;
}
-
- $channel = \App::get_channel();
- $pf = 0;
- $newuser = false;
-
- if(argc() == 2 && argv(1) === 'new')
- $newuser = true;
-
- if(argv(1) === 'use') {
- if (argc() < 3) {
- notice( t('Permission denied.') . EOL );
- return;
- };
-
- $resource_id = argv(2);
-
- $pf = (($_REQUEST['pf']) ? intval($_REQUEST['pf']) : 0);
+ $channel = App::get_channel();
+ $profile_id = (($_REQUEST['profile']) ? intval($_REQUEST['profile']) : intval(argv(1)));
+ $default_profile_id = null;
- $c = q("select id, is_default from profile where uid = %d",
- intval(local_channel())
- );
+ $r = q("select id, profile_name as name, is_default from profile where uid = %d order by id asc",
+ intval(local_channel())
+ );
- $multi_profiles = true;
- if(($c) && (count($c) === 1) && (intval($c[0]['is_default']))) {
- $_REQUEST['profile'] = $c[0]['id'];
- $multi_profiles = false;
+ foreach ($r as $rr) {
+ if ($rr['is_default']) {
+ $default_profile_id = intval($rr['id']);
}
- else {
- $_REQUEST['profile'] = $pf;
+
+ if ($profile_id === intval($rr['id'])) {
+ $profile = $rr;
}
+ }
+
+ $is_default_profile = ($profile_id === $default_profile_id);
+
+ if (argv(1) === 'use') {
+ if (argc() < 3) {
+ notice(t('Permission denied.') . EOL);
+ return;
+ };
+
+ $resource_id = argv(2);
$r = q("SELECT id, album, imgscale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY imgscale ASC",
intval(local_channel()),
dbesc($resource_id)
);
- if(! $r) {
- notice( t('Photo not available.') . EOL );
+ if (!$r) {
+ notice(t('Photo not available.') . EOL);
return;
}
$havescale = false;
- foreach($r as $rr) {
- if($rr['imgscale'] == PHOTO_RES_PROFILE_80)
+ foreach ($r as $rr) {
+ if ($rr['imgscale'] == PHOTO_RES_PROFILE_80)
$havescale = true;
}
-
+
// set an already loaded and cropped photo as profile photo
-
- if($havescale) {
- // unset any existing profile photos
- $x = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND uid = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
+
+ if ($havescale) {
+
+ if ($is_default_profile) {
+
+ // unset any existing profile photos
+ q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND uid = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ intval(local_channel())
+ );
+
+ $edited = datetime_convert();
+
+ q("UPDATE photo SET photo_usage = %d, edited = '%s' WHERE uid = %d AND resource_id = '%s' AND imgscale > 0",
+ intval(PHOTO_PROFILE),
+ dbescdate($edited),
+ intval(local_channel()),
+ dbesc($resource_id)
+ );
+
+ q("UPDATE xchan SET xchan_photo_date = '%s' WHERE xchan_hash = '%s'",
+ dbescdate($edited),
+ dbesc($channel['xchan_hash'])
+
+ );
+
+ }
+
+ q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d",
+ dbesc(z_root() . '/photo/' . $resource_id . '-4'),
+ dbesc(z_root() . '/photo/' . $resource_id . '-5'),
+ intval($profile_id),
intval(local_channel())
);
- $edited = datetime_convert();
-
- $x = q("UPDATE photo SET photo_usage = %d, edited = '%s' WHERE uid = %d AND resource_id = '%s' AND imgscale > 0",
- intval(PHOTO_PROFILE),
- dbescdate($edited),
- intval(local_channel()),
- dbesc($resource_id)
- );
-
- $x = q("UPDATE xchan SET xchan_photo_date = '%s' WHERE xchan_hash = '%s'",
- dbescdate($edited),
- dbesc($channel['xchan_hash'])
- );
-
- photo_profile_setperms(local_channel(),$resource_id,$_REQUEST['profile']);
+ photo_profile_setperms(local_channel(), $resource_id, $profile_id);
- $sync = attach_export_data($channel,$resource_id);
- if($sync)
- Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
+ $sync = attach_export_data($channel, $resource_id);
+ if ($sync)
+ Libsync::build_sync_packet($channel['channel_id'], ['file' => [$sync]]);
$_SESSION['reload_avatar'] = true;
- \Zotlabs\Daemon\Master::Summon(array('Directory',local_channel()));
-
- goaway(z_root() . '/profiles');
+ Master::Summon(['Directory', local_channel()]);
+
+ goaway(z_root() . '/profiles/' . $profile_id);
}
-
+
$r = q("SELECT content, mimetype, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
intval($r[0]['id']),
intval(local_channel())
-
+
);
- if(! $r) {
- notice( t('Photo not available.') . EOL );
+ if (!$r) {
+ notice(t('Photo not available.') . EOL);
return;
}
-
- if(intval($r[0]['os_storage']))
- $data = @file_get_contents(dbunescbin($r[0]['content']));
- else
- $data = dbunescbin($r[0]['content']);
-
- $ph = photo_factory($data, $r[0]['mimetype']);
+
+ if (intval($r[0]['os_storage'])) {
+ $data = @file_get_contents($r[0]['content']);
+ }
+ else {
+ $data = dbunescbin($r[0]['content']);
+ }
+
+ $ph = photo_factory($data, $r[0]['mimetype']);
$smallest = 0;
- if($ph->is_valid()) {
+
+ if ($ph->is_valid()) {
+
// go ahead as if we have just uploaded a new photo to crop
$i = q("select resource_id, imgscale from photo where resource_id = '%s' and uid = %d order by imgscale",
dbesc($r[0]['resource_id']),
intval(local_channel())
);
-
- if($i) {
+
+ if ($i) {
$hash = $i[0]['resource_id'];
- foreach($i as $ii) {
- if(intval($ii['imgscale']) < PHOTO_RES_640) {
+ foreach ($i as $ii) {
+ if (intval($ii['imgscale']) < PHOTO_RES_640) {
$smallest = intval($ii['imgscale']);
}
}
- }
- }
-
- if($multi_profiles) {
- \App::$data['importfile'] = $resource_id;
- }
- else {
- $this->profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+ }
}
+ $this->profile_photo_crop_ui_head($ph, $hash, $smallest);
+
// falls through with App::$data['imagecrop'] set so we go straight to the cropping section
}
-
- // present an upload form
- $profiles = q("select id, profile_name as name, is_default from profile where uid = %d order by id asc",
- intval(local_channel())
- );
+ $importing = ((array_key_exists('importfile', App::$data)) ? true : false);
- if($profiles) {
- for($x = 0; $x < count($profiles); $x ++) {
- $profiles[$x]['selected'] = false;
- if($pf && $profiles[$x]['id'] == $pf)
- $profiles[$x]['selected'] = true;
- if((! $pf) && $profiles[$x]['is_default'])
- $profiles[$x]['selected'] = true;
- }
- }
+ if (!x(App::$data, 'imagecrop')) {
- $importing = ((array_key_exists('importfile',\App::$data)) ? true : false);
-
- if(! x(\App::$data,'imagecrop')) {
-
$tpl = get_markup_template('profile_photo.tpl');
-
- $o .= replace_macros($tpl,array(
- '$user' => \App::$channel['channel_address'],
- '$info' => ((count($profiles) > 1) ? t('Your default profile photo is visible to anybody on the internet. Profile photos for alternate profiles will inherit the permissions of the profile') : t('Your profile photo is visible to anybody on the internet and may be distributed to other websites.')),
- '$importfile' => (($importing) ? \App::$data['importfile'] : ''),
- '$lbl_upfile' => t('Upload File:'),
- '$lbl_profiles' => t('Select a profile:'),
- '$title' => (($importing) ? t('Use Photo for Profile') : t('Change Profile Photo')),
- '$submit' => (($importing) ? t('Use') : t('Upload')),
- '$remove' => t('Remove'),
- '$profiles' => $profiles,
- '$single' => ((count($profiles) == 1) ? true : false),
- '$profile0' => $profiles[0],
- '$embedPhotos' => t('Use a photo from your albums'),
- '$embedPhotosModalTitle' => t('Use a photo from your albums'),
+
+ $o = replace_macros($tpl, [
+ '$user' => App::$channel['channel_address'],
+ '$info' => (($is_default_profile) ? t('This profile photo will be visible to anybody on the internet and may be distributed to other websites.') : t('This profile photo will be visible only to channels with permission to view this profile.')),
+ '$importfile' => (($importing) ? App::$data['importfile'] : ''),
+ '$title' => (($importing) ? t('Use Photo for Profile') : t('Change Profile Photo')),
+ '$submit' => t('Upload'),
+ '$remove' => t('Reset to default'),
+ '$profile_id' => $profile_id,
+ '$profile' => $profile,
+ '$embedPhotos' => t('Use a photo from your albums'),
+ '$embedPhotosModalTitle' => t('Use a photo from your albums'),
'$embedPhotosModalCancel' => t('Cancel'),
- '$embedPhotosModalOK' => t('OK'),
- '$modalchooseimages' => t('Choose images to embed'),
- '$modalchoosealbum' => t('Choose an album'),
- '$modaldiffalbum' => t('Choose a different album'),
- '$modalerrorlist' => t('Error getting album list'),
- '$modalerrorlink' => t('Error getting photo link'),
- '$modalerroralbum' => t('Error getting album'),
- '$form_security_token' => get_form_security_token("profile_photo"),
- '$select' => t('Select existing photo'),
- ));
-
+ '$embedPhotosModalOK' => t('OK'),
+ '$modalchooseimages' => t('Choose images to embed'),
+ '$modalchoosealbum' => t('Choose an album'),
+ '$modaldiffalbum' => t('Choose a different album'),
+ '$modalerrorlist' => t('Error getting album list'),
+ '$modalerrorlink' => t('Error getting photo link'),
+ '$modalerroralbum' => t('Error getting album'),
+ '$form_security_token' => get_form_security_token("profile_photo"),
+ '$select' => t('Select existing'),
+ ]);
+
call_hooks('profile_photo_content_end', $o);
-
+
return $o;
}
else {
// present a cropping form
- $filename = \App::$data['imagecrop'] . '-' . \App::$data['imagecrop_resolution'];
- $resolution = \App::$data['imagecrop_resolution'];
- $tpl = get_markup_template("cropbody.tpl");
- $o .= replace_macros($tpl,array(
- '$filename' => $filename,
- '$profile' => intval($_REQUEST['profile']),
- '$resource' => \App::$data['imagecrop'] . '-' . \App::$data['imagecrop_resolution'],
- '$image_url' => z_root() . '/photo/' . $filename,
- '$title' => t('Crop Image'),
- '$desc' => t('Please adjust the image cropping for optimum viewing.'),
+ $filename = App::$data['imagecrop'] . '-' . App::$data['imagecrop_resolution'];
+ $tpl = get_markup_template("cropbody.tpl");
+
+ $o = replace_macros($tpl, [
+ '$filename' => $filename,
+ '$profile' => $profile_id,
+ '$resource' => App::$data['imagecrop'] . '-' . App::$data['imagecrop_resolution'],
+ '$image_url' => z_root() . '/photo/' . $filename,
+ '$title' => t('Crop Image'),
+ '$desc' => t('Please adjust the image cropping for optimum viewing.'),
'$form_security_token' => get_form_security_token("profile_photo"),
- '$done' => t('Done Editing')
- ));
+ '$done' => t('Done editing')
+ ]);
+
return $o;
}
-
+
return; // NOTREACHED
}
-
+
/* @brief Generate the UI for photo-cropping
*
- * @param $a Current application
- * @param $ph Photo-Factory
- * @return void
+ * @param $ph
+ * @param $hash
+ * @param $smallest
*
*/
-
-
-
- function profile_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
-
- $max_length = get_config('system','max_image_length');
- if(! $max_length)
+
+
+ function profile_photo_crop_ui_head($ph, $hash, $smallest) {
+
+ $max_length = get_config('system', 'max_image_length');
+
+ if (!$max_length) {
$max_length = MAX_IMAGE_LENGTH;
- if($max_length > 0)
+ }
+ if ($max_length > 0) {
$ph->scaleImage($max_length);
-
- \App::$data['width'] = $ph->getWidth();
- \App::$data['height'] = $ph->getHeight();
-
- if(\App::$data['width'] < 500 || \App::$data['height'] < 500) {
+ }
+
+ App::$data['width'] = $ph->getWidth();
+ App::$data['height'] = $ph->getHeight();
+
+ if (App::$data['width'] < 500 || App::$data['height'] < 500) {
$ph->scaleImageUp(400);
- \App::$data['width'] = $ph->getWidth();
- \App::$data['height'] = $ph->getHeight();
+ App::$data['width'] = $ph->getWidth();
+ App::$data['height'] = $ph->getHeight();
}
-
-
- \App::$data['imagecrop'] = $hash;
- \App::$data['imagecrop_resolution'] = $smallest;
- \App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
+
+ App::$data['imagecrop'] = $hash;
+ App::$data['imagecrop_resolution'] = $smallest;
+ App::$page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), []);
+
return;
}
-
-
+
+
}
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index 73bae45e8..70f6b1125 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -163,35 +163,6 @@ class Profiles extends \Zotlabs\Web\Controller {
killme();
}
-
-
-
- // Run profile_load() here to make sure the theme is set before
- // we start loading content
- if(((argc() > 1) && (intval(argv(1)))) || !feature_enabled(local_channel(),'multi_profiles')) {
- if(feature_enabled(local_channel(),'multi_profiles'))
- $id = \App::$argv[1];
- else {
- $x = q("select id from profile where uid = %d and is_default = 1",
- intval(local_channel())
- );
- if($x)
- $id = $x[0]['id'];
- }
- $r = q("SELECT * FROM profile WHERE id = %d AND uid = %d LIMIT 1",
- intval($id),
- intval(local_channel())
- );
- if(! count($r)) {
- notice( t('Profile not found.') . EOL);
- \App::$error = 404;
- return;
- }
-
- $chan = \App::get_channel();
-
- profile_load($chan['channel_address'],$r[0]['id']);
- }
}
function post() {
@@ -317,8 +288,6 @@ class Profiles extends \Zotlabs\Web\Controller {
$work = fix_mce_lf(escape_tags(trim($_POST['work'])));
$education = fix_mce_lf(escape_tags(trim($_POST['education'])));
- $hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
-
// start fresh and create a new vcard. TODO: preserve the original guid or whatever else needs saving
// $orig_vcard = (($orig[0]['profile_vcard']) ? \Sabre\VObject\Reader::read($orig[0]['profile_vcard']) : null);
@@ -514,6 +483,16 @@ class Profiles extends \Zotlabs\Web\Controller {
$value = $locality . $comma1 . $region . $comma2 . $country_name;
}
+ $hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
+
+ $suggestme = ((x($_POST, 'suggestme')) ? intval($_POST['suggestme']) : 0);
+ set_pconfig(local_channel(), 'system', 'suggestme', $suggestme);
+
+ $show_presence = (((x($_POST, 'show_presence')) && (intval($_POST['show_presence']) == 1)) ? 1 : 0);
+ set_pconfig(local_channel(), 'system', 'show_online_status', $show_presence);
+
+ $publish = ((x($_POST, 'profile_in_directory') && (intval($_POST['profile_in_directory']) == 1)) ? 1 : 0);
+
profile_activity($changes,$value);
}
@@ -552,7 +531,8 @@ class Profiles extends \Zotlabs\Web\Controller {
employment = '%s',
education = '%s',
hide_friends = %d,
- profile_vcard = '%s'
+ profile_vcard = '%s',
+ publish = %d
WHERE id = %d AND uid = %d",
dbesc($profile_name),
dbesc($name),
@@ -588,6 +568,7 @@ class Profiles extends \Zotlabs\Web\Controller {
dbesc($education),
intval($hide_friends),
dbesc($profile_vcard),
+ intval($publish),
intval(argv(1)),
intval(local_channel())
);
@@ -619,8 +600,6 @@ class Profiles extends \Zotlabs\Web\Controller {
}
if($is_default) {
- // reload the info for the sidebar widget
- profile_load($channel['channel_address']);
\Zotlabs\Daemon\Master::Summon(array('Directory',local_channel()));
}
}
@@ -631,13 +610,13 @@ class Profiles extends \Zotlabs\Web\Controller {
$o = '';
- $channel = \App::get_channel();
-
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
+ $channel = \App::get_channel();
+
require_once('include/channel.php');
$profile_fields_basic = get_profile_fields_basic();
@@ -653,15 +632,20 @@ class Profiles extends \Zotlabs\Web\Controller {
if($x)
$id = $x[0]['id'];
}
+
$r = q("SELECT * FROM profile WHERE id = %d AND uid = %d LIMIT 1",
intval($id),
intval(local_channel())
);
+
if(! $r) {
notice( t('Profile not found.') . EOL);
return;
}
+ // make sure we got uptodate data
+ profile_load($channel['channel_address'], $id);
+
$editselect = 'none';
\App::$page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), array(
@@ -675,13 +659,43 @@ class Profiles extends \Zotlabs\Web\Controller {
else
$fields = $profile_fields_basic;
- $hide_friends = array(
- 'hide_friends',
- t('Hide your connections list from viewers of this profile'),
- $r[0]['hide_friends'],
- '',
- array(t('No'),t('Yes'))
- );
+ $show_presence = [];
+ $profile_in_dir = '';
+ $suggestme = '';
+ $hide_friends = [];
+ $is_default = (($r[0]['is_default']) ? 1 : 0);
+
+ if ($is_default) {
+
+ $hide_friends = array(
+ 'hide_friends',
+ t('Hide my connections from viewers of this profile'),
+ $r[0]['hide_friends'],
+ '',
+ [t('No'), t('Yes')]
+ );
+
+
+ $opt_tpl = get_markup_template("field_checkbox.tpl");
+ if (get_config('system', 'publish_all')) {
+ $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
+ }
+ else {
+ $profile_in_dir = replace_macros($opt_tpl, [
+ '$field' => ['profile_in_directory', t('Publish my default profile in the network directory'), $r[0]['publish'], '', [t('No'), t('Yes')]],
+ ]);
+ }
+
+ $suggestme = get_pconfig(local_channel(), 'system', 'suggestme');
+ $suggestme = (($suggestme === false) ? '0' : $suggestme); // default if not set: 0
+
+ $suggestme = replace_macros($opt_tpl, [
+ '$field' => ['suggestme', t('Suggest me as a potential contact to new members'), $suggestme, '', [t('No'), t('Yes')]],
+ ]);
+
+ $show_presence_val = intval(get_pconfig(local_channel(), 'system', 'show_online_status'));
+ $show_presence = ['show_presence', t('Reveal my online status'), $show_presence_val, '', [t('No'), t('Yes')]];
+ }
$q = q("select * from profdef where true");
if($q) {
@@ -710,7 +724,7 @@ class Profiles extends \Zotlabs\Web\Controller {
if(! $f)
$f = 'ymd';
- $is_default = (($r[0]['is_default']) ? 1 : 0);
+
$tpl = get_markup_template("profile_edit.tpl");
$o .= replace_macros($tpl,array(
@@ -724,7 +738,7 @@ class Profiles extends \Zotlabs\Web\Controller {
'$banner' => t('Edit Profile Details'),
'$submit' => t('Submit'),
'$viewprof' => t('View this profile'),
- '$editvis' => t('Edit visibility'),
+ '$editvis' => t('Edit visibility'),
'$tools_label' => t('Profile Tools'),
'$coverpic' => t('Change cover photo'),
'$profpic' => t('Change profile photo'),
@@ -732,7 +746,7 @@ class Profiles extends \Zotlabs\Web\Controller {
'$cl_prof' => t('Clone this profile'),
'$del_prof' => t('Delete this profile'),
'$addthing' => t('Add profile things'),
- '$personal' => t('Personal'),
+ '$basic' => t('Basic'),
'$location' => t('Location'),
'$relation' => t('Relationship'),
'$miscellaneous'=> t('Miscellaneous'),
@@ -801,6 +815,11 @@ class Profiles extends \Zotlabs\Web\Controller {
'$update' => t('Update'),
'$delete' => t('Delete'),
'$cancel' => t('Cancel'),
+
+ '$show_presence' => $show_presence,
+ '$suggestme' => $suggestme,
+ '$profile_in_dir' => $profile_in_dir,
+
));
$arr = array('profile' => $r[0], 'entry' => $o);
diff --git a/Zotlabs/Module/Regate.php b/Zotlabs/Module/Regate.php
index 379195461..33bb8d957 100644
--- a/Zotlabs/Module/Regate.php
+++ b/Zotlabs/Module/Regate.php
@@ -2,6 +2,9 @@
namespace Zotlabs\Module;
+use Zotlabs\Lib\Connect;
+use Zotlabs\Daemon\Master;
+
require_once('include/security.php');
/**
@@ -184,7 +187,24 @@ class Regate extends \Zotlabs\Web\Controller {
$new_channel = auto_channel_create($cra['account']['account_id']);
if($new_channel['success']) {
+
$channel_id = $new_channel['channel']['channel_id'];
+
+ // If we have an inviter, connect.
+ if ($didx === 'i' && intval($r['reg_byc'])) {
+ $invite_channel = channelx_by_n($r['reg_byc']);
+ if ($invite_channel) {
+ $f = Connect::connect($new_channel['channel'], $invite_channel['xchan_addr']);
+ if ($f['success']) {
+ $can_view_stream = intval(get_abconfig($channel_id, $f['abook']['abook_xchan'], 'their_perms', 'view_stream'));
+ // If we can view their stream, pull in some posts
+ if ($can_view_stream) {
+ Master::Summon(['Onepoll', $f['abook']['abook_id']]);
+ }
+ }
+ }
+ }
+
change_channel($channel_id);
$nextpage = 'profiles/' . $channel_id;
$msg_code = 'ZAR1239I';
diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php
index e95752338..a0da020b7 100644
--- a/Zotlabs/Module/Settings/Channel.php
+++ b/Zotlabs/Module/Settings/Channel.php
@@ -2,6 +2,10 @@
namespace Zotlabs\Module\Settings;
+use App;
+use Zotlabs\Access\PermissionLimits;
+use Zotlabs\Access\PermissionRoles;
+use Zotlabs\Daemon\Master;
use Zotlabs\Lib\Apps;
use Zotlabs\Lib\Libsync;
@@ -10,602 +14,272 @@ require_once('include/selectors.php');
class Channel {
-
function post() {
- $channel = \App::get_channel();
-
check_form_security_token_redirectOnErr('/settings', 'settings');
-
call_hooks('settings_post', $_POST);
- $set_perms = '';
-
- $role = ((x($_POST,'permissions_role')) ? notags(trim($_POST['permissions_role'])) : '');
- $oldrole = get_pconfig(local_channel(),'system','permissions_role');
-
- // This mapping can be removed after 3.4 release
- if($oldrole === 'social_party') {
- $oldrole = 'social_federation';
- }
-
- if(($role != $oldrole) || ($role === 'custom')) {
-
- if($role === 'custom') {
- $hide_presence = (((x($_POST,'hide_presence')) && (intval($_POST['hide_presence']) == 1)) ? 1: 0);
- $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
- $def_group = ((x($_POST,'group-selection')) ? notags(trim($_POST['group-selection'])) : '');
- $r = q("update channel set channel_default_group = '%s' where channel_id = %d",
- dbesc($def_group),
- intval(local_channel())
- );
-
- $global_perms = \Zotlabs\Access\Permissions::Perms();
-
- foreach($global_perms as $k => $v) {
- \Zotlabs\Access\PermissionLimits::Set(local_channel(),$k,intval($_POST[$k]));
- }
- $acl = new \Zotlabs\Access\AccessList($channel);
- $acl->set_from_array($_POST);
- $x = $acl->get();
-
- $r = q("update channel set channel_allow_cid = '%s', channel_allow_gid = '%s',
- channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d",
- dbesc($x['allow_cid']),
- dbesc($x['allow_gid']),
- dbesc($x['deny_cid']),
- dbesc($x['deny_gid']),
- intval(local_channel())
- );
- }
- else {
- $role_permissions = \Zotlabs\Access\PermissionRoles::role_perms($_POST['permissions_role']);
- if(! $role_permissions) {
- notice('Permissions category could not be found.');
- return;
- }
- $hide_presence = 1 - (intval($role_permissions['online']));
- if($role_permissions['default_collection']) {
- $r = q("select hash from pgrp where uid = %d and gname = '%s' limit 1",
- intval(local_channel()),
- dbesc( t('Friends') )
- );
- if(! $r) {
- require_once('include/group.php');
- group_add(local_channel(), t('Friends'));
- group_add_member(local_channel(),t('Friends'),$channel['channel_hash']);
- $r = q("select hash from pgrp where uid = %d and gname = '%s' limit 1",
- intval(local_channel()),
- dbesc( t('Friends') )
- );
- }
- if($r) {
- q("update channel set channel_default_group = '%s', channel_allow_gid = '%s', channel_allow_cid = '', channel_deny_gid = '', channel_deny_cid = '' where channel_id = %d",
- dbesc($r[0]['hash']),
- dbesc('<' . $r[0]['hash'] . '>'),
- intval(local_channel())
- );
- }
- else {
- notice( sprintf('Default privacy group \'%s\' not found. Please create and re-submit permission change.', t('Friends')) . EOL);
- return;
- }
- }
- // no default collection
- else {
- q("update channel set channel_default_group = '', channel_allow_gid = '', channel_allow_cid = '', channel_deny_gid = '',
- channel_deny_cid = '' where channel_id = %d",
- intval(local_channel())
- );
- }
-
- if($role_permissions['perms_connect']) {
- $x = \Zotlabs\Access\Permissions::FilledPerms($role_permissions['perms_connect']);
- foreach($x as $k => $v) {
- set_abconfig(local_channel(),$channel['channel_hash'],'my_perms',$k, $v);
- if($role_permissions['perms_auto']) {
- set_pconfig(local_channel(),'autoperms',$k,$v);
- }
- else {
- del_pconfig(local_channel(),'autoperms',$k);
- }
- }
- }
-
- if($role_permissions['limits']) {
- foreach($role_permissions['limits'] as $k => $v) {
- \Zotlabs\Access\PermissionLimits::Set(local_channel(),$k,$v);
- }
- }
- if(array_key_exists('directory_publish',$role_permissions)) {
- $publish = intval($role_permissions['directory_publish']);
- }
- }
-
- set_pconfig(local_channel(),'system','hide_online_status',$hide_presence);
- set_pconfig(local_channel(),'system','permissions_role',$role);
- }
-
- $username = ((x($_POST,'username')) ? notags(trim($_POST['username'])) : '');
- $timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
- $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : '');
- $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : '');
- $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0);
- $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0);
- $evdays = ((x($_POST,'evdays')) ? intval($_POST['evdays']) : 3);
- $photo_path = ((x($_POST,'photo_path')) ? escape_tags(trim($_POST['photo_path'])) : '');
- $attach_path = ((x($_POST,'attach_path')) ? escape_tags(trim($_POST['attach_path'])) : '');
-
- $expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
- $expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
- $expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
- $expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0);
-
- $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
-
- $blocktags = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
- $unkmail = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
- $cntunkmail = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
- $suggestme = ((x($_POST,'suggestme')) ? intval($_POST['suggestme']) : 0);
- $autoperms = ((x($_POST,'autoperms')) ? intval($_POST['autoperms']) : 0);
-
- $post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0);
- $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
- $post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
- $adult = (($_POST['adult'] == 1) ? 1 : 0);
- $defpermcat = ((x($_POST,'defpermcat')) ? notags(trim($_POST['defpermcat'])) : 'default');
-
- $mailhost = ((array_key_exists('mailhost',$_POST)) ? notags(trim($_POST['mailhost'])) : '');
-
- $pageflags = $channel['channel_pageflags'];
- $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
- if($adult != $existing_adult)
+ $channel = App::get_channel();
+ $role = ((x($_POST, 'permissions_role')) ? notags(trim($_POST['permissions_role'])) : '');
+ $timezone = ((x($_POST, 'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
+ $defloc = ((x($_POST, 'defloc')) ? notags(trim($_POST['defloc'])) : '');
+ $evdays = ((x($_POST, 'evdays')) ? intval($_POST['evdays']) : 3);
+ $photo_path = ((x($_POST, 'photo_path')) ? escape_tags(trim($_POST['photo_path'])) : '');
+ $attach_path = ((x($_POST, 'attach_path')) ? escape_tags(trim($_POST['attach_path'])) : '');
+ $allow_location = (((x($_POST, 'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1 : 0);
+ $post_newfriend = (($_POST['post_newfriend'] == 1) ? 1 : 0);
+ $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1 : 0);
+ $post_profilechange = (($_POST['post_profilechange'] == 1) ? 1 : 0);
+ $adult = (($_POST['adult'] == 1) ? 1 : 0);
+ $mailhost = ((array_key_exists('mailhost', $_POST)) ? notags(trim($_POST['mailhost'])) : '');
+ $pageflags = $channel['channel_pageflags'];
+ $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
+ $expire = ((x($_POST, 'expire')) ? intval($_POST['expire']) : 0);
+
+ if ($adult != $existing_adult) {
$pageflags = ($pageflags ^ PAGE_ADULT);
-
+ }
$notify = 0;
-
- if(x($_POST,'notify1'))
+ if (x($_POST, 'notify1'))
$notify += intval($_POST['notify1']);
- if(x($_POST,'notify2'))
+ if (x($_POST, 'notify2'))
$notify += intval($_POST['notify2']);
- if(x($_POST,'notify3'))
+ if (x($_POST, 'notify3'))
$notify += intval($_POST['notify3']);
- if(x($_POST,'notify4'))
+ if (x($_POST, 'notify4'))
$notify += intval($_POST['notify4']);
- if(x($_POST,'notify5'))
+ if (x($_POST, 'notify5'))
$notify += intval($_POST['notify5']);
- if(x($_POST,'notify6'))
+ if (x($_POST, 'notify6'))
$notify += intval($_POST['notify6']);
- if(x($_POST,'notify7'))
+ if (x($_POST, 'notify7'))
$notify += intval($_POST['notify7']);
- if(x($_POST,'notify8'))
+ if (x($_POST, 'notify8'))
$notify += intval($_POST['notify8']);
$vnotify = 0;
-
- if(x($_POST,'vnotify1'))
+ if (x($_POST, 'vnotify1'))
$vnotify += intval($_POST['vnotify1']);
- if(x($_POST,'vnotify2'))
+ if (x($_POST, 'vnotify2'))
$vnotify += intval($_POST['vnotify2']);
- if(x($_POST,'vnotify3'))
+ if (x($_POST, 'vnotify3'))
$vnotify += intval($_POST['vnotify3']);
- if(x($_POST,'vnotify4'))
+ if (x($_POST, 'vnotify4'))
$vnotify += intval($_POST['vnotify4']);
- if(x($_POST,'vnotify5'))
+ if (x($_POST, 'vnotify5'))
$vnotify += intval($_POST['vnotify5']);
- if(x($_POST,'vnotify6'))
+ if (x($_POST, 'vnotify6'))
$vnotify += intval($_POST['vnotify6']);
- if(x($_POST,'vnotify7'))
+ if (x($_POST, 'vnotify7'))
$vnotify += intval($_POST['vnotify7']);
- if(x($_POST,'vnotify8'))
+ if (x($_POST, 'vnotify8'))
$vnotify += intval($_POST['vnotify8']);
- if(x($_POST,'vnotify9'))
+ if (x($_POST, 'vnotify9'))
$vnotify += intval($_POST['vnotify9']);
- if(x($_POST,'vnotify10'))
+ if (x($_POST, 'vnotify10'))
$vnotify += intval($_POST['vnotify10']);
- if(x($_POST,'vnotify11') && is_site_admin())
+ if (x($_POST, 'vnotify11') && is_site_admin())
$vnotify += intval($_POST['vnotify11']);
- if(x($_POST,'vnotify12'))
+ if (x($_POST, 'vnotify12'))
$vnotify += intval($_POST['vnotify12']);
- if(x($_POST,'vnotify13'))
+ if (x($_POST, 'vnotify13'))
$vnotify += intval($_POST['vnotify13']);
- if(x($_POST,'vnotify14'))
+ if (x($_POST, 'vnotify14'))
$vnotify += intval($_POST['vnotify14']);
- if(x($_POST,'vnotify15'))
+ if (x($_POST, 'vnotify15'))
$vnotify += intval($_POST['vnotify15']);
- $always_show_in_notices = x($_POST, 'always_show_in_notices') ? 1 : 0;
- $update_notices_per_parent = x($_POST, 'update_notices_per_parent') ? 1 : 0;
+ $always_show_in_notices = ((x($_POST, 'always_show_in_notices')) ? 1 : 0);
+ $update_notices_per_parent = ((x($_POST, 'update_notices_per_parent')) ? 1 : 0);
- $err = '';
+ if ($timezone !== $channel['channel_timezone']) {
+ if (strlen($timezone))
+ date_default_timezone_set($timezone);
+ }
- $name_change = false;
+ if (!$role) {
+ notice(t('Please select a channel role') . EOL);
+ return;
+ }
+
+ if ($role !== get_pconfig(local_channel(), 'system', 'permissions_role')) {
+ $role_permissions = PermissionRoles::role_perms($_POST['permissions_role']);
- if($username != $channel['channel_name']) {
- $name_change = true;
- require_once('include/channel.php');
- $err = validate_channelname($username);
- if($err) {
- notice($err);
- return;
+ if (isset($role_permissions['limits'])) {
+ foreach ($role_permissions['limits'] as $k => $v) {
+ PermissionLimits::Set(local_channel(), $k, $v);
+ }
}
- }
- if($timezone != $channel['channel_timezone']) {
- if(strlen($timezone))
- date_default_timezone_set($timezone);
+ set_pconfig(local_channel(), 'system', 'group_actor', 0);
+ if (isset($role_permissions['channel_type']) && $role_permissions['channel_type'] === 'group') {
+ set_pconfig(local_channel(), 'system', 'group_actor', 1);
+ }
}
- set_pconfig(local_channel(),'system','use_browser_location',$allow_location);
- set_pconfig(local_channel(),'system','suggestme', $suggestme);
- set_pconfig(local_channel(),'system','post_newfriend', $post_newfriend);
- set_pconfig(local_channel(),'system','post_joingroup', $post_joingroup);
- set_pconfig(local_channel(),'system','post_profilechange', $post_profilechange);
- set_pconfig(local_channel(),'system','blocktags',$blocktags);
- set_pconfig(local_channel(),'system','vnotify',$vnotify);
- set_pconfig(local_channel(),'system','always_show_in_notices',$always_show_in_notices);
- set_pconfig(local_channel(),'system','update_notices_per_parent',$update_notices_per_parent);
- set_pconfig(local_channel(),'system','evdays',$evdays);
- set_pconfig(local_channel(),'system','photo_path',$photo_path);
- set_pconfig(local_channel(),'system','attach_path',$attach_path);
- set_pconfig(local_channel(),'system','default_permcat',$defpermcat);
- set_pconfig(local_channel(),'system','email_notify_host',$mailhost);
- set_pconfig(local_channel(),'system','autoperms',$autoperms);
-
- $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d",
- dbesc($username),
+ set_pconfig(local_channel(), 'system', 'permissions_role', $role);
+ set_pconfig(local_channel(), 'system', 'use_browser_location', $allow_location);
+ set_pconfig(local_channel(), 'system', 'post_newfriend', $post_newfriend);
+ set_pconfig(local_channel(), 'system', 'post_joingroup', $post_joingroup);
+ set_pconfig(local_channel(), 'system', 'post_profilechange', $post_profilechange);
+ set_pconfig(local_channel(), 'system', 'vnotify', $vnotify);
+ set_pconfig(local_channel(), 'system', 'always_show_in_notices', $always_show_in_notices);
+ set_pconfig(local_channel(), 'system', 'update_notices_per_parent', $update_notices_per_parent);
+ set_pconfig(local_channel(), 'system', 'evdays', $evdays);
+ set_pconfig(local_channel(), 'system', 'photo_path', $photo_path);
+ set_pconfig(local_channel(), 'system', 'attach_path', $attach_path);
+ set_pconfig(local_channel(), 'system', 'email_notify_host', $mailhost);
+
+ $r = q("update channel set channel_pageflags = %d, channel_timezone = '%s',
+ channel_location = '%s', channel_notifyflags = %d, channel_expire_days = %d
+ where channel_id = %d",
intval($pageflags),
dbesc($timezone),
dbesc($defloc),
intval($notify),
- intval($unkmail),
- intval($maxreq),
intval($expire),
intval(local_channel())
);
- if($r)
- info( t('Settings updated.') . EOL);
-
- if(! is_null($publish)) {
- $r = q("UPDATE profile SET publish = %d WHERE is_default = 1 AND uid = %d",
- intval($publish),
- intval(local_channel())
- );
- }
-
- if($name_change) {
- // change name on all associated xchans by matching the url
- $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s' where xchan_url = '%s'",
- dbesc($username),
- dbesc(datetime_convert()),
- dbesc(z_root() . '/channel/' . $channel['channel_address'])
- );
- $r = q("update profile set fullname = '%s' where uid = %d and is_default = 1",
- dbesc($username),
- intval($channel['channel_id'])
- );
- }
-
- \Zotlabs\Daemon\Master::Summon(array('Directory',local_channel()));
+ if ($r)
+ info(t('Settings updated.') . EOL);
+ Master::Summon(['Directory', local_channel()]);
Libsync::build_sync_packet();
-
- if($email_changed && \App::$config['system']['register_policy'] == REGISTER_VERIFY) {
+ if ($email_changed && App::$config['system']['register_policy'] == REGISTER_VERIFY) {
// FIXME - set to un-verified, blocked and redirect to logout
// Q: Why? Are we verifying people or email addresses?
// A: the policy is to verify email addresses
}
- goaway(z_root() . '/settings' );
+ goaway(z_root() . '/settings');
return; // NOTREACHED
}
function get() {
- require_once('include/acl_selectors.php');
- require_once('include/permissions.php');
-
-
- $yes_no = array(t('No'),t('Yes'));
-
-
- $p = q("SELECT * FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1",
- intval(local_channel())
- );
- if(count($p))
- $profile = $p[0];
-
- load_pconfig(local_channel(),'expire');
-
- $channel = \App::get_channel();
-
- $global_perms = \Zotlabs\Access\Permissions::Perms();
-
- $permiss = array();
-
- $perm_opts = array(
- array( t('Nobody except yourself'), 0),
- array( t('Only those you specifically allow'), PERMS_SPECIFIC),
- array( t('Approved connections'), PERMS_CONTACTS),
- array( t('Any connections'), PERMS_PENDING),
- array( t('Anybody on this website'), PERMS_SITE),
- array( t('Anybody in this network'), PERMS_NETWORK),
- array( t('Anybody authenticated'), PERMS_AUTHED),
- array( t('Anybody on the internet'), PERMS_PUBLIC)
- );
-
- $limits = \Zotlabs\Access\PermissionLimits::Get(local_channel());
- $anon_comments = get_config('system','anonymous_comments',true);
-
- foreach($global_perms as $k => $perm) {
- $options = array();
- $can_be_public = ((strstr($k,'view') || ($k === 'post_comments' && $anon_comments)) ? true : false);
- foreach($perm_opts as $opt) {
- if($opt[1] == PERMS_PUBLIC && (! $can_be_public))
- continue;
- $options[$opt[1]] = $opt[0];
- }
- $permiss[] = array($k,$perm,$limits[$k],'',$options);
- }
-
- // logger('permiss: ' . print_r($permiss,true));
-
- $username = $channel['channel_name'];
- $nickname = $channel['channel_address'];
- $timezone = $channel['channel_timezone'];
- $notify = $channel['channel_notifyflags'];
- $defloc = $channel['channel_location'];
-
- $maxreq = $channel['channel_max_friend_req'];
- $expire = $channel['channel_expire_days'];
- $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
- $sys_expire = get_config('system','default_expire_days');
-
-// $unkmail = \App::$user['unkmail'];
-// $cntunkmail = \App::$user['cntunkmail'];
-
- $hide_presence = intval(get_pconfig(local_channel(), 'system','hide_online_status'));
-
-
- $expire_items = get_pconfig(local_channel(), 'expire','items');
- $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
-
- $expire_notes = get_pconfig(local_channel(), 'expire','notes');
- $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
-
- $expire_starred = get_pconfig(local_channel(), 'expire','starred');
- $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
-
- $expire_photos = get_pconfig(local_channel(), 'expire','photos');
- $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
-
- $expire_network_only = get_pconfig(local_channel(), 'expire','network_only');
- $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
-
-
- $suggestme = get_pconfig(local_channel(), 'system','suggestme');
- $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
-
- $post_newfriend = get_pconfig(local_channel(), 'system','post_newfriend');
- $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
-
- $post_joingroup = get_pconfig(local_channel(), 'system','post_joingroup');
- $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
-
- $post_profilechange = get_pconfig(local_channel(), 'system','post_profilechange');
- $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
-
- $blocktags = get_pconfig(local_channel(),'system','blocktags');
- $blocktags = (($blocktags===false) ? '0' : $blocktags);
-
- $timezone = date_default_timezone_get();
-
- $opt_tpl = get_markup_template("field_checkbox.tpl");
- if(get_config('system','publish_all')) {
- $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
- }
- else {
- $profile_in_dir = replace_macros($opt_tpl,array(
- '$field' => array('profile_in_directory', t('Publish your default profile in the network directory'), $profile['publish'], '', $yes_no),
- ));
- }
-
- $suggestme = replace_macros($opt_tpl,array(
- '$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', $yes_no),
-
- ));
-
- $subdir = ((strlen(\App::get_path())) ? '<br />' . t('or') . ' ' . z_root() . '/channel/' . $nickname : '');
-
- $webbie = $nickname . '@' . \App::get_hostname();
- $intl_nickname = unpunify($nickname) . '@' . unpunify(\App::get_hostname());
-
-
- $tpl_addr = get_markup_template("settings_nick_set.tpl");
-
- $prof_addr = replace_macros($tpl_addr,array(
- '$desc' => t('Your channel address is'),
+ load_pconfig(local_channel());
+
+ $channel = App::get_channel();
+ $nickname = $channel['channel_address'];
+ $timezone = $channel['channel_timezone'];
+ $notify = $channel['channel_notifyflags'];
+ $defloc = $channel['channel_location'];
+ $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
+ $post_newfriend = get_pconfig(local_channel(), 'system', 'post_newfriend');
+ $post_newfriend = (($post_newfriend === false) ? '0' : $post_newfriend); // default if not set: 0
+ $post_joingroup = get_pconfig(local_channel(), 'system', 'post_joingroup');
+ $post_joingroup = (($post_joingroup === false) ? '0' : $post_joingroup); // default if not set: 0
+ $post_profilechange = get_pconfig(local_channel(), 'system', 'post_profilechange');
+ $post_profilechange = (($post_profilechange === false) ? '0' : $post_profilechange); // default if not set: 0
+ $subdir = ((strlen(App::get_path())) ? '<br />' . t('or') . ' ' . z_root() . '/channel/' . $nickname : '');
+ $webbie = $nickname . '@' . App::get_hostname();
+ $intl_nickname = unpunify($nickname) . '@' . unpunify(App::get_hostname());
+ $disable_discover_tab = intval(get_config('system', 'disable_discover_tab', 1)) == 1;
+ $site_firehose = intval(get_config('system', 'site_firehose', 0)) == 1;
+
+ $expire = $channel['channel_expire_days'];
+ $sys_expire = get_config('system', 'default_expire_days');
+
+ $tpl_addr = get_markup_template("settings_nick_set.tpl");
+ $prof_addr = replace_macros($tpl_addr, [
+ '$desc' => t('Your channel address is'),
'$nickname' => (($intl_nickname === $webbie) ? $webbie : $intl_nickname . '&nbsp;(' . $webbie . ')'),
- '$subdir' => $subdir,
- '$davdesc' => t('Your files/photos are accessible via WebDAV at'),
- '$davpath' => z_root() . '/dav/' . $nickname,
- '$basepath' => \App::get_hostname()
- ));
-
-
-
- $pcat = new \Zotlabs\Lib\Permcat(local_channel());
- $pcatlist = $pcat->listing();
- $permcats = [];
- if($pcatlist) {
- foreach($pcatlist as $pc) {
- $permcats[$pc['name']] = $pc['localname'];
- }
- }
-
- $default_permcat = get_pconfig(local_channel(),'system','default_permcat','default');
-
-
- $stpl = get_markup_template('settings.tpl');
-
- $acl = new \Zotlabs\Access\AccessList($channel);
- $perm_defaults = $acl->get();
-
- require_once('include/group.php');
- $group_select = mini_group_select(local_channel(),$channel['channel_default_group']);
-
- $evdays = get_pconfig(local_channel(),'system','evdays');
- if(! $evdays)
+ '$subdir' => $subdir,
+ '$davdesc' => t('Your files/photos are accessible via WebDAV at'),
+ '$davpath' => z_root() . '/dav/' . $nickname,
+ '$basepath' => App::get_hostname()
+ ]);
+
+ $evdays = get_pconfig(local_channel(), 'system', 'evdays');
+ if (!$evdays)
$evdays = 3;
- $permissions_role = get_pconfig(local_channel(),'system','permissions_role');
- if(! $permissions_role)
- $permissions_role = 'custom';
- // compatibility mapping - can be removed after 3.4 release
- if($permissions_role === 'social_party')
- $permissions_role = 'social_federation';
+ $always_show_in_notices = get_pconfig(local_channel(), 'system', 'always_show_in_notices');
+ $update_notices_per_parent = get_pconfig(local_channel(), 'system', 'update_notices_per_parent', 1);
- if(in_array($permissions_role,['forum','repository']))
- $autoperms = replace_macros(get_markup_template('field_checkbox.tpl'), [
- '$field' => [ 'autoperms',t('Automatic membership approval'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('If enabled, connection requests will be approved without your interaction'), $yes_no ]]);
- else
- $autoperms = '<input type="hidden" name="autoperms" value="' . intval(get_pconfig(local_channel(),'system','autoperms')) . '" />';
+ $vnotify = get_pconfig(local_channel(), 'system', 'vnotify');
+ if ($vnotify === false)
+ $vnotify = (-1);
- $permissions_set = (($permissions_role != 'custom') ? true : false);
+ $perm_roles = PermissionRoles::channel_roles();
+ $permissions_role = get_pconfig(local_channel(), 'system', 'permissions_role');
- $perm_roles = \Zotlabs\Access\PermissionRoles::roles();
+ if (!in_array($permissions_role, ['public', 'personal', 'group', 'custom'])) {
+ notice(t('Please select a channel role') . EOL);
+ array_unshift($perm_roles , '');
+ }
- $always_show_in_notices = get_pconfig(local_channel(),'system','always_show_in_notices');
- $update_notices_per_parent = get_pconfig(local_channel(), 'system', 'update_notices_per_parent', 1);
- $vnotify = get_pconfig(local_channel(),'system','vnotify');
+ $plugin = ['basic' => '', 'notify' => ''];
+ call_hooks('channel_settings', $plugin);
- if($vnotify === false)
- $vnotify = (-1);
+ $yes_no = [t('No'), t('Yes')];
- $plugin = [ 'basic' => '', 'security' => '', 'notify' => '' ];
- call_hooks('channel_settings',$plugin);
-
- $disable_discover_tab = intval(get_config('system','disable_discover_tab',1)) == 1;
- $site_firehose = intval(get_config('system','site_firehose',0)) == 1;
-
-
- $o .= replace_macros($stpl,array(
- '$ptitle' => t('Channel Settings'),
-
- '$submit' => t('Submit'),
- '$baseurl' => z_root(),
- '$uid' => local_channel(),
- '$form_security_token' => get_form_security_token("settings"),
- '$nickname_block' => $prof_addr,
- '$h_basic' => t('Basic Settings'),
- '$username' => array('username', t('Full Name:'), $username,''),
- '$email' => array('email', t('Email Address:'), $email, ''),
- '$timezone' => array('timezone_select' , t('Your Timezone:'), $timezone, '', get_timezones()),
- '$defloc' => array('defloc', t('Default Post Location:'), $defloc, t('Geographical location to display on your posts')),
- '$allowloc' => array('allow_location', t('Use Browser Location:'), ((get_pconfig(local_channel(),'system','use_browser_location')) ? 1 : ''), '', $yes_no),
-
- '$adult' => array('adult', t('Adult Content'), $adult_flag, t('This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)'), $yes_no),
-
- '$h_prv' => t('Security and Privacy Settings'),
- '$permissions_set' => $permissions_set,
- '$perms_set_msg' => t('Your permissions are already configured. Click to view/adjust'),
-
- '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online'), $yes_no),
-
- '$lbl_pmacro' => t('Simple Privacy Settings:'),
- '$pmacro3' => t('Very Public - <em>extremely permissive (should be used with caution)</em>'),
- '$pmacro2' => t('Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>'),
- '$pmacro1' => t('Private - <em>default private, never open or public</em>'),
- '$pmacro0' => t('Blocked - <em>default blocked to/from everybody</em>'),
- '$permiss_arr' => $permiss,
- '$blocktags' => array('blocktags',t('Allow others to tag your posts'), 1-$blocktags, t('Often used by the community to retro-actively flag inappropriate content'), $yes_no),
-
- '$lbl_p2macro' => t('Channel Permission Limits'),
-
- '$expire' => array('expire',t('Expire other channel content after this many days'),$expire, t('0 or blank to use the website limit.') . ' ' . ((intval($sys_expire)) ? sprintf( t('This website expires after %d days.'),intval($sys_expire)) : t('This website does not expire imported content.')) . ' ' . t('The website limit takes precedence if lower than your limit.')),
- '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
- '$permissions' => t('Default Privacy Group'),
- '$permdesc' => t("\x28click to open/close\x29"),
- '$aclselect' => populate_acl($perm_defaults, false, \Zotlabs\Lib\PermissionDescription::fromDescription(t('Use my default audience setting for the type of object published'))),
-
- '$allow_cid' => acl2json($perm_defaults['allow_cid']),
- '$allow_gid' => acl2json($perm_defaults['allow_gid']),
- '$deny_cid' => acl2json($perm_defaults['deny_cid']),
- '$deny_gid' => acl2json($perm_defaults['deny_gid']),
- '$suggestme' => $suggestme,
- '$group_select' => $group_select,
- '$role' => array('permissions_role' , t('Channel role and privacy'), $permissions_role, '', $perm_roles),
- '$defpermcat' => [ 'defpermcat', t('Default permissions category'), $default_permcat, '', $permcats ],
- '$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
- '$profile_in_dir' => $profile_in_dir,
- '$hide_friends' => $hide_friends,
- '$hide_wall' => $hide_wall,
- '$unkmail' => $unkmail,
- '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), intval($channel['channel_max_anon_mail']) ,t("Useful to reduce spamming")),
-
- '$autoperms' => $autoperms,
- '$h_not' => t('Notification Settings'),
- '$activity_options' => t('By default post a status message when:'),
- '$post_newfriend' => array('post_newfriend', t('accepting a friend request'), $post_newfriend, '', $yes_no),
- '$post_joingroup' => array('post_joingroup', t('joining a forum/community'), $post_joingroup, '', $yes_no),
- '$post_profilechange' => array('post_profilechange', t('making an <em>interesting</em> profile change'), $post_profilechange, '', $yes_no),
- '$lbl_not' => t('Send a notification email when:'),
- '$notify1' => array('notify1', t('You receive a connection request'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, '', $yes_no),
- '$notify2' => array('notify2', t('Your connections are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, '', $yes_no),
- '$notify3' => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, '', $yes_no),
- '$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, '', $yes_no),
- '$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, '', $yes_no),
- '$notify6' => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, '', $yes_no),
- '$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, '', $yes_no),
- '$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, '', $yes_no),
-
- '$notify9' => array('notify9', t('Someone likes your post/comment'), ($notify & NOTIFY_LIKE), NOTIFY_LIKE, '', $yes_no),
-
-
- '$lbl_vnot' => t('Show visual notifications including:'),
-
- '$vnotify1' => array('vnotify1', t('Unseen stream activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no),
- '$vnotify2' => array('vnotify2', t('Unseen channel activity'), ($vnotify & VNOTIFY_CHANNEL), VNOTIFY_CHANNEL, '', $yes_no),
- '$vnotify3' => array('vnotify3', t('Unseen private messages'), ($vnotify & VNOTIFY_MAIL), VNOTIFY_MAIL, t('Recommended'), $yes_no),
- '$vnotify4' => array('vnotify4', t('Upcoming events'), ($vnotify & VNOTIFY_EVENT), VNOTIFY_EVENT, '', $yes_no),
- '$vnotify5' => array('vnotify5', t('Events today'), ($vnotify & VNOTIFY_EVENTTODAY), VNOTIFY_EVENTTODAY, '', $yes_no),
- '$vnotify6' => array('vnotify6', t('Upcoming birthdays'), ($vnotify & VNOTIFY_BIRTHDAY), VNOTIFY_BIRTHDAY, t('Not available in all themes'), $yes_no),
- '$vnotify7' => array('vnotify7', t('System (personal) notifications'), ($vnotify & VNOTIFY_SYSTEM), VNOTIFY_SYSTEM, '', $yes_no),
- '$vnotify8' => array('vnotify8', t('System info messages'), ($vnotify & VNOTIFY_INFO), VNOTIFY_INFO, t('Recommended'), $yes_no),
- '$vnotify9' => array('vnotify9', t('System critical alerts'), ($vnotify & VNOTIFY_ALERT), VNOTIFY_ALERT, t('Recommended'), $yes_no),
- '$vnotify10' => array('vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no),
- '$vnotify11' => ((is_site_admin()) ? array('vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no) : array()),
- '$vnotify12' => array('vnotify12', t('Unseen shared files'), ($vnotify & VNOTIFY_FILES), VNOTIFY_FILES, '', $yes_no),
- '$vnotify13' => ((($disable_discover_tab && !$site_firehose) || !Apps::system_app_installed(local_channel(), 'Public Stream')) ? array() : array('vnotify13', t('Unseen public stream activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no)),
- '$vnotify14' => array('vnotify14', t('Unseen likes and dislikes'), ($vnotify & VNOTIFY_LIKE), VNOTIFY_LIKE, '', $yes_no),
- '$vnotify15' => array('vnotify15', t('Unseen forum posts'), ($vnotify & VNOTIFY_FORUMS), VNOTIFY_FORUMS, '', $yes_no),
- '$mailhost' => [ 'mailhost', t('Email notification hub (hostname)'), get_pconfig(local_channel(),'system','email_notify_host',\App::get_hostname()), sprintf( t('If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'),\App::get_hostname()) ],
- '$always_show_in_notices' => array('always_show_in_notices', t('Show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no),
- '$update_notices_per_parent' => array('update_notices_per_parent', t('Mark all notices of the thread read if a notice is clicked'), $update_notices_per_parent, 1, t('If no, only the clicked notice will be marked read'), $yes_no),
- '$desktop_notifications_info' => t('Desktop notifications are unavailable because the required browser permission has not been granted'),
+ $stpl = get_markup_template('settings.tpl');
+ $o = replace_macros($stpl, [
+ '$ptitle' => t('Channel Settings'),
+ '$submit' => t('Submit'),
+ '$baseurl' => z_root(),
+ '$uid' => local_channel(),
+ '$form_security_token' => get_form_security_token("settings"),
+ '$role' => ['permissions_role', t('Channel role'), $permissions_role, '', $perm_roles],
+ '$nickname_block' => $prof_addr,
+ '$h_basic' => t('Basic Settings'),
+ '$timezone' => ['timezone_select', t('Channel timezone:'), $timezone, '', get_timezones()],
+ '$defloc' => ['defloc', t('Default post location:'), $defloc, t('Geographical location to display on your posts')],
+ '$allowloc' => ['allow_location', t('Use browser location'), ((get_pconfig(local_channel(), 'system', 'use_browser_location')) ? 1 : ''), '', $yes_no],
+ '$adult' => ['adult', t('Adult content'), $adult_flag, t('This channel frequently or regularly publishes adult content'), $yes_no],
+ '$maxreq' => ['maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']), t('May reduce spam activity')],
+ '$h_not' => t('Notification Settings'),
+ '$activity_options' => t('By default post a status message when:'),
+ '$post_newfriend' => ['post_newfriend', t('accepting a friend request'), $post_newfriend, '', $yes_no],
+ '$post_joingroup' => ['post_joingroup', t('joining a forum/community'), $post_joingroup, '', $yes_no],
+ '$post_profilechange' => ['post_profilechange', t('making an <em>interesting</em> profile change'), $post_profilechange, '', $yes_no],
+ '$lbl_not' => t('Send a notification email when:'),
+ '$notify1' => ['notify1', t('You receive a connection request'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, '', $yes_no],
+ '$notify2' => ['notify2', t('Your connections are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, '', $yes_no],
+ '$notify3' => ['notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, '', $yes_no],
+ '$notify4' => ['notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, '', $yes_no],
+ '$notify5' => ['notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, '', $yes_no],
+ '$notify6' => ['notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, '', $yes_no],
+ '$notify7' => ['notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, '', $yes_no],
+ '$notify8' => ['notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, '', $yes_no],
+ '$notify9' => ['notify9', t('Someone likes your post/comment'), ($notify & NOTIFY_LIKE), NOTIFY_LIKE, '', $yes_no],
+ '$lbl_vnot' => t('Show visual notifications including:'),
+ '$vnotify1' => ['vnotify1', t('Unseen stream activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no],
+ '$vnotify2' => ['vnotify2', t('Unseen channel activity'), ($vnotify & VNOTIFY_CHANNEL), VNOTIFY_CHANNEL, '', $yes_no],
+ '$vnotify3' => ['vnotify3', t('Unseen private messages'), ($vnotify & VNOTIFY_MAIL), VNOTIFY_MAIL, t('Recommended'), $yes_no],
+ '$vnotify4' => ['vnotify4', t('Upcoming events'), ($vnotify & VNOTIFY_EVENT), VNOTIFY_EVENT, '', $yes_no],
+ '$vnotify5' => ['vnotify5', t('Events today'), ($vnotify & VNOTIFY_EVENTTODAY), VNOTIFY_EVENTTODAY, '', $yes_no],
+ '$vnotify6' => ['vnotify6', t('Upcoming birthdays'), ($vnotify & VNOTIFY_BIRTHDAY), VNOTIFY_BIRTHDAY, t('Not available in all themes'), $yes_no],
+ '$vnotify7' => ['vnotify7', t('System (personal) notifications'), ($vnotify & VNOTIFY_SYSTEM), VNOTIFY_SYSTEM, '', $yes_no],
+ '$vnotify8' => ['vnotify8', t('System info messages'), ($vnotify & VNOTIFY_INFO), VNOTIFY_INFO, t('Recommended'), $yes_no],
+ '$vnotify9' => ['vnotify9', t('System critical alerts'), ($vnotify & VNOTIFY_ALERT), VNOTIFY_ALERT, t('Recommended'), $yes_no],
+ '$vnotify10' => ['vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no],
+ '$vnotify11' => ((is_site_admin()) ? ['vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no] : []),
+ '$vnotify12' => ['vnotify12', t('Unseen shared files'), ($vnotify & VNOTIFY_FILES), VNOTIFY_FILES, '', $yes_no],
+ '$vnotify13' => ((($disable_discover_tab && !$site_firehose) || !Apps::system_app_installed(local_channel(), 'Public Stream')) ? [] : ['vnotify13', t('Unseen public stream activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no]),
+ '$vnotify14' => ['vnotify14', t('Unseen likes and dislikes'), ($vnotify & VNOTIFY_LIKE), VNOTIFY_LIKE, '', $yes_no],
+ '$vnotify15' => ['vnotify15', t('Unseen forum posts'), ($vnotify & VNOTIFY_FORUMS), VNOTIFY_FORUMS, '', $yes_no],
+ '$mailhost' => ['mailhost', t('Email notification hub (hostname)'), get_pconfig(local_channel(), 'system', 'email_notify_host', App::get_hostname()), sprintf(t('If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'), App::get_hostname())],
+ '$always_show_in_notices' => ['always_show_in_notices', t('Show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no],
+ '$update_notices_per_parent' => ['update_notices_per_parent', t('Mark all notices of the thread read if a notice is clicked'), $update_notices_per_parent, 1, t('If no, only the clicked notice will be marked read'), $yes_no],
+ '$desktop_notifications_info' => t('Desktop notifications are unavailable because the required browser permission has not been granted'),
'$desktop_notifications_request' => t('Grant permission'),
- '$evdays' => array('evdays', t('Notify me of events this many days in advance'), $evdays, t('Must be greater than 0')),
- '$basic_addon' => $plugin['basic'],
- '$sec_addon' => $plugin['security'],
- '$notify_addon' => $plugin['notify'],
-
- '$h_advn' => t('Advanced Account/Page Type Settings'),
- '$h_descadvn' => t('Change the behaviour of this account for special situations'),
- '$pagetype' => $pagetype,
- '$lbl_misc' => t('Miscellaneous Settings'),
- '$photo_path' => array('photo_path', t('Default photo upload folder'), get_pconfig(local_channel(),'system','photo_path'), t('%Y - current year, %m - current month')),
- '$attach_path' => array('attach_path', t('Default file upload folder'), get_pconfig(local_channel(),'system','attach_path'), t('%Y - current year, %m - current month')),
- '$removeme' => t('Remove Channel'),
- '$removechannel' => t('Remove this channel.'),
- ));
-
- call_hooks('settings_form',$o);
-
- //$o .= '</form>' . "\r\n";
+ '$evdays' => ['evdays', t('Notify me of events this many days in advance'), $evdays, t('Must be greater than 0')],
+ '$basic_addon' => $plugin['basic'],
+ '$notify_addon' => $plugin['notify'],
+ '$photo_path' => ['photo_path', t('Default photo upload folder'), get_pconfig(local_channel(), 'system', 'photo_path'), t('%Y - current year, %m - current month')],
+ '$attach_path' => ['attach_path', t('Default file upload folder'), get_pconfig(local_channel(), 'system', 'attach_path'), t('%Y - current year, %m - current month')],
+ '$removeme' => t('Remove Channel'),
+ '$removechannel' => t('Remove this channel.'),
+ '$expire' => ['expire', t('Expire other channel content after this many days'), $expire, t('0 or blank to use the website limit.') . ' ' . ((intval($sys_expire)) ? sprintf(t('This website expires after %d days.'), intval($sys_expire)) : t('This website does not expire imported content.')) . ' ' . t('The website limit takes precedence if lower than your limit.')],
+ ]);
+
+ call_hooks('settings_form', $o);
return $o;
}
diff --git a/Zotlabs/Module/Settings/Privacy.php b/Zotlabs/Module/Settings/Privacy.php
new file mode 100644
index 000000000..fbda78a6f
--- /dev/null
+++ b/Zotlabs/Module/Settings/Privacy.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Zotlabs\Module\Settings;
+
+use App;
+use Zotlabs\Access\PermissionLimits;
+use Zotlabs\Access\Permissions;
+use Zotlabs\Daemon\Master;
+use Zotlabs\Lib\Group;
+use Zotlabs\Lib\Libsync;
+
+class Privacy {
+
+ function post() {
+
+ check_form_security_token_redirectOnErr('/settings/privacy', 'settings');
+ call_hooks('settings_post', $_POST);
+
+ $index_opt_out = (((x($_POST, 'index_opt_out')) && (intval($_POST['index_opt_out']) == 1)) ? 1 : 0);
+ set_pconfig(local_channel(), 'system', 'index_opt_out', $index_opt_out);
+
+ $autoperms = (((x($_POST, 'autoperms')) && (intval($_POST['autoperms']) == 1)) ? 1 : 0);
+ set_pconfig(local_channel(), 'system', 'autoperms', $autoperms);
+
+ $role = get_pconfig(local_channel(), 'system', 'permissions_role');
+ if ($role === 'custom') {
+
+ $global_perms = Permissions::Perms();
+
+ foreach ($global_perms as $k => $v) {
+ PermissionLimits::Set(local_channel(), $k, intval($_POST[$k]));
+ }
+
+ $group_actor = (((x($_POST, 'group_actor')) && (intval($_POST['group_actor']) == 1)) ? 1 : 0);
+ set_pconfig(local_channel(), 'system', 'group_actor', $group_actor);
+
+ }
+
+ info(t('Privacy settings updated.') . EOL);
+ Master::Summon(['Directory', local_channel()]);
+ Libsync::build_sync_packet();
+
+ goaway(z_root() . '/settings/privacy');
+ return; // NOTREACHED
+ }
+
+ function get() {
+
+ load_pconfig(local_channel());
+
+ $channel = App::get_channel();
+ $global_perms = Permissions::Perms();
+ $permiss = [];
+
+ $perm_opts = [
+ [t('Only me'), 0],
+ [t('Only those you specifically allow'), PERMS_SPECIFIC],
+ [t('Approved connections'), PERMS_CONTACTS],
+ [t('Any connections'), PERMS_PENDING],
+ [t('Anybody on this website'), PERMS_SITE],
+ [t('Anybody in this network'), PERMS_NETWORK],
+ [t('Anybody authenticated'), PERMS_AUTHED],
+ [t('Anybody on the internet'), PERMS_PUBLIC]
+ ];
+
+ $help = [
+ 'view_stream',
+ 'view_wiki',
+ 'view_pages',
+ 'view_storage'
+ ];
+
+ $help_txt = t('Advise: set to "Anybody on the internet" and use privacy groups to restrict access');
+ $limits = PermissionLimits::Get(local_channel());
+ $anon_comments = get_config('system', 'anonymous_comments', true);
+
+ foreach ($global_perms as $k => $perm) {
+ $options = [];
+ $can_be_public = (strstr($k, 'view') || ($k === 'post_comments' && $anon_comments));
+
+ foreach ($perm_opts as $opt) {
+ if ($opt[1] == PERMS_PUBLIC && (!$can_be_public))
+ continue;
+
+ $options[$opt[1]] = $opt[0];
+ }
+
+ $permiss[] = [
+ $k,
+ $perm,
+ $limits[$k],
+ ((in_array($k, $help)) ? $help_txt : ''),
+ $options
+ ];
+ }
+
+ //logger('permiss: ' . print_r($permiss,true));
+
+ $autoperms = get_pconfig(local_channel(), 'system', 'autoperms');
+ $index_opt_out = get_pconfig(local_channel(), 'system', 'index_opt_out');
+ $group_actor = get_pconfig(local_channel(), 'system', 'group_actor');
+
+ $permissions_role = get_pconfig(local_channel(), 'system', 'permissions_role', 'custom');
+ $permission_limits = ($permissions_role === 'custom');
+
+ $stpl = get_markup_template('settings_privacy.tpl');
+
+ $o = replace_macros($stpl, [
+ '$ptitle' => t('Privacy Settings'),
+ '$submit' => t('Submit'),
+ '$form_security_token' => get_form_security_token("settings"),
+ '$permission_limits' => $permission_limits,
+ '$permiss_arr' => $permiss,
+ '$permission_limits_label' => t('Advanced configuration'),
+ '$permission_limits_warning' => [
+ t('Proceed with caution'),
+ t('Changing advanced configuration settings can impact your, and your contacts channels functionality and security.'),
+ t('Accept the risk and continue')
+ ],
+ '$autoperms' => ['autoperms', t('Automatically approve new contacts'), $autoperms, '', [t('No'), t('Yes')]],
+ '$index_opt_out' => ['index_opt_out', t('Opt-out of search engine indexing'), $index_opt_out, '', [t('No'), t('Yes')]],
+ '$group_actor' => ['group_actor', t('Group actor'), $group_actor, t('Allow this channel to act as a forum'), [t('No'), t('Yes')]],
+ ]);
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Module/Settings/Profiles.php b/Zotlabs/Module/Settings/Profiles.php
index 67b03e04f..a1a1b8d96 100644
--- a/Zotlabs/Module/Settings/Profiles.php
+++ b/Zotlabs/Module/Settings/Profiles.php
@@ -13,14 +13,14 @@ class Profiles {
$module = substr(strrchr(strtolower(static::class), '\\'), 1);
check_form_security_token_redirectOnErr('/settings/' . $module, 'settings_' . $module);
-
+
$features = get_module_features($module);
process_module_features_post(local_channel(), $features, $_POST);
$profile_assign = ((x($_POST,'profile_assign')) ? notags(trim($_POST['profile_assign'])) : '');
set_pconfig(local_channel(),'system','profile_assign',$profile_assign);
-
+
Libsync::build_sync_packet();
if($_POST['rpath'])
@@ -38,7 +38,7 @@ class Profiles {
$extra_settings_html = '';
if(feature_enabled(local_channel(),'multi_profiles'))
- $extra_settings_html = contact_profile_assign(get_pconfig(local_channel(),'system','profile_assign',''));
+ $extra_settings_html = contact_profile_assign(get_pconfig(local_channel(),'system','profile_assign',''), t('Default profile for new contacts'));
$tpl = get_markup_template("settings_module.tpl");
@@ -51,7 +51,7 @@ class Profiles {
'$extra_settings_html' => $extra_settings_html,
'$submit' => t('Submit')
));
-
+
return $o;
}
diff --git a/Zotlabs/Module/Sse_bs.php b/Zotlabs/Module/Sse_bs.php
index eaaeae7b7..3a13b0a6f 100644
--- a/Zotlabs/Module/Sse_bs.php
+++ b/Zotlabs/Module/Sse_bs.php
@@ -124,7 +124,7 @@ class Sse_bs extends Controller {
$str = '';
foreach($arr as $a) {
- $mids[] = '\'' . dbesc(@base64url_decode(substr($a,4))) . '\'';
+ $mids[] = '\'' . dbesc(unpack_link_id($a)) . '\'';
}
$str = implode(',', $mids);
diff --git a/Zotlabs/Module/Tokens.php b/Zotlabs/Module/Tokens.php
index 31b219019..9de54f568 100644
--- a/Zotlabs/Module/Tokens.php
+++ b/Zotlabs/Module/Tokens.php
@@ -5,6 +5,11 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
+use Zotlabs\Lib\AccessList;
+use Zotlabs\Lib\Permcat;
+use Zotlabs\Lib\Libsync;
+
+require_once('include/security.php');
class Tokens extends Controller {
@@ -13,15 +18,65 @@ class Tokens extends Controller {
if(! local_channel())
return;
- if(! Apps::system_app_installed(local_channel(), 'Guest Access'))
- return;
-
$channel = App::get_channel();
+ if(! Apps::system_app_installed($channel['channel_id'], 'Guest Access'))
+ return;
+
check_form_security_token_redirectOnErr('tokens', 'tokens');
+
+ if(isset($_POST['delete'])) {
+ $r = q("select * from atoken where atoken_id = %d and atoken_uid = %d",
+ intval($_POST['atoken_id']),
+ intval(local_channel())
+ );
+
+ if (!$r) {
+ return;
+ }
+
+ $atoken = $r[0];
+ $atoken_xchan = substr($channel['channel_hash'], 0, 16) . '.' . $atoken['atoken_guid'];
+
+ $atoken['deleted'] = true;
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_xchan = '%s' LIMIT 1",
+ intval($channel['channel_id']),
+ dbesc($atoken_xchan)
+ );
+
+ if (!$r) {
+ return;
+ }
+
+ $clone = $r[0];
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+ $clone['deleted'] = true;
+
+ $abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
+ if ($abconfig) {
+ $clone['abconfig'] = $abconfig;
+ }
+
+ atoken_delete($atoken['atoken_id']);
+ Libsync::build_sync_packet($channel['channel_id'], [ 'abook' => [ $clone ], 'atoken' => [ $atoken ] ], true);
+
+ return;
+ }
+
$token_errs = 0;
if(array_key_exists('token',$_POST)) {
$atoken_id = (($_POST['atoken_id']) ? intval($_POST['atoken_id']) : 0);
+
+ if (! $atoken_id) {
+ $atoken_guid = new_uuid();
+ }
+
$name = trim(escape_tags($_POST['name']));
$token = trim($_POST['token']);
if((! $name) || (! $token))
@@ -30,10 +85,10 @@ class Tokens extends Controller {
$expires = datetime_convert(date_default_timezone_get(),'UTC',$_POST['expires']);
else
$expires = NULL_DATE;
- $max_atokens = service_class_fetch(local_channel(),'access_tokens');
+ $max_atokens = service_class_fetch($channel['channel_id'],'access_tokens');
if($max_atokens) {
$r = q("select count(atoken_id) as total where atoken_uid = %d",
- intval(local_channel())
+ intval($channel['channel_id'])
);
if($r && intval($r[0]['total']) >= $max_tokens) {
notice( sprintf( t('This channel is limited to %d tokens'), $max_tokens) . EOL);
@@ -45,6 +100,17 @@ class Tokens extends Controller {
notice( t('Name and Password are required.') . EOL);
return;
}
+
+ $old_atok = q("select * from atoken where atoken_uid = %d and atoken_name = '%s'",
+ intval($channel['channel_id']),
+ dbesc($name)
+ );
+
+ if ($old_atok) {
+ $old_atok = $old_atok[0];
+ $old_xchan = atoken_xchan($old_atok);
+ }
+
if($atoken_id) {
$r = q("update atoken set atoken_name = '%s', atoken_token = '%s', atoken_expires = '%s'
where atoken_id = %d and atoken_uid = %d",
@@ -56,8 +122,9 @@ class Tokens extends Controller {
);
}
else {
- $r = q("insert into atoken ( atoken_aid, atoken_uid, atoken_name, atoken_token, atoken_expires )
- values ( %d, %d, '%s', '%s', '%s' ) ",
+ $r = q("insert into atoken (atoken_guid, atoken_aid, atoken_uid, atoken_name, atoken_token, atoken_expires )
+ values ('%s', %d, %d, '%s', '%s', '%s' ) ",
+ dbesc($atoken_guid),
intval($channel['channel_account_id']),
intval($channel['channel_id']),
dbesc($name),
@@ -66,21 +133,84 @@ class Tokens extends Controller {
);
}
- $atoken_xchan = substr($channel['channel_hash'],0,16) . '.' . $name;
+ $atok = q("select * from atoken where atoken_uid = %d and atoken_name = '%s'",
+ intval($channel['channel_id']),
+ dbesc($name)
+ );
- $all_perms = \Zotlabs\Access\Permissions::Perms();
+ if ($atok) {
+ $xchan = atoken_xchan($atok[0]);
+ atoken_create_xchan($xchan);
+ $atoken_xchan = $xchan['xchan_hash'];
+ if ($old_atok && $old_xchan) {
+ $r = q("update xchan set xchan_name = '%s' where xchan_hash = '%s'",
+ dbesc($xchan['xchan_name']),
+ dbesc($old_xchan['xchan_hash'])
+ );
+ }
+ }
- if($all_perms) {
- foreach($all_perms as $perm => $desc) {
- if(array_key_exists('perms_' . $perm, $_POST)) {
- set_abconfig($channel['channel_id'],$atoken_xchan,'my_perms',$perm,intval($_POST['perms_' . $perm]));
- }
- else {
- set_abconfig($channel['channel_id'],$atoken_xchan,'my_perms',$perm,0);
+
+ if (! $atoken_id) {
+
+ // If this is a new token, create a new abook record
+
+ $closeness = get_pconfig($channel['channel_id'], 'system', 'new_abook_closeness',80);
+ $profile_assign = get_pconfig($channel['channel_id'], 'system', 'profile_assign', '');
+
+ $r = abook_store_lowlevel(
+ [
+ 'abook_account' => $channel['channel_account_id'],
+ 'abook_channel' => $channel['channel_id'],
+ 'abook_closeness' => intval($closeness),
+ 'abook_xchan' => $atoken_xchan,
+ 'abook_profile' => $profile_assign,
+ 'abook_feed' => 0,
+ 'abook_created' => datetime_convert(),
+ 'abook_updated' => datetime_convert(),
+ 'abook_instance' => z_root(),
+ ]
+ );
+
+ if (! $r) {
+ logger('abook creation failed');
+ }
+
+ /** If there is a default group for this channel, add this connection to it */
+ if ($channel['channel_default_group']) {
+ $g = AccessList::by_hash($channel['channel_id'], $channel['channel_default_group']);
+ if ($g) {
+ AccessList::member_add($channel['channel_id'], '', $atoken_xchan,$g['id']);
}
}
}
+ $role = ((array_key_exists('permcat', $_POST)) ? escape_tags($_POST['permcat']) : '');
+ \Zotlabs\Lib\Permcat::assign($channel, $role, [$atoken_xchan]);
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_xchan = '%s' LIMIT 1",
+ intval($channel['chnnel_id']),
+ dbesc($atoken_xchan)
+ );
+
+ if (! $r) {
+ return;
+ }
+
+ $clone = $r[0];
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
+ if ($abconfig) {
+ $clone['abconfig'] = $abconfig;
+ }
+
+ Libsync::build_sync_packet($channel['channel_id'], [ 'abook' => [ $clone ], 'atoken' => $atok ], true);
info( t('Token saved.') . EOL);
return;
@@ -99,10 +229,13 @@ class Tokens extends Controller {
return Apps::app_render($papp, 'module');
}
+ nav_set_selected('Guest Access');
+
$channel = App::get_channel();
$atoken = null;
$atoken_xchan = '';
+ $atoken_abook = [];
if(argc() > 1) {
$id = argv(1);
@@ -114,76 +247,52 @@ class Tokens extends Controller {
if($atoken) {
$atoken = $atoken[0];
- $atoken_xchan = substr($channel['channel_hash'],0,16) . '.' . $atoken['atoken_name'];
- }
+ $atoken_xchan = substr($channel['channel_hash'],0,16) . '.' . $atoken['atoken_guid'];
+
+ $atoken_abook = q("select * from abook where abook_channel = %d and abook_xchan = '%s'",
+ intval(local_channel()),
+ dbesc($atoken_xchan)
+ );
- if($atoken && argc() > 2 && argv(2) === 'drop') {
- atoken_delete($id);
- $atoken = null;
- $atoken_xchan = '';
+ $atoken_abook = $atoken_abook[0];
}
}
- $t = q("select * from atoken where atoken_uid = %d",
- intval(local_channel())
- );
-
$desc = t('Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content.');
- $desc2 = t('You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:');
-
- $global_perms = \Zotlabs\Access\Permissions::Perms();
- $their_perms = [];
-
- $existing = get_all_perms(local_channel(),(($atoken_xchan) ? $atoken_xchan : ''),false);
+ $pcat = new Permcat(local_channel());
+ $pcatlist = $pcat->listing();
+ $default_role = get_pconfig(local_channel(), 'system', 'default_permcat');
+ $current_permcat = (($atoken_abook) ? $atoken_abook['abook_role'] : $default_role);
- if($atoken_xchan) {
- $theirs = q("select * from abconfig where chan = %d and xchan = '%s' and cat = 'their_perms'",
- intval(local_channel()),
- dbesc($atoken_xchan)
- );
- if($theirs) {
- foreach($theirs as $t) {
- $their_perms[$t['k']] = $t['v'];
- }
- }
+ $roles_dict = [];
+ foreach ($pcatlist as $role) {
+ $roles_dict[$role['name']] = $role['localname'];
}
- foreach($global_perms as $k => $v) {
- $thisperm = get_abconfig(local_channel(),$contact['abook_xchan'],'my_perms',$k);
-//fixme
-
- $checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$k);
- if($existing[$k])
- $thisperm = "1";
-
- $perms[] = array('perms_' . $k, $v, ((array_key_exists($k,$their_perms)) ? intval($their_perms[$k]) : ''),$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
+ if (!$current_permcat) {
+ notice(t('Please select a role for this guest!') . EOL);
+ $permcats[] = '';
}
-
+ if ($pcatlist) {
+ foreach ($pcatlist as $pc) {
+ $permcats[$pc['name']] = $pc['localname'];
+ }
+ }
$tpl = get_markup_template("tokens.tpl");
$o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("tokens"),
- '$title' => t('Guest Access Tokens'),
- '$desc' => $desc,
- '$desc2' => $desc2,
- '$tokens' => $t,
+ '$form_security_token' => get_form_security_token('tokens'),
+ '$permcat' => ['permcat', t('Select a role for this guest'), $current_permcat, '', $permcats],
+ '$title' => t('Guest Access'),
+ '$desc' => $desc,
'$atoken' => $atoken,
- '$url1' => z_root() . '/channel/' . $channel['channel_address'],
- '$url2' => z_root() . '/photos/' . $channel['channel_address'],
'$name' => array('name', t('Login Name') . ' <span class="required">*</span>', (($atoken) ? $atoken['atoken_name'] : ''),''),
- '$token'=> array('token', t('Login Password') . ' <span class="required">*</span>',(($atoken) ? $atoken['atoken_token'] : autoname(8)), ''),
+ '$token'=> array('token', t('Login Password') . ' <span class="required">*</span>',(($atoken) ? $atoken['atoken_token'] : new_token()), ''),
'$expires'=> array('expires', t('Expires (yyyy-mm-dd)'), (($atoken['atoken_expires'] && $atoken['atoken_expires'] > NULL_DATE) ? datetime_convert('UTC',date_default_timezone_get(),$atoken['atoken_expires']) : ''), ''),
- '$them' => t('Their Settings'),
- '$me' => t('My Settings'),
- '$perms' => $perms,
- '$inherited' => t('inherited'),
- '$notself' => 1,
- '$self' => 0,
- '$permlbl' => t('Individual Permissions'),
- '$permnote' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here.'),
- '$submit' => t('Submit')
+ '$submit' => t('Submit'),
+ '$delete' => t('Delete')
));
return $o;
}
diff --git a/Zotlabs/Module/Uexport.php b/Zotlabs/Module/Uexport.php
index d73bc40d4..870c42802 100644
--- a/Zotlabs/Module/Uexport.php
+++ b/Zotlabs/Module/Uexport.php
@@ -2,24 +2,27 @@
namespace Zotlabs\Module;
use App;
+use ZipArchive;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
class Uexport extends Controller {
function init() {
- if(! local_channel())
- killme();
+ if(! local_channel()) {
+ return;
+ }
- if(! Apps::system_app_installed(local_channel(), 'Channel Export'))
+ if(! Apps::system_app_installed(local_channel(), 'Channel Export')) {
return;
+ }
if(argc() > 1) {
- $sections = (($_REQUEST['sections']) ? explode(',',$_REQUEST['sections']) : '');
$zap_compat = (($_REQUEST['zap_compat']) ? intval($_REQUEST['zap_compat']) : false);
-
$channel = App::get_channel();
+ $year = null;
+ $month = null;
if(argc() > 1 && intval(argv(1)) > 1900) {
$year = intval(argv(1));
@@ -29,25 +32,110 @@ class Uexport extends Controller {
$month = intval(argv(2));
}
- header('content-type: application/json');
- header('content-disposition: attachment; filename="' . $channel['channel_address'] . (($year) ? '-' . $year : '') . (($month) ? '-' . $month : '') . (($_REQUEST['sections']) ? '-' . $_REQUEST['sections'] : '') . '.json"' );
+ $sections = [];
+ $section = '';
+ if(argc() > 1 && ctype_lower(argv(1))) {
+ $section = argv(1);
+ }
- if($year) {
- echo json_encode(identity_export_year(local_channel(),$year,$month, $zap_compat));
- killme();
+ switch ($section) {
+ case 'channel':
+ $sections = get_default_export_sections();
+ break;
+ case 'chatrooms':
+ $sections = ['chatrooms'];
+ break;
+ case 'events':
+ $sections = ['events'];
+ break;
+ case 'webpages':
+ $sections = ['webpages'];
+ break;
+ case 'wikis':
+ $sections = ['wikis'];
+ break;
+ case 'custom':
+ default:
+ $custom_sections = ['channel', 'connections', 'config', 'apps', 'chatrooms', 'events', 'webpages', 'wikis'];
+ $raw_sections = (($_REQUEST['sections']) ? explode(',', $_REQUEST['sections']) : '');
+ if ($raw_sections) {
+ foreach ($raw_sections as $raw_section) {
+ if(in_array($raw_section, $custom_sections)) {
+ $sections[] = $raw_section;
+ }
+ }
+ }
}
- if(argc() > 1 && argv(1) === 'basic') {
- echo json_encode(identity_basic_export(local_channel(),$sections, $zap_compat));
+ if ($sections) {
+
+ $export = json_encode(identity_basic_export(local_channel(), $sections, $zap_compat));
+
+ header('Content-Type: application/json');
+ header('Content-Disposition: attachment; filename="' . $channel['channel_address'] . '-' . implode('-', $sections) . '.json"');
+ header('Content-Length: ' . strlen($export));
+
+ echo $export;
+
killme();
}
+ elseif ($year && !$month) {
+ $zip_dir = 'store/[data]/' . $channel['channel_address'] . '/tmp';
+ if (!is_dir($zip_dir))
+ mkdir($zip_dir, STORAGE_DEFAULT_PERMISSIONS, true);
+
+ $zip_file = $channel['channel_address'] . '-' . $year . '.zip';
+ $zip_path = $zip_dir . '/' . $zip_file;
+ $zip_content_available = false;
+ $zip = new ZipArchive();
+
+ if ($zip->open($zip_path, ZipArchive::CREATE) === true) {
+ $month = 1;
+ while ($month <= 12) {
+ $name = $channel['channel_address'] . '-' . $year . '-' . $month . '.json';
+ $content = conv_item_export_year(local_channel(), $year, $month, $zap_compat);
+ if(isset($content['item'])) {
+ $zip_content_available = true;
+ $zip->addFromString($name, json_encode($content));
+ }
+ $month++;
+ }
+ $zip->setCompressionName($zip_path, ZipArchive::CM_STORE);
+ $zip->close();
+ }
+ if (!$zip_content_available) {
+ unlink($zip_path);
+ notice(t('No content available for year') . ' ' . $year . EOL);
+ goaway('/uexport');
+ }
+
+ header('Content-Type: application/zip');
+ header('Content-Disposition: attachment; filename="' . $zip_file . '"');
+ header('Content-Length: ' . filesize($zip_path));
+
+ $istream = fopen($zip_path, 'rb');
+ $ostream = fopen('php://output', 'wb');
+ if ($istream && $ostream) {
+ pipe_streams($istream, $ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+
+ unlink($zip_path);
+ killme();
+ }
+ elseif ($year && $month) {
+ $export = json_encode(conv_item_export_year(local_channel(), $year, $month, $zap_compat));
+
+ header('Content-Type: application/json');
+ header('Content-Disposition: attachment; filename="' . $channel['channel_address'] . '-' . $year . '-' . $month . '.json"');
+ header('Content-Length: ' . strlen($export));
- // Warning: this option may consume a lot of memory
+ echo $export;
- if(argc() > 1 && argv(1) === 'complete') {
- $sections = get_default_export_sections();
- $sections[] = 'items';
- echo json_encode(identity_basic_export(local_channel(),$sections, $zap_compat));
+ killme();
+ }
+ else {
killme();
}
}
@@ -55,6 +143,10 @@ class Uexport extends Controller {
function get() {
+ if(! local_channel()) {
+ return;
+ }
+
if(! Apps::system_app_installed(local_channel(), 'Channel Export')) {
//Do not display any associated widgets at this point
App::$pdl = '';
@@ -62,27 +154,47 @@ class Uexport extends Controller {
return Apps::app_render($papp, 'module');
}
- $y = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
+ $account = App::get_account();
+ $year_start = datetime_convert('UTC', date_default_timezone_get(), $account['account_created'], 'Y');
+ $year_end = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y');
+ $years = [];
+
+ while ($year_start <= $year_end) {
+ $years[] = $year_start;
+ $year_start++;
+ }
+
+ $item_import_url = '/import_items';
+ $channel_import_url = '/import';
- $yearurl = z_root() . '/uexport/' . $y;
- $janurl = z_root() . '/uexport/' . $y . '/1';
- $impurl = '/import_items';
$o = replace_macros(get_markup_template('uexport.tpl'), array(
'$title' => t('Export Channel'),
- '$basictitle' => t('Export Channel'),
- '$basic' => t('Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content.'),
- '$fulltitle' => t('Export Content'),
- '$full' => t('Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin.'),
- '$by_year' => t('Export your posts from a given year.'),
+ '$channel_title' => t('Export channel'),
+ '$channel_info' => t('This will export your identity and social graph into a file which can be used to import your channel to a new hub.'),
- '$extra' => t('You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range.'),
- '$extra2' => sprintf( t('To select all posts for a given year, such as this year, visit <a href="%1$s">%2$s</a>'),$yearurl,$yearurl),
- '$extra3' => sprintf( t('To select all posts for a given month, such as January of this year, visit <a href="%1$s">%2$s</a>'),$janurl,$janurl),
- '$extra4' => sprintf( t('These content files may be imported or restored by visiting <a href="%1$s">%2$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first).'),$impurl,$impurl)
+ '$years' => $years,
+ '$content_title' => t('Export content'),
+ '$content_info' => t('This will export your posts, direct messages, articles and cards per month stored into a zip file per year. Months with no posts will be dismissed.'),
+ '$wikis_title' => t('Export wikis'),
+ '$wikis_info' => t('This will export your wikis and wiki pages.'),
+
+ '$webpages_title' => t('Export webpages'),
+ '$webpages_info' => t('This will export your webpages and menus.'),
+
+ '$events_title' => t('Export channel calendar'),
+ '$events_info' => t('This will export your channel calendar events and associated items. CalDAV calendars are not included.'),
+
+ '$chatrooms_title' => t('Export chatrooms'),
+ '$chatrooms_info' => t('This will export your chatrooms. Chat history is dismissed.'),
+
+ '$items_extra_info' => sprintf( t('This export can be imported or restored by visiting <a href="%1$s">%2$s</a> on any site containing your channel.'), $item_import_url, $item_import_url),
));
- return $o;
+ return $o;
}
+
+
+
}
diff --git a/Zotlabs/Module/Viewconnections.php b/Zotlabs/Module/Viewconnections.php
index a0c293ddf..d54f61c36 100644
--- a/Zotlabs/Module/Viewconnections.php
+++ b/Zotlabs/Module/Viewconnections.php
@@ -6,7 +6,7 @@ require_once('include/selectors.php');
class Viewconnections extends \Zotlabs\Web\Controller {
function init() {
-
+
if(observer_prohibited()) {
return;
}
@@ -16,58 +16,58 @@ class Viewconnections extends \Zotlabs\Web\Controller {
}
}
-
+
function get() {
-
+
if(observer_prohibited()) {
notice( t('Public access denied.') . EOL);
return;
}
-
+
if(((! count(\App::$profile)) || (\App::$profile['hide_friends']))) {
notice( t('Permission denied.') . EOL);
return;
- }
-
+ }
+
if(! perm_is_allowed(\App::$profile['uid'], get_observer_hash(),'view_contacts')) {
notice( t('Permission denied.') . EOL);
return;
- }
-
+ }
+
if(! $_REQUEST['aj'])
$_SESSION['return_url'] = \App::$query_string;
-
-
+
+
$is_owner = ((local_channel() && local_channel() == \App::$profile['uid']) ? true : false);
-
- $abook_flags = " and abook_pending = 0 and abook_self = 0 ";
+
+ $abook_flags = " and abook_pending = 0 and abook_self = 0 and abook_blocked = 0 and abook_ignored = 0 ";
$sql_extra = '';
-
+
if(! $is_owner) {
$abook_flags .= " and abook_hidden = 0 ";
$sql_extra = " and xchan_hidden = 0 ";
}
-
+
$r = q("SELECT count(*) as total FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ",
intval(\App::$profile['uid'])
);
if($r) {
\App::set_pager_total($r[0]['total']);
}
-
+
$r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra order by xchan_name LIMIT %d OFFSET %d ",
intval(\App::$profile['uid']),
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
);
-
+
if((! $r) && (! $_REQUEST['aj'])) {
info( t('No connections.') . EOL );
return $o;
}
-
+
$contacts = array();
-
+
foreach($r as $rr) {
$oneway = false;
@@ -103,7 +103,7 @@ class Viewconnections extends \Zotlabs\Web\Controller {
'id' => $rr['abook_id'],
'archived' => (intval($rr['abook_archived']) ? true : false),
'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
- 'thumb' => $rr['xchan_photo_m'],
+ 'thumb' => $rr['xchan_photo_m'],
'name' => substr($rr['xchan_name'],0,20),
'username' => $rr['xchan_addr'],
'link' => $url,
@@ -137,11 +137,11 @@ class Viewconnections extends \Zotlabs\Web\Controller {
// '$paginate' => paginate($a),
));
}
-
+
if(! $contacts)
$o .= '<div id="content-complete"></div>';
-
+
return $o;
}
-
+
}
diff --git a/Zotlabs/Module/Vote.php b/Zotlabs/Module/Vote.php
index d67a6f176..4f909d33d 100644
--- a/Zotlabs/Module/Vote.php
+++ b/Zotlabs/Module/Vote.php
@@ -24,7 +24,7 @@ class Vote extends Controller {
$fetch = null;
$id = argv(1);
$response = $_REQUEST['answer'];
-
+
if ($id) {
$fetch = q("select * from item where id = %d limit 1",
intval($id)
@@ -42,7 +42,7 @@ class Vote extends Controller {
}
$valid = false;
-
+
if ($obj['oneOf']) {
foreach($obj['oneOf'] as $selection) {
// logger('selection: ' . $selection);
@@ -80,7 +80,6 @@ class Vote extends Controller {
$item = [];
-
$item['aid'] = $channel['channel_account_id'];
$item['uid'] = $channel['channel_id'];
$item['item_origin'] = 1;
@@ -95,11 +94,8 @@ class Vote extends Controller {
$item['owner_xchan'] = $fetch[0]['author_xchan'];
$item['allow_cid'] = '<' . $fetch[0]['author_xchan'] . '>';
$item['item_private'] = 1;
-
-
$item['obj_type'] = 'Note';
$item['author'] = channelx_by_n($channel['channel_id']);
-
$item['obj'] = Activity::encode_item($item);
// now reset the placeholders
@@ -108,17 +104,15 @@ class Vote extends Controller {
$item['obj_type'] = 'Answer';
unset($item['author']);
-
$x = item_store($item);
-
retain_item($fetch[0]['id']);
if($x['success']) {
$itemid = $x['item_id'];
Master::Summon( [ 'Notifier', 'like', $itemid ] );
}
-
+
$r = q("select * from item where id = %d",
intval($itemid)
);
@@ -128,6 +122,7 @@ class Vote extends Controller {
Libsync::build_sync_packet($channel['channel_id'], [ 'item' => [ encode_item($sync_item[0],true) ] ]);
}
}
+
$ret['success'] = true;
$ret['message'] = t('Response submitted. Updates may not appear instantly.');
json_return_and_die($ret);
diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php
index a06119506..3d0c07492 100644
--- a/Zotlabs/Module/Wiki.php
+++ b/Zotlabs/Module/Wiki.php
@@ -500,7 +500,7 @@ class Wiki extends Controller {
$r = NativeWiki::create_wiki($owner, $observer_hash, $wiki, $acl);
if($r['success']) {
NativeWiki::sync_a_wiki_item($owner['channel_id'],$r['item_id'],$r['item']['resource_id']);
- $homePage = NativeWikiPage::create_page($owner['channel_id'],$observer_hash,'Home', $r['item']['resource_id'], $wiki['mimeType']);
+ $homePage = NativeWikiPage::create_page($owner, $observer_hash, 'Home', $r['item']['resource_id'], $wiki['mimeType']);
if(! $homePage['success']) {
notice( t('Wiki created, but error creating Home page.'));
goaway(z_root() . '/wiki/' . $nick . '/' . NativeWiki::name_encode($wiki['urlName']));
@@ -606,7 +606,7 @@ class Wiki extends Controller {
json_return_and_die(array('message' => 'Error creating page. Invalid name (' . print_r($_POST,true) . ').', 'success' => false));
}
- $page = NativeWikiPage::create_page($owner['channel_id'],$observer_hash, $name, $resource_id, $mimetype);
+ $page = NativeWikiPage::create_page($owner, $observer_hash, $name, $resource_id, $mimetype);
if($page['item_id']) {
$commit = NativeWikiPage::commit([
diff --git a/Zotlabs/Render/Theme.php b/Zotlabs/Render/Theme.php
index 0eebba1ba..2e6ca0c32 100644
--- a/Zotlabs/Render/Theme.php
+++ b/Zotlabs/Render/Theme.php
@@ -60,14 +60,16 @@ class Theme {
// Allow theme selection of the form 'theme_name:schema_name'
$themepair = explode(':', $chosen_theme);
-
// Check if $chosen_theme is compatible with core. If not fall back to default
$info = get_theme_info($themepair[0]);
+
$compatible = check_plugin_versions($info);
if(!$compatible) {
$chosen_theme = '';
}
+ App::$theme_info = $info;
+
if($chosen_theme && (file_exists('view/theme/' . $themepair[0] . '/css/style.css') || file_exists('view/theme/' . $themepair[0] . '/php/style.php'))) {
return($themepair);
}
diff --git a/Zotlabs/Update/_1249.php b/Zotlabs/Update/_1249.php
new file mode 100644
index 000000000..6d72c4de4
--- /dev/null
+++ b/Zotlabs/Update/_1249.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Zotlabs\Update;
+
+class _1249 {
+
+ function run() {
+
+ dbq("START TRANSACTION");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = dbq("ALTER TABLE abook ADD abook_role TEXT NOT NULL DEFAULT ''");
+ $r2 = dbq("CREATE INDEX \"abook_role\" ON abook (\"abook_role\")");
+ $r = ($r1 && $r2);
+ }
+ else {
+ $r = dbq("ALTER TABLE `abook` ADD `abook_role` CHAR(191) NOT NULL DEFAULT '' ,
+ ADD INDEX `abook_role` (`abook_role`)");
+ }
+
+ if($r) {
+ dbq("COMMIT");
+ return UPDATE_SUCCESS;
+ }
+
+ dbq("ROLLBACK");
+ return UPDATE_FAILED;
+
+ }
+
+}
diff --git a/Zotlabs/Update/_1250.php b/Zotlabs/Update/_1250.php
new file mode 100644
index 000000000..bc50479d4
--- /dev/null
+++ b/Zotlabs/Update/_1250.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Zotlabs\Update;
+
+class _1250 {
+
+ function run() {
+
+ dbq("START TRANSACTION");
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = dbq("ALTER TABLE atoken ADD atoken_guid VARCHAR(255) NOT NULL DEFAULT ''");
+ $r2 = dbq("CREATE INDEX \"atoken_guid\" ON atoken (\"atoken_guid\")");
+ $r = ($r1 && $r2);
+ }
+ else {
+ $r = dbq("ALTER TABLE `atoken` ADD `atoken_guid` CHAR(191) NOT NULL DEFAULT '' ,
+ ADD INDEX `atoken_guid` (`atoken_guid`)");
+ }
+
+ if($r) {
+ dbq("COMMIT");
+ return UPDATE_SUCCESS;
+ }
+
+ dbq("ROLLBACK");
+ return UPDATE_FAILED;
+
+ }
+
+}
diff --git a/Zotlabs/Web/HttpMeta.php b/Zotlabs/Web/HttpMeta.php
index ceaa82162..7cf93dda9 100644
--- a/Zotlabs/Web/HttpMeta.php
+++ b/Zotlabs/Web/HttpMeta.php
@@ -6,71 +6,108 @@ namespace Zotlabs\Web;
class HttpMeta {
private $vars = null;
- private $og = null;
+ private $og = null;
function __construct() {
- $this->vars = array();
- $this->og = array();
+ $this->vars = [];
+ $this->og = [];
+ $this->ogproperties = [];
}
- function set($property,$value) {
- if(strpos($property,'og:') === 0)
- $this->og[$property] = $value;
- else
+ //Set Meta Value
+ // Mode:
+ // 0 = Default - set if no value currently exists
+ // 1 = Overwrite - replace existing value(s)
+ // 2 = Multi - append to the array of values
+ function set($property,$value,$mode=0) {
+ $ogallowsmulti = ['image','audio','video'];
+ if (strpos($property,'og:') === 0) {
+ $count = 0;
+ foreach ($this->og as $ogk => $ogdata) {
+ if (strpos($ogdata['property'],$property) === 0) {
+ if ($mode == 1) {
+ unset($this->og[$ogk]);
+ unset($this->ogproperties[$property]);
+ }
+ elseif ($mode == 0) {
+ return;
+ }
+ elseif ($value == $ogdata['value']) {
+ return;
+ }
+ else {
+ $count++;
+ }
+ }
+ }
+
+ if ($value !== null) {
+ //mode = 1 with value === null will delete the property entirely.
+ $components = explode(':',$property);
+ $ogp=$components[1];
+
+ if (!$count || in_array($ogp,$ogallowsmulti)) {
+ $this->og[]=['property'=>$property,'value'=>$value];
+ $this->ogproperties[$property] = $property;
+ }
+ }
+ } else {
$this->vars[$property] = $value;
+ }
}
function check_required() {
- if(
- ($this->og)
- && array_key_exists('og:title',$this->og)
- && array_key_exists('og:type', $this->og)
- && array_key_exists('og:image',$this->og)
- && array_key_exists('og:url', $this->og)
- )
+ if (
+ in_array('og:title',$this->ogproperties)
+ && in_array('og:type', $this->ogproperties)
+ && (in_array('og:image',$this->ogproperties)
+ || in_array('og:image:url',$this->ogproperties))
+ && (array_key_exists('og:url', $this->ogproperties)
+ || array_key_exists('og:url:secure_url', $this->ogproperties))
+ && array_key_exists('og:description', $this->ogproperties)
+ ) {
return true;
+ }
return false;
}
function get_field($field) {
- if(strpos($field,'og:') === 0)
- $arr = $this->og;
- else
+ if (strpos($field,'og:') === 0) {
+ foreach ($this->og as $ogdata) {
+ if (strpos($ogdata['property'],$field) === 0) {
+ $arr[$field][] = $ogdata['value'];
+ }
+ }
+ }
+ else {
$arr = $this->vars;
+ }
- if($arr && array_key_exists($field,$arr) && $arr[$field])
+ if (isset($arr) && is_array($arr) && array_key_exists($field,$arr) && $arr[$field]) {
return $arr[$field];
+ }
return false;
}
function get() {
+ // use 'name' for most meta fields, and 'property' for opengraph properties
$o = '';
- if($this->vars) {
- foreach($this->vars as $k => $v) {
- $o .= '<meta property="' . $k . '" content="' . urlencode($v) . '" />' . "\r\n" ;
+ if ($this->vars) {
+ foreach ($this->vars as $k => $v) {
+ $o .= '<meta name="' . htmlspecialchars($k,ENT_COMPAT,'UTF-8',false) . '" content="' . htmlspecialchars($v,ENT_COMPAT,'UTF-8',false) . '" />' . "\r\n" ;
}
}
- if($this->check_required()) {
- $arrayproperties = [ 'og:image' ];
- foreach($this->og as $k => $v) {
- if (in_array($k,$arrayproperties)) {
- if (is_array($v)) {
- foreach ($v as $v2) {
- $o .= '<meta property="' . $k . '" content="' . $v2 . '" />' . "\r\n" ;
- }
- } else {
- $o .= '<meta property="' . $k . '" content="' . $v . '" />' . "\r\n" ;
- }
- } else {
- $o .= '<meta property="' . $k . '" content="' . $v . '" />' . "\r\n" ;
- }
+ if ($this->check_required()) {
+ foreach ($this->og as $ogdata) {
+ $o .= '<meta property="' . htmlspecialchars($ogdata['property'],ENT_COMPAT,'UTF-8',false) . '" content="' . htmlspecialchars($ogdata['value'],ENT_COMPAT,'UTF-8',false) . '" />' . "\r\n" ;
}
}
- if($o)
+ if ($o) {
return "\r\n" . $o;
+ }
return $o;
}
diff --git a/Zotlabs/Web/Session.php b/Zotlabs/Web/Session.php
index 6f92a0319..443a02d20 100644
--- a/Zotlabs/Web/Session.php
+++ b/Zotlabs/Web/Session.php
@@ -25,7 +25,7 @@ class Session {
ini_set('session.cookie_httponly', 1);
$this->custom_handler = boolval(get_config('system', 'session_custom', false));
-
+
/*
* Set our session storage functions.
*/
@@ -67,23 +67,24 @@ class Session {
}
- // Force cookies to be secure (https only) if this site is SSL enabled.
+ // Force cookies to be secure (https only) if this site is SSL enabled.
// Must be done before session_start().
$arr = session_get_cookie_params();
-
+
// Note when setting cookies: set the domain to false which creates a single domain
// cookie. If you use a hostname it will create a .domain.com wildcard which will
- // have some nasty side effects if you have any other subdomains running hubzilla.
-
- session_set_cookie_params(
- ((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
- ((isset($arr['path'])) ? $arr['path'] : '/'),
- (($arr['domain']) ? $arr['domain'] : false),
- ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
- ((isset($arr['httponly'])) ? $arr['httponly'] : true)
- );
+ // have some nasty side effects if you have any other subdomains running hubzilla.
+
+ session_set_cookie_params([
+ 'lifetime' => ((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
+ 'path' => ((isset($arr['path'])) ? $arr['path'] : '/'),
+ 'domain' => (($arr['domain']) ? $arr['domain'] : false),
+ 'secure' => ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
+ 'httponly' => ((isset($arr['httponly'])) ? $arr['httponly'] : true),
+ 'samesite' => 'None'
+ ]);
register_shutdown_function('session_write_close');
@@ -127,13 +128,36 @@ class Session {
$this->handler->read(session_id());
}
}
- else
+ else
logger('no session handler');
if (x($_COOKIE, 'jsdisabled')) {
- setcookie('jsdisabled', $_COOKIE['jsdisabled'], $newxtime, '/', false,((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
+ setcookie(
+ 'jsdisabled',
+ $_COOKIE['jsdisabled'],
+ [
+ 'expires' => $newxtime,
+ 'path' => '/',
+ 'domain' => false,
+ 'secure' => ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
+ 'httponly' => ((isset($arr['httponly'])) ? $arr['httponly'] : true),
+ 'samesite' => 'None'
+ ]
+ );
}
- setcookie(session_name(),session_id(),$newxtime, '/', false,((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
+
+ setcookie(
+ session_name(),
+ session_id(),
+ [
+ 'expires' => $newxtime,
+ 'path' => '/',
+ 'domain' => false,
+ 'secure' => ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
+ 'httponly' => ((isset($arr['httponly'])) ? $arr['httponly'] : true),
+ 'samesite' => 'None'
+ ]
+ );
$arr = array('expire' => $xtime);
call_hooks('new_cookie', $arr);
@@ -148,8 +172,21 @@ class Session {
$xtime = (($_SESSION['remember_me']) ? (60 * 60 * 24 * 365) : 0 );
- if($xtime)
- setcookie(session_name(),session_id(),(time() + $xtime), '/', false,((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
+ if($xtime) {
+ setcookie(
+ session_name(),
+ session_id(),
+ [
+ 'expires' => time() + $xtime,
+ 'path' => '/',
+ 'domain' => false,
+ 'secure' => ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
+ 'httponly' => ((isset($arr['httponly'])) ? $arr['httponly'] : true),
+ 'samesite' => 'None'
+ ]
+ );
+ }
+
$arr = array('expire' => $xtime);
call_hooks('extend_cookie', $arr);
@@ -169,8 +206,8 @@ class Session {
if($_SESSION['addr'] && $_SESSION['addr'] != $_SERVER['REMOTE_ADDR']) {
logger('SECURITY: Session IP address changed: ' . $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
- $partial1 = substr($_SESSION['addr'], 0, strrpos($_SESSION['addr'], '.'));
- $partial2 = substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], '.'));
+ $partial1 = substr($_SESSION['addr'], 0, strrpos($_SESSION['addr'], '.'));
+ $partial2 = substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], '.'));
$paranoia = intval(get_pconfig($_SESSION['uid'], 'system', 'paranoia'));
diff --git a/Zotlabs/Widget/Collections.php b/Zotlabs/Widget/Collections.php
index bc9c812c6..ad1a10f4b 100644
--- a/Zotlabs/Widget/Collections.php
+++ b/Zotlabs/Widget/Collections.php
@@ -1,15 +1,15 @@
<?php
namespace Zotlabs\Widget;
-
-require_once('include/group.php');
+
+use Zotlabs\Lib\AccessList;
class Collections {
function widget($args) {
if(argc() < 2)
- return;
+ // return;
$mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
switch($mode) {
@@ -49,6 +49,6 @@ class Collections {
break;
}
- return group_side($every, $each, $edit, $current, $abook_id, $wmode);
+ return AccessList::widget($every, $each, $edit, $current, $abook_id, $wmode);
}
}
diff --git a/Zotlabs/Widget/Conversations.php b/Zotlabs/Widget/Conversations.php
deleted file mode 100644
index 3dc260b50..000000000
--- a/Zotlabs/Widget/Conversations.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-namespace Zotlabs\Widget;
-
-class Conversations {
-
- function widget($arr) {
-
- if (! local_channel())
- return;
-
- switch(argv(1)) {
- case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
- break;
- case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
- break;
- default:
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- }
-
- $o = '';
-
- // private_messages_list() can do other more complicated stuff, for now keep it simple
- $r = self::private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
-
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
- }
-
- $messages = [];
-
- foreach($r as $rr) {
-
- $selected = ((argc() == 3) ? intval(argv(2)) == intval($rr['id']) : $r[0]['id'] == $rr['id']);
-
- $messages[] = [
- 'mailbox' => $mailbox,
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => $rr['body'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
- 'seen' => $rr['seen'],
- 'selected' => ((argv(1) != 'new') ? $selected : '')
- ];
- }
-
- $tpl = get_markup_template('mail_head.tpl');
- $o .= replace_macros($tpl, [
- '$header' => $header,
- '$messages' => $messages
- ]);
-
- return $o;
- }
-
- function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
-
- $where = '';
- $limit = '';
-
- $t0 = dba_timer();
-
- if($numitems)
- $limit = " LIMIT " . intval($numitems) . " OFFSET " . intval($start);
-
- if($mailbox !== '') {
- $x = q("select channel_hash from channel where channel_id = %d limit 1",
- intval($uid)
- );
-
- if(! $x)
- return array();
-
- $channel_hash = dbesc($x[0]['channel_hash']);
- $local_channel = intval(local_channel());
-
- switch($mailbox) {
-
- case 'inbox':
- $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan != '$channel_hash' ORDER BY created DESC $limit";
- break;
-
- case 'outbox':
- $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan = '$channel_hash' ORDER BY created DESC $limit";
- break;
-
- case 'combined':
- default:
- $parents = q("SELECT mail.parent_mid FROM mail LEFT JOIN conv ON mail.conv_guid = conv.guid WHERE mail.mid = mail.parent_mid AND mail.channel_id = %d ORDER BY conv.updated DESC $limit",
- intval($local_channel)
- );
- break;
- }
-
- }
-
- $r = null;
-
- if($parents) {
- foreach($parents as $parent) {
- $all = q("SELECT * FROM mail WHERE parent_mid = '%s' AND channel_id = %d ORDER BY created DESC limit 1",
- dbesc($parent['parent_mid']),
- intval($local_channel)
- );
-
- if($all) {
- foreach($all as $single) {
- $r[] = $single;
- }
- }
- }
- }
- elseif($sql) {
- $r = q($sql);
- }
-
- if(! $r) {
- return array();
- }
-
- $chans = array();
- foreach($r as $rr) {
- $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- }
-
- $c = q("select * from xchan where xchan_hash in (" . protect_sprintf(implode(',',$chans)) . ")");
-
- foreach($r as $k => $rr) {
- $r[$k]['from'] = find_xchan_in_array($rr['from_xchan'],$c);
- $r[$k]['to'] = find_xchan_in_array($rr['to_xchan'],$c);
- $r[$k]['seen'] = intval($rr['mail_seen']);
- if(intval($r[$k]['mail_obscured'])) {
- if($r[$k]['title'])
- $r[$k]['title'] = base64url_decode(str_rot47($r[$k]['title']));
- if($r[$k]['body'])
- $r[$k]['body'] = base64url_decode(str_rot47($r[$k]['body']));
- }
- }
-
- return $r;
- }
-
-}
-
diff --git a/Zotlabs/Widget/Fullprofile.php b/Zotlabs/Widget/Fullprofile.php
index d7340ef40..e8ed13811 100644
--- a/Zotlabs/Widget/Fullprofile.php
+++ b/Zotlabs/Widget/Fullprofile.php
@@ -11,6 +11,6 @@ class Fullprofile {
$block = observer_prohibited();
- return profile_sidebar(\App::$profile, $block);
+ return profile_sidebar(\App::$profile, $block, true, true);
}
}
diff --git a/Zotlabs/Widget/Mailmenu.php b/Zotlabs/Widget/Mailmenu.php
deleted file mode 100644
index ca022c807..000000000
--- a/Zotlabs/Widget/Mailmenu.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-namespace Zotlabs\Widget;
-
-class Mailmenu {
-
- function widget($arr) {
-
- if (! local_channel())
- return;
-
- return replace_macros(get_markup_template('message_side.tpl'), array(
- '$title' => t('Private Mail Menu'),
- '$combined' => array(
- 'label' => t('Combined View'),
- 'url' => z_root() . '/mail/combined',
- 'sel' => (argv(1) == 'combined' || argc() == 1),
- ),
- '$inbox' => array(
- 'label' => t('Inbox'),
- 'url' => z_root() . '/mail/inbox',
- 'sel' => (argv(1) == 'inbox'),
- ),
- '$outbox' => array(
- 'label' => t('Outbox'),
- 'url' => z_root() . '/mail/outbox',
- 'sel' => (argv(1) == 'outbox'),
- ),
-/*
- '$new' => array(
- 'label' => t('New Message'),
- 'url' => z_root() . '/mail/new',
- 'sel'=> (argv(1) == 'new'),
- )
-*/
- ));
- }
-}
diff --git a/Zotlabs/Widget/Messages.php b/Zotlabs/Widget/Messages.php
index c0fef9f75..71f4bd310 100644
--- a/Zotlabs/Widget/Messages.php
+++ b/Zotlabs/Widget/Messages.php
@@ -219,7 +219,7 @@ class Messages {
$entries[$i]['info'] = '';
$entries[$i]['created'] = datetime_convert('UTC', date_default_timezone_get(), $notice['created']);
$entries[$i]['summary'] = $summary;
- $entries[$i]['b64mid'] = basename($notice['link']);
+ $entries[$i]['b64mid'] = (($notice['ntype'] & NOTIFY_INTRO) ? '' : basename($notice['link']));
$entries[$i]['href'] = (($notice['ntype'] & NOTIFY_INTRO) ? $notice['link'] : z_root() . '/hq/' . basename($notice['link']));
$entries[$i]['icon'] = (($notice['ntype'] & NOTIFY_INTRO) ? '<i class="fa fa-user-plus"></i>' : '');
diff --git a/Zotlabs/Widget/Notes.php b/Zotlabs/Widget/Notes.php
index 66c90ef7d..659b62390 100644
--- a/Zotlabs/Widget/Notes.php
+++ b/Zotlabs/Widget/Notes.php
@@ -18,14 +18,24 @@ class Notes {
$tpl = get_markup_template('notes.tpl');
$o = replace_macros($tpl, array(
- '$banner' => t('Notes'),
'$text' => $text,
'$html' => bbcode($text),
- '$save' => t('Save'),
'$app' => ((isset($arr['app'])) ? true : false),
- '$hidden' => ((isset($arr['hidden'])) ? true : false)
+ '$hidden' => ((isset($arr['hidden'])) ? true : false),
+ '$strings' => [
+ 'title' => t('Notes'),
+ 'read' => t('Read mode'),
+ 'edit' => t('Edit mode'),
+ 'editing' => t('Editing'),
+ 'saving' => t('Saving'),
+ 'saved' => t('Saved'),
+ 'dots' => '<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span>'
+ ]
));
+
+
+
return $o;
}
}
diff --git a/Zotlabs/Widget/Permcats.php b/Zotlabs/Widget/Permcats.php
new file mode 100644
index 000000000..a908f6220
--- /dev/null
+++ b/Zotlabs/Widget/Permcats.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+use Zotlabs\Lib\Permcat;
+use Zotlabs\Access\PermissionLimits;
+
+class Permcats {
+
+ function widget($arr) {
+ $pcat = new Permcat(local_channel());
+ $pcatlist = $pcat->listing();
+
+ if (!$pcatlist) {
+ return;
+ }
+
+ $roles = [];
+ $active_role = '';
+
+ foreach($pcatlist as $pc) {
+ if (!$active_role) {
+ $active_role = ((argc() > 1 && $pc['name'] === hex2bin(argv(1))) ? $pc['name'] : '');
+ }
+ $roles[] = [
+ 'name' => $pc['localname'],
+ 'url' => z_root() . '/permcats/' . bin2hex($pc['name']),
+ 'active' => (argc() > 1 && $pc['name'] === hex2bin(argv(1)))
+ ];
+ }
+
+ if($active_role) {
+
+ $roles[] = [
+ 'name' => '<i class="fa fa-plus"></i>&nbsp;' . t('Add new role'),
+ 'url' => z_root() . '/permcats',
+ 'active' => ''
+ ];
+
+/* get role members based on permissions
+ $test = $pcatlist[$active]['perms'];
+
+ $role_sql = '';
+ $count = 0;
+ foreach ($test as $t) {
+ $checkinherited = PermissionLimits::Get(local_channel(),$t['name']);
+
+ if($checkinherited & PERMS_SPECIFIC) {
+ $role_sql .= "( abconfig.k = '" . dbesc($t['name']) . "' AND abconfig.v = '" . intval($t['value']) . "' ) OR ";
+ $count++;
+ }
+ }
+
+ $role_sql = rtrim($role_sql, ' OR ');
+
+ $r = q("SELECT abconfig.xchan, xchan.xchan_name, abook.abook_id FROM abconfig LEFT JOIN xchan on abconfig.xchan = xchan.xchan_hash LEFT JOIN abook ON abconfig.xchan = abook.abook_xchan WHERE xchan.xchan_deleted = 0 and abconfig.chan = %d AND abconfig.cat = 'my_perms' AND ( $role_sql ) GROUP BY abconfig.xchan HAVING count(abconfig.xchan) = %d ORDER BY xchan.xchan_name",
+ intval(local_channel()),
+ intval($count)
+ );
+*/
+
+ // get role members based on abook_role
+
+ $r = q("SELECT abook.abook_id, abook.abook_role, xchan.xchan_name, xchan.xchan_addr, xchan.xchan_url, xchan.xchan_photo_s FROM abook
+ LEFT JOIN xchan on abook.abook_xchan = xchan.xchan_hash
+ WHERE abook.abook_channel = %d AND abook.abook_role = '%s' AND abook_self = 0 AND xchan_deleted = 0
+ ORDER BY xchan.xchan_name",
+ intval(local_channel()),
+ dbesc($active_role)
+ );
+
+ $members = [];
+
+ foreach ($r as $rr) {
+ $members[] = [
+ 'name' => $rr['xchan_name'],
+ 'addr' => (($rr['xchan_addr']) ? $rr['xchan_addr'] : $rr['xchan_url']),
+ 'url' => z_root() . '/connections#' . $rr['abook_id'],
+ 'photo' => $rr['xchan_photo_s']
+ ];
+ }
+ }
+
+ $tpl = get_markup_template("permcats_widget.tpl");
+ $o .= replace_macros($tpl, [
+ '$roles_label' => t('Contact roles'),
+ '$members_label' => t('Role members'),
+ '$roles' => $roles,
+ '$members' => $members
+
+ ]);
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Widget/Privacygroups.php b/Zotlabs/Widget/Privacygroups.php
new file mode 100644
index 000000000..a6b16c552
--- /dev/null
+++ b/Zotlabs/Widget/Privacygroups.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+use Zotlabs\Lib\AccessList;
+
+class Privacygroups {
+
+ function widget($arr) {
+
+ $o = '';
+
+ $groups = q("SELECT id, gname FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
+ intval(local_channel())
+ );
+
+ if (!$groups) {
+ return $o;
+ }
+
+ $menu_items = [];
+ $z_root = z_root();
+ $active = argv(1) ?? '';
+
+ foreach($groups as $group) {
+ $menu_items[] = [
+ 'href' => $z_root . '/group/' . $group['id'],
+ 'label' => $group['gname'],
+ 'title' => '',
+ 'active' => ($active === $group['id']),
+ 'count' => count(AccessList::members(local_channel(), $group['id']))
+ ];
+ }
+
+ if ($active) {
+ $menu_items[] = [
+ 'href' => $z_root . '/group',
+ 'label' => '<i class="fa fa-plus"></i> &nbsp;' . t('Add new group'),
+ 'title' => '',
+ 'active' => '',
+ 'count' => ''
+ ];
+ }
+
+ $tpl = get_markup_template("widget_menu_count.tpl");
+ $o .= replace_macros($tpl, [
+ '$title' => t('Privacy groups'),
+ '$menu_items' => $menu_items,
+
+ ]);
+
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Widget/Profile.php b/Zotlabs/Widget/Profile.php
index bffd910b6..0e5444a56 100644
--- a/Zotlabs/Widget/Profile.php
+++ b/Zotlabs/Widget/Profile.php
@@ -2,12 +2,16 @@
namespace Zotlabs\Widget;
+use App;
class Profile {
-
function widget($args) {
+ if(!App::$profile['profile_uid']) {
+ return;
+ }
+
$block = observer_prohibited();
- return profile_sidebar(\App::$profile, $block, true);
- }
-} \ No newline at end of file
+ return profile_sidebar(App::$profile, $block, true, false);
+ }
+}
diff --git a/Zotlabs/Widget/Settings_menu.php b/Zotlabs/Widget/Settings_menu.php
index 25b80a4b4..4d0f1d2dd 100644
--- a/Zotlabs/Widget/Settings_menu.php
+++ b/Zotlabs/Widget/Settings_menu.php
@@ -40,6 +40,11 @@ class Settings_menu {
'selected' => ((argv(1) === 'channel') ? 'active' : ''),
),
+ array(
+ 'label' => t('Privacy settings'),
+ 'url' => z_root().'/settings/privacy',
+ 'selected' => ((argv(1) === 'privacy') ? 'active' : '')
+ )
);
$tabs[] = array(
diff --git a/Zotlabs/Widget/Tokens.php b/Zotlabs/Widget/Tokens.php
new file mode 100644
index 000000000..8c31003fc
--- /dev/null
+++ b/Zotlabs/Widget/Tokens.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Tokens {
+
+ function widget($arr) {
+
+ $o = '';
+
+ $tokens = q("SELECT atoken_id, atoken_name FROM atoken WHERE atoken_uid = %d",
+ intval(local_channel())
+ );
+
+ if (!$tokens) {
+ return $o;
+ }
+
+ $menu_items = [];
+ $z_root = z_root();
+ $active = argv(1) ?? '';
+
+ foreach($tokens as $token) {
+ $menu_items[] = [
+ 'href' => $z_root . '/tokens/' . $token['atoken_id'],
+ 'label' => $token['atoken_name'],
+ 'title' => '',
+ 'active' => ($active === $token['atoken_id'])
+ ];
+ }
+
+ if ($active) {
+ $menu_items[] = [
+ 'href' => $z_root . '/tokens',
+ 'label' => '<i class="fa fa-plus"></i> &nbsp;' . t('Add new guest'),
+ 'title' => '',
+ 'active' => ''
+ ];
+ }
+
+ $tpl = get_markup_template("widget_menu.tpl");
+ $o .= replace_macros($tpl, [
+ '$title' => t('Guest access'),
+ '$menu_items' => $menu_items,
+
+ ]);
+
+ return $o;
+
+ }
+}
diff --git a/app/group.apd b/app/group.apd
index d026ed23d..bf3ddf4a1 100644
--- a/app/group.apd
+++ b/app/group.apd
@@ -1,7 +1,7 @@
-version: 3
+version: 4
url: $baseurl/group
requires: local_channel
name: Privacy Groups
-photo: icon:users
+photo: icon:lock
categories: Networking
desc: A tool to create and manage privacy groups.
diff --git a/app/permcats.apd b/app/permcats.apd
index dd7b36b92..d71eedb4f 100644
--- a/app/permcats.apd
+++ b/app/permcats.apd
@@ -1,7 +1,7 @@
-version: 3
+version: 5
url: $baseurl/permcats
requires: local_channel
-name: Permission Categories
-photo: icon:unlock-alt
+name: Contact Roles
+photo: icon:user-o
categories: Access Control
-desc: Create and manage custom connection permission limits.
+desc: Create and manage custom contact roles.
diff --git a/boot.php b/boot.php
index 48712cf0c..8b087d551 100644
--- a/boot.php
+++ b/boot.php
@@ -29,6 +29,8 @@
// composer autoloader for all namespaced Classes
use Zotlabs\Lib\Crypto;
+use Zotlabs\Lib\Libzot;
+use Zotlabs\Lib\Config;
require_once('vendor/autoload.php');
@@ -53,10 +55,10 @@ require_once('include/bbcode.php');
require_once('include/items.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '6.3.6' );
+define ( 'STD_VERSION', '7.0RC' );
define ( 'ZOT_REVISION', '6.0' );
-define ( 'DB_UPDATE_VERSION', 1248 );
+define ( 'DB_UPDATE_VERSION', 1250 );
define ( 'PROJECT_BASE', __DIR__ );
@@ -482,7 +484,7 @@ define ( 'NAMESPACE_YMEDIA', 'http://search.yahoo.com/mrss/' );
define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams' );
-define ( 'ZOT_APSCHEMA_REV', '/apschema/v1.9' );
+define ( 'ZOT_APSCHEMA_REV', '/apschema/v1.10' );
/**
* activity stream defines
*/
@@ -858,7 +860,7 @@ class App {
private static $baseurl;
- private static $meta;
+ public static $meta;
/**
* App constructor.
@@ -1184,6 +1186,11 @@ class App {
if($interval < 10000)
$interval = 80000;
+ $theme_color = ((local_channel()) ? get_pconfig(local_channel(), 'redbasic', 'nav_bg') : App::$theme_info['theme_color']);
+ if (!$theme_color) {
+ $theme_color = App::$theme_info['theme_color'];
+ }
+
if(! isset(self::$page['title']) && isset(self::$config['system']['sitename']))
self::$page['title'] = self::$config['system']['sitename'];
@@ -1198,13 +1205,17 @@ class App {
}
}
+
// webmanifest
head_add_link(['rel' => 'manifest', 'href' => '/manifest.json']);
self::$meta->set('application-name', Zotlabs\Lib\System::get_platform_name());
self::$meta->set('generator', Zotlabs\Lib\System::get_platform_name());
+ self::$meta->set('theme-color', $theme_color);
head_add_link(['rel' => 'shortcut icon', 'href' => head_get_icon()]);
+ head_add_link(['rel' => 'apple-touch-icon', 'href' => '/images/app/hz-192.png']);
+
$x = [ 'header' => '' ];
/**
@@ -1527,8 +1538,6 @@ function check_config() {
function fix_system_urls($oldurl, $newurl) {
- require_once('include/crypto.php');
-
logger('fix_system_urls: renaming ' . $oldurl . ' to ' . $newurl);
// Basically a site rename, but this can happen if you change from http to https for instance - even if the site name didn't change
@@ -1538,7 +1547,7 @@ function fix_system_urls($oldurl, $newurl) {
// that they can clean up their hubloc tables (this includes directories).
// It's a very expensive operation so you don't want to have to do it often or after your site gets to be large.
- $r = q("select xchan.*, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_url like '%s'",
+ $r = q("select xchan.*, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_url like '%s' and hubloc_network = 'zot6'",
dbesc($oldurl . '%')
);
@@ -1586,13 +1595,14 @@ function fix_system_urls($oldurl, $newurl) {
dbesc($rv['xchan_hash'])
);
- $y = q("update hubloc set hubloc_addr = '%s', hubloc_url = '%s', hubloc_id_url = '%s', hubloc_url_sig = '%s', hubloc_host = '%s', hubloc_callback = '%s' where hubloc_hash = '%s' and hubloc_url = '%s'",
+ $y = q("update hubloc set hubloc_addr = '%s', hubloc_url = '%s', hubloc_id_url = '%s', hubloc_url_sig = '%s', hubloc_site_id = '%s', hubloc_host = '%s', hubloc_callback = '%s' where hubloc_hash = '%s' and hubloc_url = '%s'",
dbesc($channel_address . '@' . $rhs),
dbesc($newurl),
- dbesc(str_replace($oldurl,$newurl,$rv['hubloc_id_url'])),
- dbesc(($rv['hubloc_network'] === 'zot6') ? \Zotlabs\Lib\Libzot::sign($newurl,$c[0]['channel_prvkey']) : base64url_encode(Crypto::sign($newurl,$c[0]['channel_prvkey']))),
+ dbesc(str_replace($oldurl, $newurl,$rv['hubloc_id_url'])),
+ dbesc(Libzot::sign($newurl, $c[0]['channel_prvkey'])),
+ dbesc(Libzot::make_xchan_hash($newurl, Config::Get('system','pubkey'))),
dbesc($newhost),
- dbesc(($rv['hubloc_network'] === 'zot6') ? $newurl . '/zot' : $newurl . '/post'),
+ dbesc($newurl . '/zot'),
dbesc($rv['xchan_hash']),
dbesc($oldurl)
);
@@ -2341,7 +2351,6 @@ function construct_page() {
$current_theme = Zotlabs\Render\Theme::current();
-
// logger('current_theme: ' . print_r($current_theme,true));
// Zotlabs\Render\Theme::debug();
diff --git a/composer.json b/composer.json
index 177974e06..868ee5fce 100644
--- a/composer.json
+++ b/composer.json
@@ -46,7 +46,8 @@
"twbs/bootstrap": "^5.0.1",
"blueimp/jquery-file-upload": "^10.3",
"desandro/imagesloaded": "^4.1",
- "phpseclib/phpseclib": "~2.0"
+ "phpseclib/phpseclib": "~2.0",
+ "jbroadway/urlify": "^1.2"
},
"require-dev": {
"phpunit/phpunit": "^9.4",
diff --git a/composer.lock b/composer.lock
index 1cab6927f..eff89e299 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "9ad350ab4b8a73d92908ac68923e0ad2",
+ "content-hash": "42ed33170ee08f16ca173e0f21dc65e5",
"packages": [
{
"name": "blueimp/jquery-file-upload",
@@ -339,6 +339,69 @@
"time": "2020-06-29T00:56:53+00:00"
},
{
+ "name": "jbroadway/urlify",
+ "version": "1.2.2-stable",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jbroadway/urlify.git",
+ "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jbroadway/urlify/zipball/9b227e8548f16268cef55b5eb5d659a801fa824b",
+ "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0",
+ "voku/portable-ascii": "^1.4",
+ "voku/stop-words": "^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "URLify": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause-Clear"
+ ],
+ "authors": [
+ {
+ "name": "Johnny Broadway",
+ "email": "johnny@johnnybroadway.com",
+ "homepage": "http://www.johnnybroadway.com/"
+ }
+ ],
+ "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.",
+ "homepage": "https://github.com/jbroadway/urlify",
+ "keywords": [
+ "encode",
+ "iconv",
+ "link",
+ "slug",
+ "translit",
+ "transliterate",
+ "transliteration",
+ "url",
+ "urlify"
+ ],
+ "support": {
+ "issues": "https://github.com/jbroadway/urlify/issues",
+ "source": "https://github.com/jbroadway/urlify/tree/master"
+ },
+ "time": "2020-06-14T17:15:34+00:00"
+ },
+ {
"name": "league/html-to-markdown",
"version": "5.0.1",
"source": {
@@ -1777,6 +1840,127 @@
"source": "https://github.com/twbs/bootstrap/tree/v5.1.3"
},
"time": "2021-10-09T06:43:19+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "1.5.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/1.5.6"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-12T00:07:28+00:00"
+ },
+ {
+ "name": "voku/stop-words",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/stop-words.git",
+ "reference": "8e63c0af20f800b1600783764e0ce19e53969f71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71",
+ "reference": "8e63c0af20f800b1600783764e0ce19e53969f71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Stop-Words via PHP",
+ "keywords": [
+ "stop words",
+ "stop-words"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/stop-words/issues",
+ "source": "https://github.com/voku/stop-words/tree/master"
+ },
+ "time": "2018-11-23T01:37:27+00:00"
}
],
"packages-dev": [
diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md
index c884bb0bd..132e8b63d 100644
--- a/doc/admin/administrator_guide.md
+++ b/doc/admin/administrator_guide.md
@@ -93,7 +93,7 @@ There are several ways to deploy a new hub.
php.ini file * and with no hosting provider restrictions on the use of
exec() and proc_open().
-* curl, gd (with at least jpeg and png support), mysqli, mbstring, mcrypt, zip,
+* curl, gd (with at least jpeg and png support), mysqli, mbstring, zip,
and openssl extensions. The imagick extension is not required but desirable.
* xml extension is required if you want webdav to work.
diff --git a/doc/pl/admin/administrator_guide.md b/doc/pl/admin/administrator_guide.md
index 862cab15f..070a32948 100644
--- a/doc/pl/admin/administrator_guide.md
+++ b/doc/pl/admin/administrator_guide.md
@@ -42,10 +42,10 @@ Nowy portal można wdrożyć na kilka sposobów:
* PHP 7.1 lub w wersji wyższej.
* _Proszę mieć na uwadze, że w niektórych środowiskach hostinu współdzielonego, wersja wiersza poleceń PHP różni się od wersji serwera internetowego_
-
+
* Dostęp do wiersza poleceń PHP z ustawionym w pliku php.ini parametrem _register_argc_argv_ na true i bez ograniczeń dostawcy hostingu w zakresie stosowania funkcji _exec()_ i _proc_open()_.
-* Rozszerzenia curl, gd (z obsługą co najmmniej jpeg i png), mysqli, mbstring, mcrypt, zip i openssl. Tozszerzenie imagick nie jest wymagane ale jest zalecane.
+* Rozszerzenia curl, gd (z obsługą co najmmniej jpeg i png), mysqli, mbstring, zip i openssl. Tozszerzenie imagick nie jest wymagane ale jest zalecane.
* Wymagane jest rozszerzenie xml, jeśli chce sie mieć działajacą obsługę webdav.
@@ -99,9 +99,9 @@ W razie potrzeby nadal trzeba wypełnić w formularzu konfiguracyjnym wszystkie
Utwórz pusty plik o nazwie _.htconfig.php_ i uczyń go możliwymm do zapisania przez serwer WWW. Krok ten wykonaj, jeśli wiesz, że serwer WWW nie będzie mógł sam utworzyć tego pliku.
-##### Krok 4.
+##### Krok 4.
-Odwiedź swoją witrynę za pomocą przeglądarki internetowej i postępuj zgodnie z instrukcjami. Zanotuj wszelkie komunikaty o błędach i popraw je przed kontynuowaniem. Jeśli używasz protokołu SSL (od znanego urzędu autoryzacyjnego), użyj schematu _https_ w adresie URL swojej witryny.
+Odwiedź swoją witrynę za pomocą przeglądarki internetowej i postępuj zgodnie z instrukcjami. Zanotuj wszelkie komunikaty o błędach i popraw je przed kontynuowaniem. Jeśli używasz protokołu SSL (od znanego urzędu autoryzacyjnego), użyj schematu _https_ w adresie URL swojej witryny.
##### Krok 5.
@@ -243,12 +243,12 @@ Klasy usług pozwalają na ustawienie limitów zasobów systemowych poprzez ogra
Aby zastosować klasę usług do istniejącego konta, użyj narzędzia wiersza poleceń z katalogu głównego instalacji Hubzilla:
* uzyskanie listy klas usług:
-
+
util/service_class
* ustawienie domyślnej klasy usług na _firstclass_:
-
+
util/config system default_service_class firstclass
* uzyskanie listy usług, które należą do klasy _firstclass_:
@@ -264,7 +264,7 @@ Aby zastosować klasę usług do istniejącego konta, użyj narzędzia wiersza p
util/service_class --account=5 firstclass
* ustawienie konta, które jest właścicielem kanału `blogchan` na klasę _firstclass_ (z potwierdzeniem)
-
+
util/service_class --channel=blogchan firstclass
**Opcje limitu klas usług**
@@ -281,7 +281,7 @@ Aby zastosować klasę usług do istniejącego konta, użyj narzędzia wiersza p
* _minimum_feedcheck_minutes_ - najniższe ustawienie dozwolone dla odpytywania kanałów RSS
* _chatrooms_ - maksymalna liczba czatów
-* _chatters_inroom_ - maksymalna liczba rozmówców w czacie
+* _chatters_inroom_ - maksymalna liczba rozmówców w czacie
* _access_tokens_ - maksymalna liczba tokenów dostępu gościa na kanał
### Zarządzanie motywami
diff --git a/include/attach.php b/include/attach.php
index 067da21ae..2109b84f1 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -15,10 +15,10 @@ use Zotlabs\Lib\Libsync;
use Zotlabs\Lib\Activity;
use Zotlabs\Access\PermissionLimits;
use Zotlabs\Daemon\Master;
+use Zotlabs\Lib\AccessList;
require_once('include/permissions.php');
require_once('include/security.php');
-require_once('include/group.php');
/**
* @brief Guess the mimetype from file ending.
@@ -2208,7 +2208,7 @@ function attach_recursive_perms($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $
//lookup all channels in sharee group and add them to sharee $arr_allow_cid
if($arr_allow_gid) {
- $in_group = expand_groups($arr_allow_gid);
+ $in_group = AccessList::expand($arr_allow_gid);
$arr_allow_cid = array_unique(array_merge($arr_allow_cid, $in_group));
}
@@ -2280,7 +2280,7 @@ function attach_recursive_perms($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $
//check sharee arr_allow_cid against members of allow_gid of all parent folders
foreach($parent_arr['allow_gid'] as $folder_arr_allow_gid) {
//get the group members
- $folder_arr_allow_cid = expand_groups($folder_arr_allow_gid);
+ $folder_arr_allow_cid = AccessList::expand($folder_arr_allow_gid);
foreach($folder_arr_allow_cid as $ac_hash) {
$count_values[$ac_hash]++;
}
diff --git a/include/bbcode.php b/include/bbcode.php
index 6a1a5a01e..03115effe 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -1400,7 +1400,7 @@ function bbcode($Text, $options = []) {
// Check for table of content without params
while(strpos($Text,'[toc]') !== false) {
$toc_id = 'toc-' . random_string(10);
- $Text = preg_replace("/\[toc\]/ism", '<ul id="' . $toc_id . '" class="toc" data-toc=".section-content-wrapper"></ul><script>$("#' . $toc_id . '").toc();</script>', $Text, 1);
+ $Text = preg_replace("/\[toc\]/ism", '<ul id="' . $toc_id . '" class="toc"></ul><script>$(document).ready(function() { let toc_container = $("#' . $toc_id . '").parent().closest("div").attr("id") || ".section-content-wrapper"; $("#' . $toc_id . '").toc({content: "#" + toc_container, headings: "h1,h2,h3,h4"}); });</script>', $Text, 1);
}
// Check for table of content with params
while(strpos($Text,'[toc') !== false) {
diff --git a/include/channel.php b/include/channel.php
index 2db0434ca..c80a35385 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -15,11 +15,13 @@ use Zotlabs\Render\Comanche;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Connect;
use Zotlabs\Lib\Libsync;
+use Zotlabs\Lib\AccessList;
require_once('include/crypto.php');
require_once('include/menu.php');
require_once('include/perm_upgrade.php');
require_once('include/photo/photo_driver.php');
+require_once('include/security.php');
/**
* @brief Called when creating a new channel.
@@ -240,7 +242,7 @@ function create_identity($arr) {
// Force a few things on the short term until we can provide a theme or app with choice
- $publish = 1;
+ $publish = 0;
if(array_key_exists('publish', $arr))
$publish = intval($arr['publish']);
@@ -325,6 +327,12 @@ function create_identity($arr) {
if($role_permissions && array_key_exists('perms_auto',$role_permissions))
set_pconfig($r[0]['channel_id'],'system','autoperms',intval($role_permissions['perms_auto']));
+ $group_actor = false;
+ if($role_permissions && array_key_exists('channel_type', $role_permissions) && $role_permissions['channel_type'] === 'group') {
+ set_pconfig($r[0]['channel_id'], 'system', 'group_actor', 1);
+ $group_actor = true;
+ }
+
$ret['channel'] = $r[0];
if(intval($arr['account_id']))
@@ -374,7 +382,8 @@ function create_identity($arr) {
'xchan_network' => 'zot6',
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert(),
- 'xchan_system' => $system
+ 'xchan_system' => $system,
+ 'xchan_pubforum' => $group_actor
]
);
if(! $r)
@@ -399,14 +408,6 @@ function create_identity($arr) {
]
);
- if($role_permissions) {
- $myperms = ((array_key_exists('perms_connect',$role_permissions)) ? $role_permissions['perms_connect'] : array());
- }
- else {
- $x = PermissionRoles::role_perms('social');
- $myperms = $x['perms_connect'];
- }
-
$r = abook_store_lowlevel(
[
'abook_account' => intval($ret['channel']['channel_account_id']),
@@ -419,19 +420,18 @@ function create_identity($arr) {
]
);
- $x = Permissions::FilledPerms($myperms);
- foreach($x as $k => $v) {
- set_abconfig($newuid,$hash,'my_perms',$k,$v);
- }
-
if(intval($ret['channel']['channel_account_id'])) {
- // Save our permissions role so we can perhaps call it up and modify it later.
+
+ // Set the default permcat
+ set_pconfig($newuid,'system','default_permcat','default');
if($role_permissions) {
+ // Save our permissions role so we can perhaps call it up and modify it later.
set_pconfig($newuid,'system','permissions_role',$arr['permissions_role']);
+
if(array_key_exists('online',$role_permissions))
- set_pconfig($newuid,'system','hide_presence',1-intval($role_permissions['online']));
+ set_pconfig($newuid,'system','show_online_status', intval($role_permissions['online']));
if(array_key_exists('perms_auto',$role_permissions)) {
$autoperms = intval($role_permissions['perms_auto']);
set_pconfig($newuid,'system','autoperms',$autoperms);
@@ -453,11 +453,10 @@ function create_identity($arr) {
// Create a group with yourself as a member. This allows somebody to use it
// right away as a default group for new contacts.
- require_once('include/group.php');
- $group_hash = group_add($newuid, t('Friends'));
+ $group_hash = AccessList::add($newuid, t('Friends'));
if($group_hash) {
- group_add_member($newuid,t('Friends'),$ret['channel']['channel_hash']);
+ AccessList::member_add($newuid,t('Friends'),$ret['channel']['channel_hash']);
$default_collection_str = '';
// if our role_permissions indicate that we're using a default collection ACL, add it.
@@ -470,6 +469,10 @@ function create_identity($arr) {
dbesc($default_collection_str),
intval($newuid)
);
+
+ // also update the current channel array, otherwise the auto-follow contacts will not be added to the default group
+ $ret['channel']['channel_default_group'] = dbesc($group_hash);
+ $ret['channel']['channel_allow_gid'] = dbesc($default_collection_str);
}
if(! $system) {
@@ -492,8 +495,7 @@ function create_identity($arr) {
if($acct) {
$f = connect_and_sync($ret['channel'], $acct);
if($f['success']) {
- $can_view_stream = their_perms_contains($ret['channel']['channel_id'],$f['abook']['abook_xchan'],'view_stream');
-
+ $can_view_stream = intval(get_abconfig($ret['channel']['channel_id'], $f['abook']['abook_xchan'], 'their_perms', 'view_stream'));
// If we can view their stream, pull in some posts
if(($can_view_stream) || ($f['abook']['xchan_network'] === 'rss')) {
Master::Summon([ 'Onepoll',$f['abook']['abook_id'] ]);
@@ -767,10 +769,10 @@ function get_default_export_sections() {
'connections',
'config',
'apps',
- 'chatrooms',
- 'events',
- 'webpages',
- 'wikis'
+// 'chatrooms',
+// 'events',
+// 'webpages',
+// 'wikis'
];
$cb = [ 'sections' => $sections ];
@@ -877,6 +879,14 @@ function identity_basic_export($channel_id, $sections = null, $zap_compat = fals
}
if(in_array('connections',$sections)) {
+ $r = q("select * from atoken where atoken_uid = %d",
+ intval($channel_id)
+ );
+
+ if ($r) {
+ $ret['atoken'] = $r;
+ }
+
$xchans = array();
$r = q("select * from abook where abook_channel = %d ",
intval($channel_id)
@@ -1147,7 +1157,7 @@ function identity_basic_export($channel_id, $sections = null, $zap_compat = fals
/**
- * @brief Export items for a year, or a month of a year.
+ * @brief Export conv items for a year, or a month of a year.
*
* @param int $channel_id The channel ID
* @param number $year YYYY
@@ -1156,7 +1166,7 @@ function identity_basic_export($channel_id, $sections = null, $zap_compat = fals
* * \e array \b relocate - (optional)
* * \e array \b item - array with items encoded_item()
*/
-function identity_export_year($channel_id, $year, $month = 0, $zap_compat = false) {
+function conv_item_export_year($channel_id, $year, $month = 0, $zap_compat = false) {
if(! $year)
return array();
@@ -1174,12 +1184,15 @@ function identity_export_year($channel_id, $year, $month = 0, $zap_compat = fals
else
$maxdate = datetime_convert('UTC', 'UTC', $year+1 . '-01-01 00:00:00');
- return channel_export_items_date($channel_id,$mindate,$maxdate, $zap_compat);
+ return channel_export_conv_items_date($channel_id,$mindate,$maxdate, $zap_compat);
}
/**
- * @brief Export items within an arbitrary date range.
+ * @brief Export conv items within an arbitrary date range.
+ *
+ * In opposit to channel_export_items_page() which is used for bulk export via network,
+ * this function will only select conversational items (channel, cards, articles, direct messages).
*
* Date/time is in UTC.
*
@@ -1189,7 +1202,7 @@ function identity_export_year($channel_id, $year, $month = 0, $zap_compat = fals
* @return array
*/
-function channel_export_items_date($channel_id, $start, $finish, $zap_compat = false) {
+function channel_export_conv_items_date($channel_id, $start, $finish, $zap_compat = false) {
if(! $start)
return array();
@@ -1212,19 +1225,39 @@ function channel_export_items_date($channel_id, $start, $finish, $zap_compat = f
}
- $r = q("select * from item where ( item_wall = 1 or item_type != %d ) and item_deleted = 0 and uid = %d and created >= '%s' and created <= '%s' and resource_type != 'photo' order by created",
- intval(ITEM_TYPE_POST),
+ // Fetch parent items for the timeframe
+ $r = q("SELECT parent AS item_id FROM item
+ WHERE uid = %d AND (item_wall = 1 OR item_private = 2) AND item_thread_top = 1
+ AND resource_type IN ('group_item', '') AND item_deleted = 0
+ AND created >= '%s' AND created <= '%s'
+ ORDER BY created",
intval($channel_id),
dbesc($start),
dbesc($finish)
);
- if($r) {
- $ret['item'] = array();
- xchan_query($r);
- $r = fetch_post_tags($r, true);
- foreach($r as $rr)
- $ret['item'][] = encode_item($rr, true, $zap_compat);
+ $parents_str = ids_to_querystr($r, 'item_id');
+
+ $items = q("SELECT * FROM item
+ WHERE uid = %d
+ AND parent IN ( $parents_str )
+ ORDER BY created",
+ intval($channel_id)
+ );
+
+ //$items = q("select * from item where (item_wall = 1 or item_type != %d ) and resource_type = '' and item_deleted = 0 and uid = %d and created >= '%s' and created <= '%s' order by created",
+ //intval(ITEM_TYPE_POST),
+ //intval($channel_id),
+ //dbesc($start),
+ //dbesc($finish)
+ //);
+
+ if($items) {
+ $ret['item'] = [];
+ xchan_query($items);
+ $r = fetch_post_tags($items, true);
+ foreach ($items as $item)
+ $ret['item'][] = encode_item($item, true, $zap_compat);
}
return $ret;
@@ -1461,6 +1494,7 @@ function profile_load($nickname, $profile = '') {
if($can_view_profile) {
$online = get_online_status($nickname);
+
App::$profile['online_status'] = $online['result'];
}
@@ -1539,7 +1573,7 @@ function profile_edit_menu($uid) {
* @return string (HTML) suitable for sidebar inclusion
* Exceptions: Returns empty string if passed $profile is wrong type or not populated
*/
-function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = false) {
+function profile_sidebar($profile, $block = 0, $show_connect = true, $details = false) {
$observer = App::get_observer();
@@ -1595,6 +1629,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
$gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
$marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
$homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+ $hometown = ((x($profile,'hometown') == 1) ? t('Hometown:') : False);
$profile['online'] = (($profile['online_status'] === 'online') ? t('Online Now') : False);
// logger('online: ' . $profile['online']);
@@ -1635,18 +1670,18 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
$tpl = get_markup_template('profile_vcard.tpl');
$o .= replace_macros($tpl, array(
- '$zcard' => $zcard,
+ '$details' => $details,
'$profile' => $profile,
'$connect' => $connect,
'$connect_url' => $connect_url,
'$location' => $location,
+ '$hometown' => $hometown,
'$gender' => $gender,
'$pdesc' => $pdesc,
'$marital' => $marital,
'$homepage' => $homepage,
'$chanmenu' => $channel_menu,
'$reddress' => $reddress,
- '$rating' => '',
'$contact_block' => $contact_block,
'$change_photo' => t('Change your profile photo'),
'$editmenu' => profile_edit_menu($profile['uid'])
@@ -1937,11 +1972,24 @@ function zat_init() {
);
if($r) {
$xchan = atoken_xchan($r[0]);
- atoken_create_xchan($xchan);
+ //atoken_create_xchan($xchan);
atoken_login($xchan);
}
}
+function atoken_delete_and_sync($channel_id, $atoken_guid) {
+ $r = q("select * from atoken where atoken_guid = '%s' and atoken_uid = %d",
+ dbesc($atoken_guid),
+ intval($channel_id)
+ );
+
+ if ($r) {
+ $atok = $r[0];
+ $atok['deleted'] = true;
+ atoken_delete($atok['atoken_id']);
+ Libsync::build_sync_packet($channel_id, ['atoken' => [ $atok ]]);
+ }
+}
/**
* @brief Used from within PCSS themes to set theme parameters.
@@ -2032,11 +2080,12 @@ function get_online_status($nick) {
return $ret;
$r = q("select channel_id, channel_hash from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
+ dbesc($nick)
);
+
if($r) {
- $hide = get_pconfig($r[0]['channel_id'],'system','hide_online_status');
- if($hide)
+ $show = get_pconfig($r[0]['channel_id'],'system','show_online_status');
+ if(!$show)
return $ret;
$x = q("select cp_status from chatpresence where cp_xchan = '%s' and cp_room = 0 limit 1",
diff --git a/include/connections.php b/include/connections.php
index 6dba06189..a0a9e04a7 100644
--- a/include/connections.php
+++ b/include/connections.php
@@ -1,5 +1,6 @@
<?php /** @file */
+use Zotlabs\Daemon\Master;
function abook_store_lowlevel($arr) {
@@ -27,7 +28,8 @@ function abook_store_lowlevel($arr) {
'abook_profile' => ((array_key_exists('abook_profile',$arr)) ? $arr['abook_profile'] : ''),
'abook_incl' => ((array_key_exists('abook_incl',$arr)) ? $arr['abook_incl'] : ''),
'abook_excl' => ((array_key_exists('abook_excl',$arr)) ? $arr['abook_excl'] : ''),
- 'abook_instance' => ((array_key_exists('abook_instance',$arr)) ? $arr['abook_instance'] : '')
+ 'abook_instance' => ((array_key_exists('abook_instance',$arr)) ? $arr['abook_instance'] : ''),
+ 'abook_role' => ((array_key_exists('abook_role',$arr)) ? $arr['abook_role'] : '')
];
return create_table_from_array('abook',$store);
@@ -112,7 +114,7 @@ function vcard_from_xchan($xchan, $observer = null, $mode = '') {
// don't provide a connect button for transient or one-way identities
- if(in_array($xchan['xchan_network'],['rss','anon','unknown']) || strpos($xchan['xchan_addr'],'guest:') === 0) {
+ if(in_array($xchan['xchan_network'],['rss', 'anon', 'unknown', 'token'])) {
$connect = false;
}
@@ -127,7 +129,7 @@ function vcard_from_xchan($xchan, $observer = null, $mode = '') {
return replace_macros(get_markup_template('xchan_vcard.tpl'),array(
'$name' => $xchan['xchan_name'],
'$addr' => (($xchan['xchan_addr']) ? $xchan['xchan_addr'] : $xchan['xchan_url']),
- '$photo' => $xchan['xchan_photo_m'],
+ '$photo' => $xchan['xchan_photo_l'],
'$follow' => (($xchan['xchan_addr']) ? $xchan['xchan_addr'] : $xchan['xchan_url']),
'$link' => zid($xchan['xchan_url']),
'$connect' => $connect,
@@ -375,52 +377,22 @@ function contact_remove($channel_id, $abook_id) {
if(intval($abook['abook_self']))
return false;
- $r = q("select id, parent from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d and item_retained = 0 and item_starred = 0",
- dbesc($abook['abook_xchan']),
- dbesc($abook['abook_xchan']),
- intval($channel_id)
+ // if this is an atoken, delete the atoken record
+
+ $xchan = q("select * from xchan where xchan_hash = '%s'",
+ dbesc($abook['abook_xchan'])
);
- if($r) {
- $already_saved = [];
- foreach($r as $rr) {
- $w = $x = $y = null;
- // optimise so we only process newly seen parent items
- if (in_array($rr['parent'],$already_saved)) {
- continue;
- }
- // if this isn't the parent, fetch the parent's item_retained and item_starred to see if the conversation
- // should be retained
- if($rr['id'] != $rr['parent']) {
- $w = q("select id, item_retained, item_starred from item where id = %d",
- intval($rr['parent'])
- );
- if($w) {
- // see if the conversation was filed
- $x = q("select uid from term where otype = %d and oid = %d and ttype = %d limit 1",
- intval(TERM_OBJ_POST),
- intval($w[0]['id']),
- intval(TERM_FILE)
- );
- if (intval($w[0]['item_retained']) || intval($w[0]['item_starred']) || $x) {
- $already_saved[] = $rr['parent'];
- continue;
- }
- }
- }
- // see if this item was filed
- $y = q("select uid from term where otype = %d and oid = %d and ttype = %d limit 1",
- intval(TERM_OBJ_POST),
- intval($rr['id']),
- intval(TERM_FILE)
- );
- if ($y) {
- continue;
- }
- drop_item($rr['id'],false);
+ if (strpos($xchan['xchan_addr'],'guest:') === 0 && strpos($abook['abook_xchan'],'.')){
+ $atoken_guid = substr($abook['abook_xchan'],strrpos($abook['abook_xchan'],'.') + 1);
+ if ($atoken_guid) {
+ atoken_delete_and_sync($channel_id,$atoken_guid);
}
}
+ // remove items in the background as this can take some time
+ Master::Summon(['Delxitems', $channel_id, $abook['abook_xchan']]);
+
q("delete from abook where abook_id = %d and abook_channel = %d",
intval($abook['abook_id']),
intval($channel_id)
@@ -449,7 +421,62 @@ function contact_remove($channel_id, $abook_id) {
return true;
}
+function remove_abook_items($channel_id, $xchan_hash) {
+ $r = q("select id from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d and item_retained = 0 and item_starred = 0",
+ dbesc($xchan_hash),
+ dbesc($xchan_hash),
+ intval($channel_id)
+ );
+ if (! $r) {
+ return;
+ }
+
+ $already_saved = [];
+ foreach ($r as $rr) {
+ $w = $x = $y = null;
+
+ // optimise so we only process newly seen parent items
+ if (in_array($rr['parent'], $already_saved)) {
+ continue;
+ }
+
+ // if this isn't the parent, fetch the parent's item_retained and item_starred to see if the conversation
+ // should be retained
+ if ($rr['id'] != $rr['parent']) {
+ $w = q("select id, item_retained, item_starred from item where id = %d",
+ intval($rr['parent'])
+ );
+
+ if ($w) {
+ // see if the conversation was filed
+ $x = q("select uid from term where otype = %d and oid = %d and ttype = %d limit 1",
+ intval(TERM_OBJ_POST),
+ intval($w[0]['id']),
+ intval(TERM_FILE)
+ );
+
+ if (intval($w[0]['item_retained']) || intval($w[0]['item_starred']) || $x) {
+ $already_saved[] = $rr['parent'];
+ continue;
+ }
+ }
+ }
+
+ // see if this item was filed
+ $y = q("select uid from term where otype = %d and oid = %d and ttype = %d limit 1",
+ intval(TERM_OBJ_POST),
+ intval($rr['id']),
+ intval(TERM_FILE)
+ );
+
+ if ($y) {
+ continue;
+ }
+
+ drop_item($rr['id'],false);
+ }
+}
function random_profile() {
$randfunc = db_getfunc('rand');
diff --git a/include/contact_widgets.php b/include/contact_widgets.php
index a5f867b0f..875a519a5 100644
--- a/include/contact_widgets.php
+++ b/include/contact_widgets.php
@@ -246,7 +246,7 @@ function filecategories_widget($baseurl,$selected = '') {
}
-function common_friends_visitor_widget($profile_uid,$cnt = 25) {
+function common_friends_visitor_widget($profile_uid,$cnt = 36) {
if(local_channel() == $profile_uid)
return;
diff --git a/include/conversation.php b/include/conversation.php
index a7dfa6b73..bdd27c55f 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -1061,7 +1061,7 @@ function thread_author_menu($item, $mode = '') {
}
else {
$url = (($item['author']['xchan_addr']) ? $item['author']['xchan_addr'] : $item['author']['xchan_url']);
- if($local_channel && $url && (! in_array($item['author']['xchan_network'],[ 'rss', 'anon','unknown', 'zot' ]))) {
+ if($local_channel && $url && (! in_array($item['author']['xchan_network'],[ 'rss', 'anon','unknown', 'zot', 'token']))) {
$follow_url = z_root() . '/follow/?f=&url=' . urlencode($url) . '&interactive=0';
}
}
@@ -1070,7 +1070,7 @@ function thread_author_menu($item, $mode = '') {
if($contact) {
$poke_link = ((Apps::system_app_installed($local_channel, 'Poke')) ? z_root() . '/poke/?f=&c=' . $contact['abook_id'] : '');
if (! intval($contact['abook_self']))
- $contact_url = z_root() . '/connedit/' . $contact['abook_id'];
+ $contact_url = z_root() . '/connections#' . $contact['abook_id'];
$posts_link = z_root() . '/network/?cid=' . $contact['abook_id'];
$clean_url = normalise_link($item['author-link']);
@@ -1086,7 +1086,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('View Profile'),
'icon' => 'fw',
'action' => '',
- 'href' => $profile_link
+ 'href' => $profile_link,
+ 'data' => '',
+ 'class' => ''
];
}
@@ -1096,7 +1098,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('Recent Activity'),
'icon' => 'fw',
'action' => '',
- 'href' => $posts_link
+ 'href' => $posts_link,
+ 'data' => '',
+ 'class' => ''
];
}
@@ -1107,6 +1111,8 @@ function thread_author_menu($item, $mode = '') {
'icon' => 'fw',
'action' => 'doFollowAuthor(\'' . $follow_url . '\'); return false;',
'href' => '#',
+ 'data' => '',
+ 'class' => ''
];
}
@@ -1116,7 +1122,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('Edit Connection'),
'icon' => 'fw',
'action' => '',
- 'href' => $contact_url
+ 'href' => $contact_url,
+ 'data' => 'data-id="' . $contact['abook_id'] . '"',
+ 'class' => 'contact-edit'
];
}
@@ -1126,7 +1134,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('Message'),
'icon' => 'fw',
'action' => '',
- 'href' => $pm_url
+ 'href' => $pm_url,
+ 'data' => '',
+ 'class' => ''
];
}
@@ -1136,7 +1146,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('Ratings'),
'icon' => 'fw',
'action' => '',
- 'href' => $ratings_url
+ 'href' => $ratings_url,
+ 'data' => '',
+ 'class' => ''
];
}
@@ -1146,7 +1158,9 @@ function thread_author_menu($item, $mode = '') {
'title' => t('Poke'),
'icon' => 'fw',
'action' => '',
- 'href' => $poke_link
+ 'href' => $poke_link,
+ 'data' => '',
+ 'class' => ''
];
}
diff --git a/include/group.php b/include/group.php
index bb1ed5ed8..4e1472900 100644
--- a/include/group.php
+++ b/include/group.php
@@ -326,7 +326,7 @@ function group_side($every="connections",$each="group",$edit = false, $group_id
$o = replace_macros($tpl, array(
'$title' => t('Privacy Groups'),
'$edittext' => t('Edit group'),
- '$createtext' => t('Add privacy group'),
+ '$createtext' => ((argv(1) == 'new' ) ? '' : t('Manage privacy groups')),
'$ungrouped' => (($every === 'contacts') ? t('Channels not in any privacy group') : ''),
'$groups' => $groups,
'$add' => t('add'),
diff --git a/include/import.php b/include/import.php
index b0a1a77e5..291dd2638 100644
--- a/include/import.php
+++ b/include/import.php
@@ -162,6 +162,64 @@ function import_config($channel, $configs) {
}
}
+function import_atoken($channel, $atokens) {
+ if ($channel && $atokens) {
+ foreach ($atokens as $atoken) {
+ unset($atoken['atoken_id']);
+ $atoken['atoken_aid'] = $channel['channel_account_id'];
+ $atoken['atoken_uid'] = $channel['channel_id'];
+ create_table_from_array('atoken', $atoken);
+ }
+ }
+}
+
+function sync_atoken($channel, $atokens) {
+
+ if ($channel && $atokens) {
+ foreach ($atokens as $atoken) {
+ unset($atoken['atoken_id']);
+ $atoken['atoken_aid'] = $channel['channel_account_id'];
+ $atoken['atoken_uid'] = $channel['channel_id'];
+
+ if ($atoken['deleted']) {
+ q("delete from atoken where atoken_uid = %d and atoken_guid = '%s' ",
+ intval($atoken['atoken_uid']),
+ dbesc($atoken['atoken_guid'])
+ );
+ continue;
+ }
+
+ $r = q("select * from atoken where atoken_uid = %d and atoken_guid = '%s' ",
+ intval($atoken['atoken_uid']),
+ dbesc($atoken['atoken_guid'])
+ );
+ if (! $r) {
+ create_table_from_array('atoken', $atoken);
+ }
+ else {
+ $columns = db_columns('atoken');
+ foreach ($atoken as $k => $v) {
+ if (! in_array($k,$columns)) {
+ continue;
+ }
+
+ if (in_array($k, ['atoken_guid','atoken_uid','atoken_aid'])) {
+ continue;
+ }
+
+ $r = q("UPDATE atoken SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE atoken_guid = '%s' AND atoken_uid = %d",
+ dbesc($k),
+ dbesc($v),
+ dbesc($atoken['atoken_guid']),
+ intval($channel['channel_id'])
+ );
+ }
+ }
+ }
+ }
+}
+
+
/**
* @brief Import profiles.
*
@@ -1719,8 +1777,7 @@ function import_webpage_element($element, $channel, $type) {
$namespace = 'WEBPAGE';
$name = $element['pagelink'];
if($name) {
- require_once('library/urlify/URLify.php');
- $name = strtolower(\URLify::transliterate($name));
+ $name = strtolower(URLify::transliterate($name));
}
$arr['title'] = $element['title'];
$arr['term'] = $element['term'];
diff --git a/include/items.php b/include/items.php
index 2ee870c2f..7a899a3fd 100644
--- a/include/items.php
+++ b/include/items.php
@@ -13,9 +13,10 @@ use Zotlabs\Lib\IConfig;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\Libsync;
use Zotlabs\Lib\Libzot;
+use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Access\PermissionLimits;
use Zotlabs\Access\PermissionRoles;
-use Zotlabs\Access\AccessList;
+use Zotlabs\Lib\AccessList;
use Zotlabs\Daemon\Master;
require_once('include/bbcode.php');
@@ -35,8 +36,6 @@ require_once('include/permissions.php');
*/
function collect_recipients($item, &$private_envelope,$include_groups = true) {
- require_once('include/group.php');
-
$private_envelope = ((intval($item['item_private'])) ? true : false);
$recipients = array();
@@ -47,7 +46,7 @@ function collect_recipients($item, &$private_envelope,$include_groups = true) {
$allow_people = expand_acl($item['allow_cid']);
if($include_groups) {
- $allow_groups = expand_groups(expand_acl($item['allow_gid']));
+ $allow_groups = AccessList::expand(expand_acl($item['allow_gid']));
}
else {
$allow_groups = [];
@@ -72,7 +71,7 @@ function collect_recipients($item, &$private_envelope,$include_groups = true) {
}
$deny_people = expand_acl($item['deny_cid']);
- $deny_groups = expand_groups(expand_acl($item['deny_gid']));
+ $deny_groups = AccessList::expand(expand_acl($item['deny_gid']));
$deny = array_unique(array_merge($deny_people,$deny_groups));
@@ -344,6 +343,7 @@ function can_comment_on_post($observer_xchan, $item) {
return true;
break;
case 'any connections':
+ case 'specific':
case 'contacts':
case '':
if(local_channel() && get_abconfig(local_channel(),$item['owner_xchan'],'their_perms','post_comments')) {
@@ -476,7 +476,7 @@ function post_activity_item($arr, $allow_code = false, $deliver = true) {
$arr['comment_policy'] = map_scope(PermissionLimits::Get($channel['channel_id'],'post_comments'));
if ((! $arr['plink']) && (intval($arr['item_thread_top']))) {
- $arr['plink'] = substr(z_root() . '/channel/' . $channel['channel_address'] . '/' . (filter_var($arr['mid'], FILTER_VALIDATE_URL) === false ? '?f=&mid=' : '') . urlencode($arr['mid']),0,190);
+ $arr['plink'] = $arr['mid'];
}
@@ -1226,6 +1226,9 @@ function map_scope($scope, $strip = false) {
return 'site: ' . App::get_hostname();
case PERMS_PENDING:
return 'any connections';
+// uncomment after Hubzilla version 7.0 is running on the majority of active hubs
+// case PERMS_SPECIFIC:
+// return 'specific';
case PERMS_CONTACTS:
default:
return 'contacts';
@@ -2537,12 +2540,7 @@ function get_item_contact($item,$contacts) {
*/
function tag_deliver($uid, $item_id) {
- $role = get_pconfig($uid,'system','permissions_role');
- $rolesettings = PermissionRoles::role_perms($role);
- $channel_type = isset($rolesettings['channel_type']) ? $rolesettings['channel_type'] : 'normal';
-
- $is_group = (($channel_type === 'group') ? true : false);
-
+ $is_group = get_pconfig($uid, 'system', 'group_actor');
$mention = false;
/*
@@ -2579,15 +2577,18 @@ function tag_deliver($uid, $item_id) {
}
if ($is_group && intval($item['item_private']) === 2 && intval($item['item_thread_top'])) {
-
// do not turn the groups own direkt messages into group items
if($item['item_wall'] && $item['author_xchan'] === $u[0]['channel_hash'])
return;
// group delivery via DM
- if(perm_is_allowed($uid,$item['owner_xchan'],'post_wall') || perm_is_allowed($uid,$item['owner_xchan'],'tag_deliver')) {
+ if(perm_is_allowed($uid,$item['owner_xchan'],'post_wall')) {
logger('group DM delivery for ' . $u[0]['channel_address']);
start_delivery_chain($u[0], $item, $item_id, 0, true, (($item['edited'] != $item['created']) || $item['item_deleted']));
+ q("update item set item_blocked = %d where id = %d",
+ intval(ITEM_HIDDEN),
+ intval($item_id)
+ );
}
return;
}
@@ -2600,13 +2601,6 @@ function tag_deliver($uid, $item_id) {
return;
}
- /* this should not be required anymore due to the check above
- if (strpos($item['body'],'[/share]')) {
- logger('W2W post already shared');
- return;
- }
- */
-
// group delivery via W2W
logger('rewriting W2W post for ' . $u[0]['channel_address']);
start_delivery_chain($u[0], $item, $item_id, 0, true, (($item['edited'] != $item['created']) || $item['item_deleted']));
@@ -2677,9 +2671,37 @@ function tag_deliver($uid, $item_id) {
intval($uid)
);
- if(($x) && intval($x[0]['item_uplink'])) {
- start_delivery_chain($u[0],$item,$item_id,$x[0]);
+ if ($x) {
+
+ // group comments don't normally require a second delivery chain
+ // but we create a linked Announce so they will show up in the home timeline
+ // on microblog platforms and this creates a second delivery chain
+
+ if ($is_group && intval($x[0]['item_wall'])) {
+ // don't let the forked delivery chain recurse
+ if ($item['verb'] === 'Announce' && $item['author_xchan'] === $u['channel_hash']) {
+ return;
+ }
+ // don't announce moderated content until it has been approved
+ if (intval($item['item_blocked']) === ITEM_MODERATED) {
+ return;
+ }
+
+ // don't boost likes and other response activities as it is likely that
+ // few platforms will handle this in an elegant way
+
+ if (ActivityStreams::is_response_activity($item['verb'])) {
+ return;
+ }
+ logger('group_comment');
+ start_delivery_chain($u[0], $item, $item_id, $x[0], true, (($item['edited'] != $item['created']) || $item['item_deleted']));
+
+ }
+ elseif (intval($x[0]['item_uplink'])) {
+ start_delivery_chain($u,$item,$item_id,$x[0]);
+ }
}
+
}
@@ -2920,13 +2942,7 @@ function item_community_tag($channel,$item) {
*/
function tgroup_check($uid, $item) {
-
- $role = get_pconfig($uid,'system','permissions_role');
- $rolesettings = PermissionRoles::role_perms($role);
- $channel_type = isset($rolesettings['channel_type']) ? $rolesettings['channel_type'] : 'normal';
-
- $is_group = (($channel_type === 'group') ? true : false);
-
+ $is_group = get_pconfig($uid, 'system', 'group_actor');
$mention = false;
// check that the message originated elsewhere and is a top-level post
@@ -3125,6 +3141,10 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
$arr = [];
+ q("update item set item_hidden = 1 where id = %d",
+ intval($item_id)
+ );
+
if ($edit) {
// process edit or delete action
@@ -3155,7 +3175,7 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
}
else {
$arr['uuid'] = item_message_id();
- $arr['mid'] = z_root() . '/activity/' . $arr['uuid'];
+ $arr['mid'] = z_root() . '/item/' . $arr['uuid'];
$arr['parent_mid'] = $arr['mid'];
}
@@ -3173,6 +3193,10 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
$arr['item_private'] = (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
|| $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 1 : 0);
+ if ($channel['channel_allow_cid'] && empty($channel['channel_allow_gid'])) {
+ $arr['item_private'] = 2;
+ }
+
$arr['item_origin'] = 1;
$arr['item_wall'] = 1;
$arr['item_thread_top'] = 1;
@@ -3192,6 +3216,29 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
$bb .= "[/share]";
$arr['body'] = $bb;
+ // Conversational objects shouldn't be copied, but other objects should.
+ if (in_array($item['obj_type'], [ 'Image', 'Event', 'Question' ])) {
+ $arr['obj'] = $item['obj'];
+ $t = json_decode($arr['obj'],true);
+
+ if ($t !== NULL) {
+ $arr['obj'] = $t;
+ }
+ $arr['obj']['content'] = bbcode($bb);
+ $arr['obj']['source']['content'] = $bb;
+ $arr['obj']['id'] = $arr['mid'];
+
+ if (! array_path_exists('obj/source/mediaType',$arr)) {
+ $arr['obj']['source']['mediaType'] = 'text/bbcode';
+ }
+
+ $arr['obj']['directMessage'] = (intval($arr['item_private']) === 2);
+
+ }
+
+ $arr['tgt_type'] = $item['tgt_type'];
+ $arr['target'] = $item['target'];
+
$arr['term'] = $item['term'];
$arr['author_xchan'] = $channel['channel_hash'];
@@ -3222,6 +3269,92 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
}
+ if ($group && $parent) {
+ logger('comment arrived in group', LOGGER_DEBUG);
+ $arr = [];
+
+ // don't let this recurse. We checked for this before calling, but this ensures
+ // it doesn't sneak through another way because recursion is nasty.
+
+ if ($item['verb'] === 'Announce' && $item['author_xchan'] === $channel['channel_hash']) {
+ return;
+ }
+
+ // Don't send Announce activities for poll responses.
+
+ if ($item['obj_type'] === 'Answer') {
+ return;
+ }
+
+ if ($edit) {
+ if (intval($item['item_deleted'])) {
+ drop_item($item['id'],false,DROPITEM_PHASE1);
+ Master::Summon([ 'Notifier','drop',$item['id'] ]);
+ return;
+ }
+ return;
+ }
+ else {
+ $arr['uuid'] = item_message_id();
+ $arr['mid'] = z_root() . '/activity/' . $arr['uuid'];
+ $arr['parent_mid'] = $item['parent_mid'];
+ //IConfig::Set($arr,'activitypub','context', str_replace('/item/','/conversation/',$item['parent_mid']));
+ }
+ $arr['aid'] = $channel['channel_account_id'];
+ $arr['uid'] = $channel['channel_id'];
+
+ $arr['verb'] = 'Announce';
+
+ if (is_array($item['obj'])) {
+ $arr['obj'] = $item['obj'];
+ }
+ elseif (is_string($item['obj']) && strlen($item['obj'])) {
+ $arr['obj'] = json_decode($item['obj'],true);
+ }
+
+ if (! $arr['obj']) {
+ $arr['obj'] = $item['mid'];
+ }
+
+ if (is_array($arr['obj'])) {
+ $obj_actor = ((isset($arr['obj']['actor'])) ? ((is_array($arr['obj']['actor'])) ? $arr['obj']['actor']['id'] : $arr['obj']['actor']) : $arr['obj']['attributedTo']);
+ $mention = Activity::get_actor_bbmention($obj_actor);
+ $arr['body'] = sprintf( t('&#x1f501; Repeated %1$s\'s %2$s'), $mention, $arr['obj']['type']);
+ }
+
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+ $arr['item_wall'] = 1;
+
+ $arr['item_private'] = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 1 : 0);
+
+ $arr['item_origin'] = 1;
+ $arr['item_notshown'] = 1;
+
+ $arr['item_thread_top'] = 0;
+
+ $arr['allow_cid'] = $channel['channel_allow_cid'];
+ $arr['allow_gid'] = $channel['channel_allow_gid'];
+ $arr['deny_cid'] = $channel['channel_deny_cid'];
+ $arr['deny_gid'] = $channel['channel_deny_gid'];
+ $arr['comment_policy'] = map_scope(PermissionLimits::Get($channel['channel_id'],'post_comments'));
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
+
+ if ($post_id) {
+ Master::Summon([ 'Notifier','tgroup',$post_id ]);
+ }
+
+ q("update channel set channel_lastpost = '%s' where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($channel['channel_id'])
+ );
+
+ return;
+ }
+
+
// Change this copy of the post to a forum head message and deliver to all the tgroup members
// also reset all the privacy bits to the forum default permissions
@@ -3510,12 +3643,11 @@ function compare_permissions($obj1,$obj2) {
* @return array
*/
function enumerate_permissions($obj) {
- require_once('include/group.php');
$allow_people = expand_acl($obj['allow_cid']);
- $allow_groups = expand_groups(expand_acl($obj['allow_gid']));
+ $allow_groups = AccessList::expand(expand_acl($obj['allow_gid']));
$deny_people = expand_acl($obj['deny_cid']);
- $deny_groups = expand_groups(expand_acl($obj['deny_gid']));
+ $deny_groups = AccessList::expand(expand_acl($obj['deny_gid']));
$recipients = array_unique(array_merge($allow_people,$allow_groups));
$deny = array_unique(array_merge($deny_people,$deny_groups));
$recipients = array_diff($recipients,$deny);
@@ -4252,7 +4384,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$contact_str = '';
- $contacts = group_get_members($r[0]['id']);
+ $contacts = AccessList::members($uid, $r[0]['id']);
if ($contacts) {
foreach($contacts as $c) {
if($contact_str)
@@ -4268,7 +4400,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str)) or allow_gid like '" . protect_sprintf('%<' . dbesc($r[0]['hash']) . '>%') . "' ) and id = parent $item_normal ) ";
- $x = group_rec_byhash($uid,$r[0]['hash']);
+ $x = AccessList::by_hash($uid, $r[0]['hash']);
$result['headline'] = sprintf( t('Privacy group: %s'),$x['gname']);
}
elseif($arr['cid'] && $uid) {
@@ -4640,8 +4772,9 @@ function send_profile_photo_activity($channel,$photo,$profile) {
$arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext;
- $acl = new AccessList($channel);
+ $acl = new Zotlabs\Access\AccessList($channel);
$x = $acl->get();
+
$arr['allow_cid'] = $x['allow_cid'];
$arr['allow_gid'] = $x['allow_gid'];
diff --git a/include/nav.php b/include/nav.php
index 7cc64ab1b..9278c1587 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -26,7 +26,7 @@ function nav($template = 'default') {
intval($channel['channel_id'])
);
- if (empty($_SESSION['delegate'])) {
+ if (empty($_SESSION['delegate']) && feature_enabled(local_channel(), 'nav_channel_select')) {
$chans = q("select channel_name, channel_id from channel where channel_account_id = %d and channel_removed = 0 order by channel_name ",
intval(get_account_id())
);
@@ -97,13 +97,11 @@ function nav($template = 'default') {
if (empty($_SESSION['delegate'])) {
$nav['manage'] = ['manage', t('Channels'), "", t('Manage your channels'), 'manage_nav_btn'];
}
- if (Apps::system_app_installed(local_channel(), 'Privacy Groups'))
- $nav['group'] = ['group', t('Privacy Groups'), "", t('Manage your privacy groups'), 'group_nav_btn'];
$nav['settings'] = ['settings', t('Settings'), "", t('Account/Channel Settings'), 'settings_nav_btn'];
- if ($chans && count($chans) > 1 && feature_enabled(local_channel(), 'nav_channel_select'))
+ if ($chans && count($chans) > 1)
$nav['channels'] = $chans;
$nav['logout'] = ['logout', t('Logout'), "", t('End this session'), 'logout_nav_btn'];
diff --git a/include/permissions.php b/include/permissions.php
index 33b385490..c3a9286c0 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -21,7 +21,7 @@ require_once('include/security.php');
* @param bool $default_ignored (default true)
* if false, lie and pretend the ignored person has permissions you are ignoring (used in channel discovery)
*
- * @returns array of all permissions, key is permission name, value is true or false
+ * @returns array of all permissions, key is permission name, value is 1 or 0
*/
function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_ignored = true) {
@@ -61,7 +61,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// The uid provided doesn't exist. This would be a big fail.
if(! $r) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -70,7 +70,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if($observer_xchan) {
if($channel_perm & PERMS_AUTHED) {
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
@@ -80,23 +80,6 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
intval($uid),
dbesc($observer_xchan)
);
- if(! $x) {
- // see if they've got a guest access token; these are treated as connections
- $y = atoken_abook($uid,$observer_xchan);
- if($y)
- $x = array($y);
-
- if(! $x) {
- // not in address book and no guest token, see if they've got an xchan
- // these *may* have individual (PERMS_SPECIFIC) permissions, but are not connections
- $y = q("select xchan_network from xchan where xchan_hash = '%s' limit 1",
- dbesc($observer_xchan)
- );
- if($y) {
- $x = array(pseudo_abook($y[0]));
- }
- }
- }
$abook_checked = true;
}
@@ -104,7 +87,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// If they're blocked - they can't read or write
if(($x) && intval($x[0]['abook_blocked'])) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -115,7 +98,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if(($x) && ($default_ignored) && in_array($perm_name,$blocked_anon_perms) && intval($x[0]['abook_ignored'])) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
}
@@ -123,7 +106,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// system is blocked to anybody who is not authenticated
if(($check_siteblock) && (! $observer_xchan) && intval(get_config('system', 'block_public'))) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -133,16 +116,16 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if(($observer_xchan) && ($r[0]['channel_hash'] === $observer_xchan)) {
if($r[0]['channel_moved'] && (in_array($perm_name,$blocked_anon_perms)))
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
else
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
// Anybody at all (that wasn't blocked or ignored). They have permission.
if($channel_perm & PERMS_PUBLIC) {
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
@@ -150,7 +133,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// out, permission is denied.
if(! $observer_xchan) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -158,7 +141,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if($channel_perm & PERMS_NETWORK) {
if($x && $x[0]['xchan_network'] === 'zot6') {
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
}
@@ -175,9 +158,9 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
}
if($c)
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
else
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -186,19 +169,19 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// handle whether we're allowing any, approved or specific ones
if(! $x) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
// They are in your address book, but haven't been approved
if($channel_perm & PERMS_PENDING && (! intval($x[0]['abook_pseudo']))) {
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
if(intval($x[0]['abook_pending'])) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -207,11 +190,11 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if($channel_perm & PERMS_CONTACTS) {
// it was a fake abook entry, not really a connection
if(array_key_exists('abook_pseudo',$x[0]) && intval($x[0]['abook_pseudo'])) {
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
- $ret[$perm_name] = true;
+ $ret[$perm_name] = 1;
continue;
}
@@ -221,7 +204,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
if($abperms) {
foreach($abperms as $ab) {
if(($ab['cat'] == 'my_perms') && ($ab['k'] == $perm_name)) {
- $ret[$perm_name] = (intval($ab['v']) ? true : false);
+ $ret[$perm_name] = (intval($ab['v']) ? 1 : 0);
break;
}
}
@@ -231,7 +214,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
// No permissions allowed.
- $ret[$perm_name] = false;
+ $ret[$perm_name] = 0;
continue;
}
@@ -242,6 +225,7 @@ function get_all_perms($uid, $observer_xchan, $check_siteblock = true, $default_
call_hooks('get_all_perms',$arr);
+
return $arr['permissions'];
}
@@ -308,32 +292,6 @@ function perm_is_allowed($uid, $observer_xchan, $permission, $check_siteblock =
if(($x) && in_array($permission,$blocked_anon_perms) && intval($x[0]['abook_ignored']))
return false;
- if(! $x) {
- // see if they've got a guest access token
- $y = atoken_abook($uid,$observer_xchan);
- if($y)
- $x = array($y);
-
- if(! $x) {
- // not in address book and no guest token, see if they've got an xchan
-
- $y = q("select xchan_network from xchan where xchan_hash = '%s' limit 1",
- dbesc($observer_xchan)
- );
- if($y) {
-
- // This requires an explanation and the effects are subtle.
- // The following line creates a fake connection, and this allows
- // access tokens to have specific permissions even though they are
- // not actual connections.
- // The existence of this fake entry must be checked when dealing
- // with connection related permissions.
-
- $x = array(pseudo_abook($y[0]));
- }
- }
-
- }
$abperms = load_abconfig($uid,$observer_xchan,'my_perms');
}
diff --git a/include/plugin.php b/include/plugin.php
index 5b041f228..95c9882d0 100644
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -742,7 +742,9 @@ function get_theme_info($theme){
'credits' => '',
'maintainer' => array(),
'experimental' => false,
- 'unsupported' => false
+ 'unsupported' => false,
+ 'theme_color' => '',
+ 'background_color' => ''
);
if(file_exists("view/theme/$theme/experimental"))
diff --git a/include/security.php b/include/security.php
index b6c0f1511..881adb818 100644
--- a/include/security.php
+++ b/include/security.php
@@ -89,8 +89,20 @@ function authenticate_success($user_record, $channel = null, $login_initial = fa
}
function atoken_login($atoken) {
- if (!$atoken)
+ if (! $atoken) {
return false;
+ }
+
+ if (App::$cmd === 'channel' && argv(1)) {
+ $channel = channelx_by_nick(argv(1));
+ if (perm_is_allowed($channel['channel_id'],$atoken['xchan_hash'],'delegate')) {
+ $_SESSION['delegate_channel'] = $channel['channel_id'];
+ $_SESSION['delegate'] = $atoken['xchan_hash'];
+ $_SESSION['account_id'] = intval($channel['channel_account_id']);
+ change_channel($channel['channel_id']);
+ return;
+ }
+ }
$_SESSION['authenticated'] = 1;
$_SESSION['visitor_id'] = $atoken['xchan_hash'];
@@ -113,11 +125,11 @@ function atoken_xchan($atoken) {
if ($c) {
return [
'atoken_id' => $atoken['atoken_id'],
- 'xchan_hash' => substr($c['channel_hash'], 0, 16) . '.' . $atoken['atoken_name'],
+ 'xchan_hash' => substr($c['channel_hash'], 0, 16) . '.' . $atoken['atoken_guid'],
'xchan_name' => $atoken['atoken_name'],
'xchan_addr' => 'guest:' . $atoken['atoken_name'] . '@' . App::get_hostname(),
- 'xchan_network' => 'unknown',
- 'xchan_url' => z_root() . '/guest/' . substr($c['channel_hash'], 0, 16) . '.' . $atoken['atoken_name'],
+ 'xchan_network' => 'token',
+ 'xchan_url' => z_root() . '/guest/' . substr($c['channel_hash'], 0, 16) . '.' . $atoken['atoken_guid'],
'xchan_hidden' => 1,
'xchan_photo_mimetype' => 'image/png',
'xchan_photo_l' => z_root() . '/' . get_default_profile_photo(300),
@@ -143,15 +155,25 @@ function atoken_delete($atoken_id) {
if (!$c)
return;
- $atoken_xchan = substr($c[0]['channel_hash'], 0, 16) . '.' . $r[0]['atoken_name'];
+ $atoken_xchan = substr($c[0]['channel_hash'], 0, 16) . '.' . $r[0]['atoken_guid'];
q("delete from atoken where atoken_id = %d",
intval($atoken_id)
);
+
+ q("delete from abook where abook_channel = %d and abook_xchan = '%s'",
+ intval($c[0]['channel_id']),
+ dbesc($atoken_xchan)
+ );
+
q("delete from abconfig where chan = %d and xchan = '%s'",
intval($c[0]['channel_id']),
dbesc($atoken_xchan)
);
+
+ q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
+ dbesc($atoken_xchan)
+ );
}
/**
@@ -198,7 +220,7 @@ function atoken_abook($uid, $xchan_hash) {
if (!$r)
return false;
- $x = q("select * from atoken where atoken_uid = %d and atoken_name = '%s'",
+ $x = q("select * from atoken where atoken_uid = %d and atoken_guid = '%s'",
intval($uid),
dbesc(substr($xchan_hash, 17))
);
diff --git a/include/selectors.php b/include/selectors.php
index 71e2a387d..57a9db480 100644
--- a/include/selectors.php
+++ b/include/selectors.php
@@ -1,7 +1,7 @@
<?php /** @file */
-function contact_profile_assign($current) {
+function contact_profile_assign($current, $label = '') {
$r = q("SELECT profile_guid, profile_name FROM profile WHERE uid = %d",
intval($_SESSION['uid'])
@@ -13,9 +13,13 @@ function contact_profile_assign($current) {
}
}
+ if (!$label) {
+ $label = t('Select a profile to assign to this contact');
+ }
+
$select = [
'profile_assign',
- t('Profile to assign new connections'),
+ $label,
$current,
'',
$options
@@ -70,7 +74,7 @@ function gender_selector($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
function gender_selector_min($current="",$suffix="") {
$o = '';
@@ -87,7 +91,7 @@ function gender_selector_min($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
@@ -107,7 +111,7 @@ function sexpref_selector($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
function sexpref_selector_min($current="",$suffix="") {
@@ -125,7 +129,7 @@ function sexpref_selector_min($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
@@ -144,7 +148,7 @@ function marital_selector($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
function marital_selector_min($current="",$suffix="") {
$o = '';
@@ -161,5 +165,5 @@ function marital_selector_min($current="",$suffix="") {
}
$o .= '</select>';
return $o;
-}
+}
diff --git a/include/text.php b/include/text.php
index 1b3a77dba..666d90838 100644
--- a/include/text.php
+++ b/include/text.php
@@ -12,6 +12,7 @@ use Ramsey\Uuid\Exception\UnableToBuildUuidException;
use Zotlabs\Lib\Crypto;
use Zotlabs\Lib\SvgSanitizer;
use Zotlabs\Lib\Libzot;
+use Zotlabs\Lib\AccessList;
require_once("include/bbcode.php");
@@ -864,6 +865,7 @@ function get_tags($s) {
// ignore anything in a code or svg block
$s = preg_replace('/\[code(.*?)\](.*?)\[\/code\]/sm','',$s);
$s = preg_replace('/\[svg(.*?)\](.*?)\[\/svg\]/sm','',$s);
+ $s = preg_replace('/\[toc(.*?)\]/sm','',$s);
// ignore anything in [style= ]
$s = preg_replace('/\[style=(.*?)\]/sm','',$s);
@@ -987,14 +989,14 @@ function contact_block() {
$shown = get_pconfig(App::$profile['uid'],'system','display_friend_count');
if($shown === false)
- $shown = 25;
+ $shown = 36;
if($shown == 0)
return;
$is_owner = ((local_channel() && local_channel() == App::$profile['uid']) ? true : false);
$sql_extra = '';
- $abook_flags = " and abook_pending = 0 and abook_self = 0 ";
+ $abook_flags = " and abook_pending = 0 and abook_self = 0 and abook_blocked = 0 and abook_ignored = 0 ";
if(! $is_owner) {
$abook_flags .= " and abook_hidden = 0 ";
@@ -1008,56 +1010,58 @@ function contact_block() {
$abook_flags and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra",
intval(App::$profile['uid'])
);
+
if(count($r)) {
$total = intval($r[0]['total']);
}
+
if(! $total) {
- $contacts = t('No connections');
- $micropro = null;
- } else {
+ return $o;
+ }
- $randfunc = db_getfunc('RAND');
+ $randfunc = db_getfunc('RAND');
- $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash WHERE abook_channel = %d $abook_flags and abook_archived = 0 and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ORDER BY $randfunc LIMIT %d",
- intval(App::$profile['uid']),
- intval($shown)
- );
+ $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash WHERE abook_channel = %d $abook_flags and abook_archived = 0 and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ORDER BY $randfunc LIMIT %d",
+ intval(App::$profile['uid']),
+ intval($shown)
+ );
- if(count($r)) {
- $contacts = t('Connections');
- $micropro = [];
- foreach($r as $rr) {
-
- // There is no setting to discover if you are bi-directionally connected
- // Use the ability to post comments as an indication that this relationship is more
- // than wishful thinking; even though soapbox channels and feeds will disable it.
- $rr['perminfo']['connpermcount']=0;
- $rr['perminfo']['connperms']=t('Accepts').': ';
- if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','post_comments'))) {
- $rr['perminfo']['connpermcount']++;
- $rr['perminfo']['connperms'] .= t('Comments');
- }
- if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','send_stream'))) {
- $rr['perminfo']['connpermcount']++;
- $rr['perminfo']['connperms'] = ($rr['perminfo']['connperms']) ? $rr['perminfo']['connperms'] . ', ' : $rr['perminfo']['connperms'] ;
- $rr['perminfo']['connperms'] .= t('Stream items');
- }
- if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','post_wall'))) {
- $rr['perminfo']['connpermcount']++;
- $rr['perminfo']['connperms'] = ($rr['perminfo']['connperms']) ? $rr['perminfo']['connperms'] . ', ' : $rr['perminfo']['connperms'] ;
- $rr['perminfo']['connperms'] .= t('Wall posts');
- }
+ if(! $r) {
+ return $o;
+ }
- if ($rr['perminfo']['connpermcount'] == 0) {
- $rr['perminfo']['connperms'] .= t('Nothing');
- }
+ $contacts = t('Connections');
+ $micropro = [];
+ foreach($r as $rr) {
- if(!$is_owner && $rr['perminfo']['connpermcount'] !== 0)
- unset($rr['perminfo']);
+ // There is no setting to discover if you are bi-directionally connected
+ // Use the ability to post comments as an indication that this relationship is more
+ // than wishful thinking; even though soapbox channels and feeds will disable it.
+ $rr['perminfo']['connpermcount']=0;
+ $rr['perminfo']['connperms']=t('Accepts').': ';
+ if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','post_comments'))) {
+ $rr['perminfo']['connpermcount']++;
+ $rr['perminfo']['connperms'] .= t('Comments');
+ }
+ if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','send_stream'))) {
+ $rr['perminfo']['connpermcount']++;
+ $rr['perminfo']['connperms'] = ($rr['perminfo']['connperms']) ? $rr['perminfo']['connperms'] . ', ' : $rr['perminfo']['connperms'] ;
+ $rr['perminfo']['connperms'] .= t('Stream items');
+ }
+ if(intval(get_abconfig(App::$profile['uid'],$rr['xchan_hash'],'their_perms','post_wall'))) {
+ $rr['perminfo']['connpermcount']++;
+ $rr['perminfo']['connperms'] = ($rr['perminfo']['connperms']) ? $rr['perminfo']['connperms'] . ', ' : $rr['perminfo']['connperms'] ;
+ $rr['perminfo']['connperms'] .= t('Wall posts');
+ }
- $micropro[] = micropro($rr,true,'mpfriend');
- }
+ if ($rr['perminfo']['connpermcount'] == 0) {
+ $rr['perminfo']['connperms'] .= t('Nothing');
}
+
+ if(!$is_owner && $rr['perminfo']['connpermcount'] !== 0)
+ unset($rr['perminfo']);
+
+ $micropro[] = micropro($rr,true,'mpfriend');
}
$tpl = get_markup_template('contact_block.tpl');
@@ -1714,7 +1718,7 @@ function prepare_body(&$item,$attach = false,$opts = false) {
if ($is_photo) {
$object = json_decode($item['obj'],true);
$ptr = null;
- if (array_key_exists('url',$object) && is_array($object['url'])) {
+ if (is_array($object) && array_key_exists('url',$object) && is_array($object['url'])) {
if (array_key_exists(0,$object['url'])) {
foreach ($object['url'] as $link) {
if(array_key_exists('width',$link) && $link['width'] >= 640 && $link['width'] <= 1024) {
@@ -1753,6 +1757,7 @@ function prepare_body(&$item,$attach = false,$opts = false) {
}
}
+
$poll = (($item['obj_type'] === 'Question' && in_array($item['verb'],[ ACTIVITY_POST, ACTIVITY_UPDATE, ACTIVITY_SHARE ])) ? format_poll($item, $s, $opts) : false);
if ($poll) {
$s = $poll;
@@ -1854,17 +1859,29 @@ function format_poll($item,$s,$opts) {
return EMPTY_STR;
}
- $commentable = can_comment_on_post(((local_channel()) ? get_observer_hash() : EMPTY_STR),$item);
+ $commentable = can_comment_on_post(((local_channel()) ? get_observer_hash() : EMPTY_STR), $item);
+
+ $activated = ((local_channel() && local_channel() == $item['uid'] && get_observer_hash() !== $item['owner_xchan']) ? true : false);
+ $output = $s;
- //logger('format_poll: ' . print_r($item,true));
- $activated = ((local_channel() && local_channel() == $item['uid']) ? true : false);
- $output = $s . EOL. EOL;
+ if (strpos($item['body'], '[/share]') !== false) {
+ $output = substr($output, 0, -12);
+ }
+
+ $output .= EOL . EOL;
if ($act['type'] === 'Question') {
if ($activated and $commentable) {
$output .= '<form id="question-form-' . $item['id'] . '" >';
}
if (array_key_exists('anyOf',$act) && is_array($act['anyOf'])) {
+ $totalResponses = 0;
+ foreach ($act['anyOf'] as $poll) {
+ if (array_path_exists('replies/totalItems',$poll)) {
+ $totalResponses += intval($poll['replies']['totalItems']);
+ }
+ }
+
foreach ($act['anyOf'] as $poll) {
if (array_key_exists('name',$poll) && $poll['name']) {
$text = html2plain(purify_html($poll['name']),256);
@@ -1875,15 +1892,34 @@ function format_poll($item,$s,$opts) {
$total = 0;
}
if ($activated && $commentable) {
- $output .= '<input type="checkbox" name="answer[]" value="' . htmlspecialchars($text) . '"> ' . $text . '</input>' . ' (' . $total . ')' . EOL;
+ //$output .= '<input type="checkbox" name="answer[]" value="' . htmlspecialchars($text) . '"> ' . $text . '</input>' . ' (' . $total . ')' . EOL;
+
+ $output .= '<input type="checkbox" name="answer[]" value="' . htmlspecialchars($text) . '">&nbsp;&nbsp;<strong>' . $text . '</strong>' . EOL;
+ $output .= '<div class="progress bg-secondary bg-opacity-25" style="height: 3px;">';
+ $output .= '<div class="progress-bar bg-info" role="progressbar" style="width: ' . (($totalResponses) ? intval($total / $totalResponses * 100) : 0). '%;" aria-valuenow="" aria-valuemin="0" aria-valuemax="100"></div>';
+ $output .= '</div>';
+ $output .= '<div class="text-muted"><small>' . sprintf(tt('%d Vote', '%d Votes', $total, 'noun'), $total) . '&nbsp;|&nbsp;' . (($totalResponses) ? intval($total / $totalResponses * 100) . '%' : '0%') . '</small></div>';
+ $output .= EOL;
}
else {
- $output .= '[ ] ' . $text . ' (' . $total . ')' . EOL;
+ //$output .= '[ ] ' . $text . ' (' . $total . ')' . EOL;
+ $output .= '<input type="checkbox" name="answer[]" value="' . htmlspecialchars($text) . '" disabled="disabled">&nbsp;&nbsp;<strong>' . $text . '</strong>' . EOL;
+ $output .= '<div class="progress bg-secondary bg-opacity-25" style="height: 3px;">';
+ $output .= '<div class="progress-bar bg-info" role="progressbar" style="width: ' . (($totalResponses) ? intval($total / $totalResponses * 100) : 0) . '%;" aria-valuenow="" aria-valuemin="0" aria-valuemax="100"></div>';
+ $output .= '</div>';
+ $output .= '<div class="text-muted"><small>' . sprintf(tt('%d Vote', '%d Votes', $total, 'noun'), $total) . '&nbsp;|&nbsp;' . (($totalResponses) ? intval($total / $totalResponses * 100) . '%' : '0%') . '</small></div>';
+ $output .= EOL;
}
}
}
}
if (array_key_exists('oneOf',$act) && is_array($act['oneOf'])) {
+ $totalResponses = 0;
+ foreach ($act['oneOf'] as $poll) {
+ if (array_path_exists('replies/totalItems',$poll)) {
+ $totalResponses += intval($poll['replies']['totalItems']);
+ }
+ }
foreach ($act['oneOf'] as $poll) {
if (array_key_exists('name',$poll) && $poll['name']) {
$text = html2plain(purify_html($poll['name']),256);
@@ -1894,29 +1930,48 @@ function format_poll($item,$s,$opts) {
$total = 0;
}
if ($activated && $commentable) {
- $output .= '<input type="radio" name="answer" value="' . htmlspecialchars($text) . '"> ' . $text . '</input>' . ' (' . $total . ')' . EOL;
+ $output .= '<input type="radio" name="answer" value="' . htmlspecialchars($text) . '">&nbsp;&nbsp;<strong>' . $text . '</strong>' . EOL;
+ $output .= '<div class="progress bg-secondary bg-opacity-25" style="height: 3px;">';
+ $output .= '<div class="progress-bar bg-info" role="progressbar" style="width: ' . (($totalResponses) ? intval($total / $totalResponses * 100) : 0). '%;" aria-valuenow="" aria-valuemin="0" aria-valuemax="100"></div>';
+ $output .= '</div>';
+ $output .= '<div class="text-muted"><small>' . sprintf(tt('%d Vote', '%d Votes', $total, 'noun'), $total) . '&nbsp;|&nbsp;' . (($totalResponses) ? intval($total / $totalResponses * 100) . '%' : '0%') . '</small></div>';
+ $output .= EOL;
}
+
else {
- $output .= '( ) ' . $text . ' (' . $total . ')' . EOL;
+ $output .= '<input type="radio" name="answer" value="' . htmlspecialchars($text) . '" disabled="disabled">&nbsp;&nbsp;<strong>' . $text . '</strong>' . EOL;
+ $output .= '<div class="progress bg-secondary bg-opacity-25" style="height: 3px;">';
+ $output .= '<div class="progress-bar bg-info" role="progressbar" style="width: ' . (($totalResponses) ? intval($total / $totalResponses * 100) : 0) . '%;" aria-valuenow="" aria-valuemin="0" aria-valuemax="100"></div>';
+ $output .= '</div>';
+ $output .= '<div class="text-muted"><small>' . sprintf(tt('%d Vote', '%d Votes', $total, 'noun'), $total) . '&nbsp;|&nbsp;' . (($totalResponses) ? intval($total / $totalResponses * 100) . '%' : '0%') . '</small></div>';
+ $output .= EOL;
}
}
}
}
+
+ $message = (($totalResponses) ? sprintf(tt('%d Vote in total', '%d Votes in total', $totalResponses, 'noun'), $totalResponses) . EOL : '');
+
if ($item['comments_closed'] > NULL_DATE) {
$t = datetime_convert('UTC',date_default_timezone_get(), $item['comments_closed'], 'Y-m-d H:i');
$closed = ((datetime_convert() > $item['comments_closed']) ? true : false);
if ($closed) {
- $message = t('Poll has ended.');
+ $message .= t('Poll has ended');
}
else {
- $message = sprintf(t('Poll ends: %s'),$t);
+ $message .= sprintf(t('Poll ends in %s'), '<span class="autotime" title="' . $t . '"></span>');
}
- $output .= EOL . '<div>' . $message . '</div>';
}
- if ($activated and $commentable) {
- $output .= EOL . '<input type="button" class="btn btn-std btn-success" name="vote" value="' . t("Vote") . '" onclick="submitPoll(' . $item['id'] . '); return false;">'. '</form>';
+
+ $output .= '<div class="mb-3">' . $message . '</div>';
+
+ if ($activated && $commentable && !$closed) {
+ $output .= '<input type="button" class="btn btn-std btn-success" name="vote" value="' . t("Vote") . '" onclick="submitPoll(' . $item['id'] . '); return false;">'. '</form>';
}
+ if (strpos($item['body'], '[/share]') !== false) {
+ $output .= '</div></div>';
+ }
}
return $output;
}
@@ -2534,7 +2589,7 @@ function xchan_query(&$items, $abook = true, $effective_uid = 0) {
$chans = q("select xchan.*,hubloc.* from xchan left join hubloc on hubloc_hash = xchan_hash
where xchan_hash in (" . protect_sprintf(implode(',', $arr)) . ") and hubloc_primary = 1");
}
- $xchans = q("select * from xchan where xchan_hash in (" . protect_sprintf(implode(',',$arr)) . ") and xchan_network in ('rss','unknown', 'anon')");
+ $xchans = q("select * from xchan where xchan_hash in (" . protect_sprintf(implode(',',$arr)) . ") and xchan_network in ('rss','unknown', 'anon', 'token')");
if(! $chans)
$chans = $xchans;
else
@@ -2989,7 +3044,7 @@ function handle_tag(&$body, &$str_tags, $profile_uid, $tag, $in_network = true)
// weird - as all the other tags are linked to something.
if(local_channel() && local_channel() == $profile_uid) {
- $grp = group_byname($profile_uid,$name);
+ $grp = AccessList::byname($profile_uid,$name);
if($grp) {
$g = q("select hash from pgrp where id = %d and visible = 1 limit 1",
@@ -3692,6 +3747,13 @@ function get_forum_channels($uid) {
if(! $uid)
return;
+ $r = q("select abook_id, xchan_pubforum, xchan_hash, xchan_network, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d and abook_pending = 0 and abook_ignored = 0 and abook_blocked = 0 and abook_archived = 0 and abook_self = 0 and xchan_pubforum = 1 order by xchan_name",
+ intval($uid)
+ );
+
+
+/*
+
if(isset(App::$data['forum_channels']))
return App::$data['forum_channels'];
@@ -3763,6 +3825,7 @@ function get_forum_channels($uid) {
}
App::$data['forum_channels'] = $r;
+*/
return $r;
@@ -3829,6 +3892,26 @@ function array_path_exists($str,$arr) {
/**
+ * @brief provide psuedo random token (string) consisting entirely of US-ASCII letters/numbers
+ * and with possibly variable length
+ *
+ * @return string
+ */
+function new_token($minlen = 36, $maxlen = 48) {
+ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
+ $str = EMPTY_STR;
+
+ $len = (($minlen === $maxlen) ? $minlen : mt_rand($minlen, $maxlen));
+
+ for ($a = 0; $a < $len; $a++) {
+ $str .= $chars[mt_rand(0, 62)];
+ }
+
+ return $str;
+}
+
+
+/**
* @brief Generate a random v4 UUID.
*
* @return string
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index 8267d17f7..80ae20d7b 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -37,6 +37,7 @@ CREATE TABLE IF NOT EXISTS `abook` (
`abook_incl` text NOT NULL,
`abook_excl` text NOT NULL,
`abook_instance` text NOT NULL,
+ `abook_role` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`abook_id`),
KEY `abook_account` (`abook_account`),
KEY `abook_channel` (`abook_channel`),
@@ -58,7 +59,8 @@ CREATE TABLE IF NOT EXISTS `abook` (
KEY `abook_unconnected` (`abook_unconnected`),
KEY `abook_self` (`abook_self`),
KEY `abook_not_here` (`abook_not_here`),
- KEY `abook_feed` (`abook_feed`)
+ KEY `abook_feed` (`abook_feed`),
+ KEY `abook_role` (`abook_role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `account` (
@@ -146,12 +148,14 @@ CREATE TABLE IF NOT EXISTS `app` (
CREATE TABLE IF NOT EXISTS `atoken` (
`atoken_id` int(11) NOT NULL AUTO_INCREMENT,
+ `atoken_guid` char(191) NOT NULL DEFAULT '',
`atoken_aid` int(11) NOT NULL DEFAULT 0 ,
`atoken_uid` int(11) NOT NULL DEFAULT 0 ,
`atoken_name` char(191) NOT NULL DEFAULT '',
`atoken_token` char(191) NOT NULL DEFAULT '',
`atoken_expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`atoken_id`),
+ KEY `atoken_guid` (`atoken_guid`),
KEY `atoken_aid` (`atoken_aid`),
KEY `atoken_uid` (`atoken_uid`),
KEY `atoken_uid_2` (`atoken_uid`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index f3fe28f93..96d0cc33c 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -37,6 +37,7 @@ CREATE TABLE "abook" (
"abook_incl" TEXT NOT NULL DEFAULT '',
"abook_excl" TEXT NOT NULL DEFAULT '',
"abook_instance" TEXT NOT NULL DEFAULT '',
+ "abook_role" varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY ("abook_id")
);
create index "abook_account" on abook ("abook_account");
@@ -61,6 +62,7 @@ CREATE TABLE "abook" (
create index "abook_dob" on abook ("abook_dob");
create index "abook_connected" on abook ("abook_connected");
create index "abook_channel_closeness" on abook ("abook_channel", "abook_closeness");
+ create index "abook_role" on abook ("abook_role");
CREATE TABLE "account" (
"account_id" serial NOT NULL,
@@ -145,12 +147,14 @@ create index "app_system" on app ("app_system");
CREATE TABLE "atoken" (
"atoken_id" serial NOT NULL,
+ "atoken_guid" varchar(255) NOT NULL DEFAULT '',
"atoken_aid" bigint NOT NULL DEFAULT 0,
"atoken_uid" bigint NOT NULL DEFAULT 0,
"atoken_name" varchar(255) NOT NULL DEFAULT '',
"atoken_token" varchar(255) NOT NULL DEFAULT '',
"atoken_expires" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY ("atoken_id"));
+create index atoken_guid on atoken (atoken_guid);
create index atoken_aid on atoken (atoken_aid);
create index atoken_uid on atoken (atoken_uid);
create index atoken_name on atoken (atoken_name);
diff --git a/library/tableofcontents/jquery.toc.js b/library/tableofcontents/jquery.toc.js
index fe10850a3..dffbac38f 100644
--- a/library/tableofcontents/jquery.toc.js
+++ b/library/tableofcontents/jquery.toc.js
@@ -2,7 +2,7 @@
* Table of Contents jQuery Plugin - jquery.toc
*
* Copyright 2013 Nikhil Dabas
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
@@ -12,7 +12,7 @@
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations
* under the License.
- *
+ *
* The original script was modified to work within the red#martrix
* - added var pathname
*/
@@ -53,7 +53,7 @@
// What level is the current heading?
var elem = $(this), level = $.map(headingSelectors, function (selector, index) {
return elem.is(selector) ? index : undefined;
- })[0];
+ })[0];
if (level > currentLevel) {
// If the heading is at a deeper level than where we are, start a new nested
// list, but only if we already have some list items in the parent. If we do
diff --git a/library/urlify/.gitignore b/library/urlify/.gitignore
deleted file mode 100644
index 9df9b994a..000000000
--- a/library/urlify/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-vendor
-composer.phar
-composer.lock
diff --git a/library/urlify/INSTALL b/library/urlify/INSTALL
deleted file mode 100644
index e92e55e11..000000000
--- a/library/urlify/INSTALL
+++ /dev/null
@@ -1,10 +0,0 @@
-To install URLify, you can add it as a dependency ar by downloading the composer.phar executable.
-
-$ curl -s http://getcomposer.org/installer | php
-
-and run install
-
-$ php composer.phar install
-
-For more details, see http://getcomposer.org.
-
diff --git a/library/urlify/README.md b/library/urlify/README.md
deleted file mode 100644
index 7c2c42a12..000000000
--- a/library/urlify/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# URLify for PHP
-
-A PHP port of [URLify.js](https://github.com/django/django/blob/master/django/contrib/admin/static/admin/js/urlify.js)
-from the Django project. Handles symbols from Latin languages, Greek, Turkish,
-Russian, Ukrainian, Czech, Polish, and Latvian. Symbols it cannot transliterate
-it will simply omit.
-
-* Author: [jbroadway](http://github.com/jbroadway)
-* License: MIT
-
-## Usage:
-
-To generate slugs for URLs:
-
-```php
-<?php
-
-echo URLify::filter (' J\'étudie le français ');
-// "jetudie-le-francais"
-
-echo URLify::filter ('Lo siento, no hablo español.');
-// "lo-siento-no-hablo-espanol"
-
-?>
-```
-
-To simply transliterate characters:
-
-```php
-<?php
-
-echo URLify::downcode ('J\'étudie le français');
-// "J'etudie le francais"
-
-echo URLify::downcode ('Lo siento, no hablo español.');
-// "Lo siento, no hablo espanol."
-
-/* Or use transliterate() alias: */
-
-echo URLify::transliterate ('Lo siento, no hablo español.');
-// "Lo siento, no hablo espanol."
-
-?>
-```
-
-To extend the character list:
-
-```php
-<?php
-
-URLify::add_chars (array (
- '¿' => '?', '®' => '(r)', '¼' => '1/4',
- '¼' => '1/2', '¾' => '3/4', '¶' => 'P'
-));
-
-echo URLify::downcode ('¿ ® ¼ ¼ ¾ ¶');
-// "? (r) 1/2 1/2 3/4 P"
-
-?>
-```
-
-To extend the list of words to remove:
-
-```php
-<?php
-
-URLify::remove_words (array ('remove', 'these', 'too'));
-
-?>
-```
diff --git a/library/urlify/URLify.php b/library/urlify/URLify.php
deleted file mode 100644
index 1337f9a91..000000000
--- a/library/urlify/URLify.php
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php
-
-/**
- * A PHP port of URLify.js from the Django project
- * (https://github.com/django/django/blob/master/django/contrib/admin/static/admin/js/urlify.js).
- * Handles symbols from Latin languages, Greek, Turkish, Russian, Ukrainian,
- * Czech, Polish, and Latvian. Symbols it cannot transliterate
- * it will simply omit.
- *
- * Usage:
- *
- * echo URLify::filter (' J\'étudie le français ');
- * // "jetudie-le-francais"
- *
- * echo URLify::filter ('Lo siento, no hablo español.');
- * // "lo-siento-no-hablo-espanol"
- */
-class URLify {
- public static $maps = array (
- 'latin_map' => array (
- 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' =>
- 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
- 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' =>
- 'O', 'Ő' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U',
- 'Ý' => 'Y', 'Þ' => 'TH', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' =>
- 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
- 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' =>
- 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u',
- 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y'
- ),
- 'latin_symbols_map' => array (
- '©' => '(c)'
- ),
- 'greek_map' => array (
- 'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
- 'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
- 'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
- 'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
- 'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
- 'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
- 'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
- 'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
- 'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
- 'Ϋ' => 'Y'
- ),
- 'turkish_map' => array (
- 'ş' => 's', 'Ş' => 'S', 'ı' => 'i', 'İ' => 'I', 'ç' => 'c', 'Ç' => 'C', 'ü' => 'u', 'Ü' => 'U',
- 'ö' => 'o', 'Ö' => 'O', 'ğ' => 'g', 'Ğ' => 'G'
- ),
- 'russian_map' => array (
- 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
- 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
- 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
- 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
- 'я' => 'ya',
- 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
- 'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
- 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
- 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
- 'Я' => 'Ya'
- ),
- 'ukrainian_map' => array (
- 'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G', 'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g'
- ),
- 'czech_map' => array (
- 'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
- 'ž' => 'z', 'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T',
- 'Ů' => 'U', 'Ž' => 'Z'
- ),
- 'polish_map' => array (
- 'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
- 'ż' => 'z', 'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'O', 'Ś' => 'S',
- 'Ź' => 'Z', 'Ż' => 'Z'
- ),
- 'latvian_map' => array (
- 'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
- 'š' => 's', 'ū' => 'u', 'ž' => 'z', 'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i',
- 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N', 'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z'
- )
- );
-
- /**
- * List of words to remove from URLs.
- */
- public static $remove_list = array (
- 'a', 'an', 'as', 'at', 'before', 'but', 'by', 'for', 'from',
- 'is', 'in', 'into', 'like', 'of', 'off', 'on', 'onto', 'per',
- 'since', 'than', 'the', 'this', 'that', 'to', 'up', 'via',
- 'with'
- );
-
- /**
- * The character map.
- */
- private static $map = array ();
-
- /**
- * The character list as a string.
- */
- private static $chars = '';
-
- /**
- * The character list as a regular expression.
- */
- private static $regex = '';
-
- /**
- * Initializes the character map.
- */
- private static function init () {
- if (count (self::$map) > 0) {
- return;
- }
-
- foreach (self::$maps as $map) {
- foreach ($map as $orig => $conv) {
- self::$map[$orig] = $conv;
- self::$chars .= $orig;
- }
- }
-
- self::$regex = '/[' . self::$chars . ']/u';
- }
-
- /**
- * Add new characters to the list. `$map` should be a hash.
- */
- public static function add_chars ($map) {
- if (! is_array ($map)) {
- throw new LogicException ('$map must be an associative array.');
- }
- self::$maps[] = $map;
- self::$map = array ();
- self::$chars = '';
- }
-
- /**
- * Append words to the remove list. Accepts either single words
- * or an array of words.
- */
- public static function remove_words ($words) {
- $words = is_array ($words) ? $words : array ($words);
- self::$remove_list = array_merge (self::$remove_list, $words);
- }
-
- /**
- * Transliterates characters to their ASCII equivalents.
- */
- public static function downcode ($text) {
- self::init ();
-
- if (preg_match_all (self::$regex, $text, $matches)) {
- for ($i = 0; $i < count ($matches[0]); $i++) {
- $char = $matches[0][$i];
- if (isset (self::$map[$char])) {
- $text = str_replace ($char, self::$map[$char], $text);
- }
- }
- }
- return $text;
- }
-
- /**
- * Filters a string, e.g., "Petty theft" to "petty-theft"
- */
- public static function filter ($text, $length = 60) {
- $text = self::downcode ($text);
-
- // remove all these words from the string before urlifying
- $text = preg_replace ('/\b(' . join ('|', self::$remove_list) . ')\b/i', '', $text);
-
- // if downcode doesn't hit, the char will be stripped here
- $text = preg_replace ('/[^-\w\s]/', '', $text); // remove unneeded chars
- $text = preg_replace ('/^\s+|\s+$/', '', $text); // trim leading/trailing spaces
- $text = preg_replace ('/[-\s]+/', '-', $text); // convert spaces to hyphens
- $text = strtolower ($text); // convert to lowercase
- return trim (substr ($text, 0, $length), '-'); // trim to first $length chars
- }
-
- /**
- * Alias of `URLify::downcode()`.
- */
- public static function transliterate ($text) {
- return self::downcode ($text);
- }
-}
-
-?> \ No newline at end of file
diff --git a/library/urlify/tests/URLifyTest.php b/library/urlify/tests/URLifyTest.php
deleted file mode 100644
index 26ecb5dea..000000000
--- a/library/urlify/tests/URLifyTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-class URLifyTest extends PHPUnit_Framework_TestCase {
- function test_downcode () {
- $this->assertEquals (' J\'etudie le francais ', URLify::downcode (' J\'étudie le français '));
- $this->assertEquals ('Lo siento, no hablo espanol.', URLify::downcode ('Lo siento, no hablo español.'));
- $this->assertEquals ('F3PWS', URLify::downcode ('ΦΞΠΏΣ'));
- }
-
- function test_filter () {
- $this->assertEquals ('jetudie-le-francais', URLify::filter (' J\'étudie le français '));
- $this->assertEquals ('lo-siento-no-hablo-espanol', URLify::filter ('Lo siento, no hablo español.'));
- $this->assertEquals ('f3pws', URLify::filter ('ΦΞΠΏΣ'));
- }
-
- function test_add_chars () {
- $this->assertEquals ('¿ ® ¼ ¼ ¾ ¶', URLify::downcode ('¿ ® ¼ ¼ ¾ ¶'));
- URLify::add_chars (array (
- '¿' => '?', '®' => '(r)', '¼' => '1/4',
- '¼' => '1/2', '¾' => '3/4', '¶' => 'P'
- ));
- $this->assertEquals ('? (r) 1/2 1/2 3/4 P', URLify::downcode ('¿ ® ¼ ¼ ¾ ¶'));
- }
-
- function test_remove_words () {
- $this->assertEquals ('foo-bar', URLify::filter ('foo bar'));
- URLify::remove_words (array ('foo', 'bar'));
- $this->assertEquals ('', URLify::filter ('foo bar'));
- }
-}
-
-?>
diff --git a/library/urlify/tests/bootstrap.php b/library/urlify/tests/bootstrap.php
deleted file mode 100644
index d56d46665..000000000
--- a/library/urlify/tests/bootstrap.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-set_error_handler(function () {
- echo file_get_contents(dirname(__DIR__).'/INSTALL');
- exit(1);
-}, E_ALL);
-
-require_once dirname(__DIR__) . '/vendor/autoload.php';
-
-restore_error_handler();
diff --git a/library/urlify/tests/phpunit.xml b/library/urlify/tests/phpunit.xml
deleted file mode 100644
index 2666a3ccb..000000000
--- a/library/urlify/tests/phpunit.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<phpunit bootstrap="bootstrap.php">
- <testsuite name="URLify Test Suite">
- <directory>.</directory>
- </testsuite>
- <logging>
- <log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
- </logging>
-</phpunit>
diff --git a/tests/unit/Access/PermissionLimitsTest.php b/tests/unit/Access/PermissionLimitsTest.php
index 57ad42a19..0a90d11df 100644
--- a/tests/unit/Access/PermissionLimitsTest.php
+++ b/tests/unit/Access/PermissionLimitsTest.php
@@ -45,8 +45,8 @@ class PermissionLimitsTest extends UnitTestCase {
* @uses ::call_hooks
*/
public function testStd_Limits() {
- // There are 18 default perms
- $permsCount = 18;
+ // There are 17 default perms
+ $permsCount = 17;
// Create a stub for global function t() with expectation
$t = $this->getFunctionMock('Zotlabs\Access', 't');
@@ -69,10 +69,9 @@ class PermissionLimitsTest extends UnitTestCase {
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_comments']);
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_mail']);
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_like']);
- $this->assertEquals(PERMS_SPECIFIC, $stdlimits['tag_deliver']);
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['chat']);
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['republish']);
$this->assertEquals(PERMS_SPECIFIC, $stdlimits['delegate']);
}
-} \ No newline at end of file
+}
diff --git a/tests/unit/Access/PermissionRolesTest.php b/tests/unit/Access/PermissionRolesTest.php
index dd55eb6e2..3d3cbbae5 100644
--- a/tests/unit/Access/PermissionRolesTest.php
+++ b/tests/unit/Access/PermissionRolesTest.php
@@ -40,7 +40,7 @@ class PermissionRolesTest extends UnitTestCase {
use PHPMock;
public function testVersion() {
- $expectedVersion = 2;
+ $expectedVersion = 3;
$this->assertEquals($expectedVersion, PermissionRoles::version());
@@ -58,23 +58,12 @@ class PermissionRolesTest extends UnitTestCase {
}
);
- $roles = PermissionRoles::roles();
+ $roles = PermissionRoles::channel_roles();
$r = new PermissionRoles();
- $this->assertEquals($roles, $r->roles());
+ $this->assertEquals($roles, $r->channel_roles());
- $socialNetworking = [
- 'social_federation' => 'Social - Federation',
- 'social' => 'Social - Mostly Public',
- 'social_restricted' => 'Social - Restricted',
- 'social_private' => 'Social - Private'
- ];
+ $this->assertCount(4, $roles, 'There should be 4 channel roles.');
- Assert::assertArraySubset(['Social Networking' => $socialNetworking], $roles);
- $this->assertEquals($socialNetworking, $roles['Social Networking']);
-
- $this->assertCount(5, $roles, 'There should be 5 permission groups.');
-
- $this->assertCount(1, $roles['Other'], "In the 'Other' group should be just one permission role");
}
@@ -88,12 +77,9 @@ class PermissionRolesTest extends UnitTestCase {
$t = $this->getFunctionMock('Zotlabs\Access', 't');
$t = $this->getFunctionMock('Zotlabs\Access', 'get_config');
- $rp_social = PermissionRoles::role_perms('social');
- $this->assertEquals('social', $rp_social['role']);
-
+ $rp_social = PermissionRoles::role_perms('personal');
+ $this->assertEquals('personal', $rp_social['role']);
- $rp_custom = PermissionRoles::role_perms('custom');
- $this->assertEquals(['role' => 'custom'], $rp_custom);
$rp_nonexistent = PermissionRoles::role_perms('nonexistent');
$this->assertEquals(['role' => 'nonexistent'], $rp_nonexistent);
diff --git a/tests/unit/Access/PermissionsTest.php b/tests/unit/Access/PermissionsTest.php
index 40724fff8..3ab567ad0 100644
--- a/tests/unit/Access/PermissionsTest.php
+++ b/tests/unit/Access/PermissionsTest.php
@@ -37,7 +37,7 @@ class PermissionsTest extends UnitTestCase {
use PHPMock;
public function testVersion() {
- $expectedVersion = 2;
+ $expectedVersion = 3;
// static call
$this->assertEquals($expectedVersion, Permissions::version());
@@ -60,8 +60,8 @@ class PermissionsTest extends UnitTestCase {
* @uses ::call_hooks
*/
public function testPerms() {
- // There are 18 default perms
- $permsCount = 18;
+ // There are 17 default perms
+ $permsCount = 17;
// Create a stub for global function t() with expectation
$t = $this->getFunctionMock('Zotlabs\Access', 't');
@@ -94,8 +94,8 @@ class PermissionsTest extends UnitTestCase {
* @uses ::call_hooks
*/
public function testPermsFilter() {
- // There are 18 default perms
- $permsCount = 18;
+ // There are 17 default perms
+ $permsCount = 17;
// Create a stub for global function t() with expectation
$t = $this->getFunctionMock('Zotlabs\Access', 't');
@@ -154,7 +154,6 @@ class PermissionsTest extends UnitTestCase {
'post_comments' => 0,
'post_mail' => 0,
'post_like' => 0,
- 'tag_deliver' => 0,
'chat' => 0,
'republish' => 0,
'delegate' => 0
@@ -177,7 +176,6 @@ class PermissionsTest extends UnitTestCase {
'post_comments' => 0,
'post_mail' => 0,
'post_like' => 0,
- 'tag_deliver' => 0,
'chat' => 0,
'republish' => 0,
'delegate' => 0
@@ -200,7 +198,6 @@ class PermissionsTest extends UnitTestCase {
'post_comments' => 0,
'post_mail' => 0,
'post_like' => 0,
- 'tag_deliver' => 0,
'chat' => 0,
'republish' => 0,
'delegate' => 0
@@ -234,7 +231,6 @@ class PermissionsTest extends UnitTestCase {
'post_comments' => 0,
'post_mail' => 0,
'post_like' => 0,
- 'tag_deliver' => 0,
'chat' => 0,
'republish' => 0,
'delegate' => 0
diff --git a/util/hmessages.po b/util/hmessages.po
index d3ca6fdd5..e8d085c8a 100644
--- a/util/hmessages.po
+++ b/util/hmessages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 6.3\n"
+"Project-Id-Version: 7.0RC\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-09-06 19:21+0000\n"
+"POT-Creation-Date: 2022-01-14 18:27+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,7 +21,7 @@ msgstr ""
#: ../../addon/cart/submodules/orderoptions.php:335
#: ../../addon/cart/submodules/orderoptions.php:359
#: ../../addon/cart/submodules/orderoptions.php:435
-#: ../../addon/cart/submodules/orderoptions.php:459 ../../include/text.php:3366
+#: ../../addon/cart/submodules/orderoptions.php:459 ../../include/text.php:3425
#: ../../Zotlabs/Module/Admin/Site.php:251
msgid "Default"
msgstr ""
@@ -46,11 +46,11 @@ msgstr ""
#: ../../addon/ijpost/Mod_Ijpost.php:72
#: ../../addon/pubcrawl/Mod_Pubcrawl.php:62
#: ../../addon/dwpost/Mod_Dwpost.php:78
-#: ../../addon/startpage/Mod_Startpage.php:71 ../../addon/mail/Mod_Mail.php:206
+#: ../../addon/startpage/Mod_Startpage.php:71
#: ../../addon/twitter/Mod_Twitter.php:182
#: ../../addon/pumpio/Mod_Pumpio.php:113
#: ../../addon/cart/submodules/subscriptions.php:410
-#: ../../addon/cart/submodules/hzservices.php:644
+#: ../../addon/cart/submodules/hzservices.php:645
#: ../../addon/cart/submodules/orderoptions.php:312
#: ../../addon/cart/submodules/orderoptions.php:412
#: ../../addon/cart/submodules/manualcat.php:248
@@ -58,7 +58,7 @@ msgstr ""
#: ../../addon/cart/Settings/Cart.php:142 ../../addon/cart/cart.php:1376
#: ../../addon/nofed/Mod_Nofed.php:51
#: ../../addon/smileybutton/Mod_Smileybutton.php:53
-#: ../../addon/redfiles/redfiles.php:124 ../../addon/diaspora/diaspora.php:84
+#: ../../addon/redfiles/redfiles.php:124 ../../addon/diaspora/diaspora.php:86
#: ../../addon/diaspora/Mod_Diaspora.php:100 ../../addon/piwik/piwik.php:95
#: ../../addon/workflow/workflow.php:1461
#: ../../addon/workflow/workflow.php:1520
@@ -77,11 +77,11 @@ msgstr ""
#: ../../addon/xmpp/Mod_Xmpp.php:70 ../../include/js_strings.php:22
#: ../../Zotlabs/Widget/Wiki_pages.php:42
#: ../../Zotlabs/Widget/Wiki_pages.php:99
-#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Module/Tokens.php:186
-#: ../../Zotlabs/Module/Import_items.php:129
-#: ../../Zotlabs/Module/Import.php:582 ../../Zotlabs/Module/Setup.php:306
-#: ../../Zotlabs/Module/Setup.php:346 ../../Zotlabs/Module/Group.php:149
-#: ../../Zotlabs/Module/Group.php:165 ../../Zotlabs/Module/Oauth.php:109
+#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Module/Tokens.php:294
+#: ../../Zotlabs/Module/Import_items.php:125
+#: ../../Zotlabs/Module/Import.php:611 ../../Zotlabs/Module/Setup.php:306
+#: ../../Zotlabs/Module/Setup.php:346 ../../Zotlabs/Module/Group.php:150
+#: ../../Zotlabs/Module/Group.php:159 ../../Zotlabs/Module/Oauth.php:109
#: ../../Zotlabs/Module/Chat.php:207 ../../Zotlabs/Module/Chat.php:246
#: ../../Zotlabs/Module/Poke.php:215 ../../Zotlabs/Module/Mitem.php:259
#: ../../Zotlabs/Module/Filestorage.php:208
@@ -96,16 +96,18 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Account_edit.php:73
#: ../../Zotlabs/Module/Admin/Profs.php:178
#: ../../Zotlabs/Module/Admin/Addons.php:442
-#: ../../Zotlabs/Module/Regate.php:387 ../../Zotlabs/Module/Permcats.php:127
-#: ../../Zotlabs/Module/Mood.php:156 ../../Zotlabs/Module/Appman.php:159
+#: ../../Zotlabs/Module/Regate.php:407 ../../Zotlabs/Module/Permcats.php:228
+#: ../../Zotlabs/Module/Mood.php:156 ../../Zotlabs/Module/Appman.php:221
+#: ../../Zotlabs/Module/Contactedit.php:429
+#: ../../Zotlabs/Module/Contactedit.php:455
#: ../../Zotlabs/Module/Email_validation.php:40
-#: ../../Zotlabs/Module/Photos.php:1058 ../../Zotlabs/Module/Photos.php:1098
-#: ../../Zotlabs/Module/Photos.php:1214 ../../Zotlabs/Module/Profiles.php:724
-#: ../../Zotlabs/Module/Invite.php:549 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Module/Photos.php:1064 ../../Zotlabs/Module/Photos.php:1104
+#: ../../Zotlabs/Module/Photos.php:1220 ../../Zotlabs/Module/Profiles.php:739
+#: ../../Zotlabs/Module/Invite.php:550 ../../Zotlabs/Module/Xchan.php:15
#: ../../Zotlabs/Module/Affinity.php:84
#: ../../Zotlabs/Module/Settings/Network.php:62
#: ../../Zotlabs/Module/Settings/Features.php:48
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:224
#: ../../Zotlabs/Module/Settings/Account.php:107
#: ../../Zotlabs/Module/Settings/Events.php:42
#: ../../Zotlabs/Module/Settings/Manage.php:43
@@ -117,13 +119,14 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Connections.php:42
#: ../../Zotlabs/Module/Settings/Photos.php:42
#: ../../Zotlabs/Module/Settings/Profiles.php:52
+#: ../../Zotlabs/Module/Settings/Privacy.php:110
#: ../../Zotlabs/Module/Settings/Conversation.php:49
-#: ../../Zotlabs/Module/Defperms.php:264 ../../Zotlabs/Module/Pconfig.php:116
+#: ../../Zotlabs/Module/Defperms.php:263 ../../Zotlabs/Module/Pconfig.php:116
#: ../../Zotlabs/Module/Oauth2.php:114 ../../Zotlabs/Module/Thing.php:328
#: ../../Zotlabs/Module/Thing.php:381 ../../Zotlabs/Module/Pdledit.php:106
-#: ../../Zotlabs/Module/Wiki.php:212 ../../Zotlabs/Module/Connedit.php:889
-#: ../../Zotlabs/Module/Locs.php:130 ../../Zotlabs/Module/Sources.php:123
-#: ../../Zotlabs/Module/Sources.php:160 ../../Zotlabs/Lib/ThreadItem.php:827
+#: ../../Zotlabs/Module/Wiki.php:212 ../../Zotlabs/Module/Connedit.php:714
+#: ../../Zotlabs/Module/Locs.php:125 ../../Zotlabs/Module/Sources.php:123
+#: ../../Zotlabs/Module/Sources.php:160 ../../Zotlabs/Lib/ThreadItem.php:851
#: ../../Zotlabs/Storage/Browser.php:382
msgid "Submit"
msgstr ""
@@ -155,9 +158,9 @@ msgstr ""
#: ../../addon/pumpio/Mod_Pumpio.php:96 ../../addon/pumpio/Mod_Pumpio.php:100
#: ../../addon/cart/submodules/subscriptions.php:153
#: ../../addon/cart/submodules/subscriptions.php:425
-#: ../../addon/cart/submodules/hzservices.php:66
-#: ../../addon/cart/submodules/hzservices.php:650
-#: ../../addon/cart/submodules/hzservices.php:654
+#: ../../addon/cart/submodules/hzservices.php:67
+#: ../../addon/cart/submodules/hzservices.php:651
+#: ../../addon/cart/submodules/hzservices.php:655
#: ../../addon/cart/submodules/orderoptions.php:72
#: ../../addon/cart/submodules/orderoptions.php:338
#: ../../addon/cart/submodules/orderoptions.php:362
@@ -177,27 +180,37 @@ msgstr ""
#: ../../addon/libertree/Mod_Libertree.php:57
#: ../../addon/socialauth/Mod_SocialAuth.php:212
#: ../../addon/ljpost/Mod_Ljpost.php:61 ../../addon/ljpost/Mod_Ljpost.php:65
-#: ../../addon/ljpost/Mod_Ljpost.php:69 ../../include/conversation.php:1472
-#: ../../Zotlabs/Module/Import.php:571 ../../Zotlabs/Module/Import.php:575
-#: ../../Zotlabs/Module/Import.php:576 ../../Zotlabs/Module/Register.php:512
+#: ../../addon/ljpost/Mod_Ljpost.php:69 ../../include/conversation.php:1486
+#: ../../Zotlabs/Module/Import.php:600 ../../Zotlabs/Module/Import.php:604
+#: ../../Zotlabs/Module/Import.php:605 ../../Zotlabs/Module/Register.php:512
+#: ../../Zotlabs/Module/Group.php:137 ../../Zotlabs/Module/Group.php:138
+#: ../../Zotlabs/Module/Group.php:147 ../../Zotlabs/Module/Group.php:249
+#: ../../Zotlabs/Module/Group.php:301 ../../Zotlabs/Module/Group.php:302
#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:177
#: ../../Zotlabs/Module/Mitem.php:256 ../../Zotlabs/Module/Mitem.php:257
#: ../../Zotlabs/Module/Filestorage.php:203
#: ../../Zotlabs/Module/Filestorage.php:211
-#: ../../Zotlabs/Module/Admin/Site.php:319 ../../Zotlabs/Module/Api.php:99
-#: ../../Zotlabs/Module/Photos.php:673 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Settings/Channel.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:319
+#: ../../Zotlabs/Module/Permcats.php:218
+#: ../../Zotlabs/Module/Contactedit.php:284
+#: ../../Zotlabs/Module/Contactedit.php:329 ../../Zotlabs/Module/Api.php:99
+#: ../../Zotlabs/Module/Photos.php:677 ../../Zotlabs/Module/Profiles.php:675
+#: ../../Zotlabs/Module/Profiles.php:685 ../../Zotlabs/Module/Profiles.php:693
+#: ../../Zotlabs/Module/Profiles.php:697
+#: ../../Zotlabs/Module/Settings/Channel.php:219
#: ../../Zotlabs/Module/Settings/Display.php:86
+#: ../../Zotlabs/Module/Settings/Privacy.php:120
+#: ../../Zotlabs/Module/Settings/Privacy.php:121
+#: ../../Zotlabs/Module/Settings/Privacy.php:122
#: ../../Zotlabs/Module/Menu.php:163 ../../Zotlabs/Module/Menu.php:222
-#: ../../Zotlabs/Module/Defperms.php:196 ../../Zotlabs/Module/Wiki.php:224
-#: ../../Zotlabs/Module/Wiki.php:225 ../../Zotlabs/Module/Connedit.php:401
-#: ../../Zotlabs/Module/Connedit.php:781 ../../Zotlabs/Module/Sources.php:122
-#: ../../Zotlabs/Module/Sources.php:157 ../../Zotlabs/Lib/Libzotdir.php:165
-#: ../../Zotlabs/Lib/Libzotdir.php:166 ../../Zotlabs/Lib/Libzotdir.php:168
-#: ../../Zotlabs/Storage/Browser.php:310 ../../Zotlabs/Storage/Browser.php:311
-#: ../../Zotlabs/Storage/Browser.php:312 ../../Zotlabs/Storage/Browser.php:389
-#: ../../Zotlabs/Storage/Browser.php:391 ../../Zotlabs/Storage/Browser.php:552
-#: ../../boot.php:1730
+#: ../../Zotlabs/Module/Defperms.php:195 ../../Zotlabs/Module/Wiki.php:224
+#: ../../Zotlabs/Module/Wiki.php:225 ../../Zotlabs/Module/Connedit.php:622
+#: ../../Zotlabs/Module/Sources.php:122 ../../Zotlabs/Module/Sources.php:157
+#: ../../Zotlabs/Lib/Libzotdir.php:165 ../../Zotlabs/Lib/Libzotdir.php:166
+#: ../../Zotlabs/Lib/Libzotdir.php:168 ../../Zotlabs/Storage/Browser.php:310
+#: ../../Zotlabs/Storage/Browser.php:311 ../../Zotlabs/Storage/Browser.php:312
+#: ../../Zotlabs/Storage/Browser.php:389 ../../Zotlabs/Storage/Browser.php:391
+#: ../../Zotlabs/Storage/Browser.php:552 ../../boot.php:1743
msgid "No"
msgstr ""
@@ -220,9 +233,9 @@ msgstr ""
#: ../../addon/pumpio/Mod_Pumpio.php:96 ../../addon/pumpio/Mod_Pumpio.php:100
#: ../../addon/cart/submodules/subscriptions.php:153
#: ../../addon/cart/submodules/subscriptions.php:425
-#: ../../addon/cart/submodules/hzservices.php:66
-#: ../../addon/cart/submodules/hzservices.php:650
-#: ../../addon/cart/submodules/hzservices.php:654
+#: ../../addon/cart/submodules/hzservices.php:67
+#: ../../addon/cart/submodules/hzservices.php:651
+#: ../../addon/cart/submodules/hzservices.php:655
#: ../../addon/cart/submodules/orderoptions.php:72
#: ../../addon/cart/submodules/orderoptions.php:337
#: ../../addon/cart/submodules/orderoptions.php:361
@@ -242,26 +255,36 @@ msgstr ""
#: ../../addon/libertree/Mod_Libertree.php:57
#: ../../addon/socialauth/Mod_SocialAuth.php:212
#: ../../addon/ljpost/Mod_Ljpost.php:61 ../../addon/ljpost/Mod_Ljpost.php:65
-#: ../../addon/ljpost/Mod_Ljpost.php:69 ../../include/conversation.php:1472
-#: ../../Zotlabs/Module/Import.php:571 ../../Zotlabs/Module/Import.php:575
-#: ../../Zotlabs/Module/Import.php:576 ../../Zotlabs/Module/Register.php:512
+#: ../../addon/ljpost/Mod_Ljpost.php:69 ../../include/conversation.php:1486
+#: ../../Zotlabs/Module/Import.php:600 ../../Zotlabs/Module/Import.php:604
+#: ../../Zotlabs/Module/Import.php:605 ../../Zotlabs/Module/Register.php:512
+#: ../../Zotlabs/Module/Group.php:137 ../../Zotlabs/Module/Group.php:138
+#: ../../Zotlabs/Module/Group.php:147 ../../Zotlabs/Module/Group.php:249
+#: ../../Zotlabs/Module/Group.php:301 ../../Zotlabs/Module/Group.php:302
#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:177
#: ../../Zotlabs/Module/Mitem.php:256 ../../Zotlabs/Module/Mitem.php:257
#: ../../Zotlabs/Module/Filestorage.php:203
#: ../../Zotlabs/Module/Filestorage.php:211
-#: ../../Zotlabs/Module/Admin/Site.php:321 ../../Zotlabs/Module/Api.php:98
-#: ../../Zotlabs/Module/Photos.php:673 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Settings/Channel.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:321
+#: ../../Zotlabs/Module/Permcats.php:218
+#: ../../Zotlabs/Module/Contactedit.php:284 ../../Zotlabs/Module/Api.php:98
+#: ../../Zotlabs/Module/Photos.php:677 ../../Zotlabs/Module/Profiles.php:675
+#: ../../Zotlabs/Module/Profiles.php:685 ../../Zotlabs/Module/Profiles.php:693
+#: ../../Zotlabs/Module/Profiles.php:697
+#: ../../Zotlabs/Module/Settings/Channel.php:219
#: ../../Zotlabs/Module/Settings/Display.php:86
+#: ../../Zotlabs/Module/Settings/Privacy.php:120
+#: ../../Zotlabs/Module/Settings/Privacy.php:121
+#: ../../Zotlabs/Module/Settings/Privacy.php:122
#: ../../Zotlabs/Module/Menu.php:163 ../../Zotlabs/Module/Menu.php:222
-#: ../../Zotlabs/Module/Defperms.php:196 ../../Zotlabs/Module/Wiki.php:224
-#: ../../Zotlabs/Module/Wiki.php:225 ../../Zotlabs/Module/Connedit.php:401
-#: ../../Zotlabs/Module/Sources.php:122 ../../Zotlabs/Module/Sources.php:157
-#: ../../Zotlabs/Lib/Libzotdir.php:165 ../../Zotlabs/Lib/Libzotdir.php:166
-#: ../../Zotlabs/Lib/Libzotdir.php:168 ../../Zotlabs/Storage/Browser.php:310
-#: ../../Zotlabs/Storage/Browser.php:311 ../../Zotlabs/Storage/Browser.php:312
-#: ../../Zotlabs/Storage/Browser.php:389 ../../Zotlabs/Storage/Browser.php:391
-#: ../../Zotlabs/Storage/Browser.php:552 ../../boot.php:1730
+#: ../../Zotlabs/Module/Defperms.php:195 ../../Zotlabs/Module/Wiki.php:224
+#: ../../Zotlabs/Module/Wiki.php:225 ../../Zotlabs/Module/Sources.php:122
+#: ../../Zotlabs/Module/Sources.php:157 ../../Zotlabs/Lib/Libzotdir.php:165
+#: ../../Zotlabs/Lib/Libzotdir.php:166 ../../Zotlabs/Lib/Libzotdir.php:168
+#: ../../Zotlabs/Storage/Browser.php:310 ../../Zotlabs/Storage/Browser.php:311
+#: ../../Zotlabs/Storage/Browser.php:312 ../../Zotlabs/Storage/Browser.php:389
+#: ../../Zotlabs/Storage/Browser.php:391 ../../Zotlabs/Storage/Browser.php:552
+#: ../../boot.php:1743
msgid "Yes"
msgstr ""
@@ -326,7 +349,7 @@ msgid "Set shadow depth of photos"
msgstr ""
#: ../../view/theme/redbasic/php/config.php:113
-msgid "Set maximum width of content region in pixel"
+msgid "Set maximum width of content region in rem"
msgstr ""
#: ../../view/theme/redbasic/php/config.php:113
@@ -417,7 +440,7 @@ msgstr ""
#: ../../addon/channelreputation/channelreputation.php:233
#: ../../include/acl_selectors.php:156 ../../Zotlabs/Widget/Pinned.php:158
-#: ../../Zotlabs/Module/Photos.php:1273 ../../Zotlabs/Lib/ThreadItem.php:497
+#: ../../Zotlabs/Module/Photos.php:1279 ../../Zotlabs/Lib/ThreadItem.php:521
#: ../../Zotlabs/Storage/Browser.php:411
msgid "Close"
msgstr ""
@@ -456,8 +479,8 @@ msgstr ""
#: ../../addon/superblock/Mod_Superblock.php:90
#: ../../Zotlabs/Module/Tagrm.php:137 ../../Zotlabs/Module/Admin/Addons.php:459
-#: ../../Zotlabs/Module/Profile_photo.php:501
-#: ../../Zotlabs/Module/Cover_photo.php:424 ../../Zotlabs/Module/Photos.php:996
+#: ../../Zotlabs/Module/Cover_photo.php:424
+#: ../../Zotlabs/Module/Photos.php:1002
msgid "Remove"
msgstr ""
@@ -506,14 +529,14 @@ msgstr ""
msgid "Page to load after image selection."
msgstr ""
-#: ../../addon/openclipatar/openclipatar.php:58 ../../include/nav.php:112
-#: ../../include/conversation.php:1086 ../../Zotlabs/Module/Connedit.php:593
-#: ../../Zotlabs/Lib/Apps.php:347
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/nav.php:110
+#: ../../include/conversation.php:1086 ../../Zotlabs/Module/Connedit.php:480
+#: ../../Zotlabs/Lib/Apps.php:348
msgid "View Profile"
msgstr ""
-#: ../../addon/openclipatar/openclipatar.php:59 ../../include/nav.php:117
-#: ../../include/channel.php:1490
+#: ../../addon/openclipatar/openclipatar.php:59 ../../include/nav.php:115
+#: ../../include/channel.php:1534
msgid "Edit Profile"
msgstr ""
@@ -588,7 +611,7 @@ msgid "Unknown error. Please try again later."
msgstr ""
#: ../../addon/openclipatar/openclipatar.php:299
-#: ../../Zotlabs/Module/Profile_photo.php:254
+#: ../../Zotlabs/Module/Profile_photo.php:268
msgid ""
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
@@ -599,7 +622,7 @@ msgid "Profile photo updated successfully."
msgstr ""
#: ../../addon/bookmarker/bookmarker.php:38
-#: ../../Zotlabs/Lib/ThreadItem.php:474
+#: ../../Zotlabs/Lib/ThreadItem.php:498
msgid "Save Bookmarks"
msgstr ""
@@ -632,8 +655,7 @@ msgid "Queueworker Settings"
msgstr ""
#: ../../addon/queueworker/Mod_Queueworker.php:116 ../../include/text.php:1146
-#: ../../include/text.php:1158 ../../Zotlabs/Widget/Notes.php:23
-#: ../../Zotlabs/Module/Admin/Profs.php:94
+#: ../../include/text.php:1158 ../../Zotlabs/Module/Admin/Profs.php:94
#: ../../Zotlabs/Module/Admin/Profs.php:114 ../../Zotlabs/Module/Cards.php:111
#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Module/Articles.php:115
#: ../../Zotlabs/Module/Rbmark.php:31 ../../Zotlabs/Module/Rbmark.php:103
@@ -682,7 +704,7 @@ msgstr ""
msgid "Photo Gallery"
msgstr ""
-#: ../../addon/gallery/Mod_Gallery.php:49 ../../include/channel.php:1384
+#: ../../addon/gallery/Mod_Gallery.php:49 ../../include/channel.php:1427
#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editwebpage.php:32
#: ../../Zotlabs/Module/Profile.php:27 ../../Zotlabs/Module/Webpages.php:39
#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Connect.php:17
@@ -702,33 +724,33 @@ msgid ""
"Set a random planet from the Star Wars Empire as your location when posting"
msgstr ""
-#: ../../addon/openid/Mod_Id.php:53 ../../addon/mail/Mod_Mail.php:22
-#: ../../addon/pumpio/pumpio.php:44 ../../addon/keepout/keepout.php:36
-#: ../../include/photos.php:30 ../../include/items.php:3744
-#: ../../include/attach.php:156 ../../include/attach.php:205
-#: ../../include/attach.php:278 ../../include/attach.php:329
-#: ../../include/attach.php:424 ../../include/attach.php:438
-#: ../../include/attach.php:445 ../../include/attach.php:527
-#: ../../include/attach.php:1096 ../../include/attach.php:1169
-#: ../../include/attach.php:1332 ../../Zotlabs/Module/Article_edit.php:51
+#: ../../addon/openid/Mod_Id.php:53 ../../addon/pumpio/pumpio.php:44
+#: ../../addon/keepout/keepout.php:36 ../../include/photos.php:30
+#: ../../include/items.php:3881 ../../include/attach.php:156
+#: ../../include/attach.php:205 ../../include/attach.php:278
+#: ../../include/attach.php:329 ../../include/attach.php:424
+#: ../../include/attach.php:438 ../../include/attach.php:445
+#: ../../include/attach.php:527 ../../include/attach.php:1096
+#: ../../include/attach.php:1169 ../../include/attach.php:1332
+#: ../../Zotlabs/Module/Article_edit.php:51
#: ../../Zotlabs/Module/Attach_edit.php:90
#: ../../Zotlabs/Module/Attach_edit.php:99
-#: ../../Zotlabs/Module/Attach_edit.php:106 ../../Zotlabs/Module/Network.php:19
+#: ../../Zotlabs/Module/Attach_edit.php:106 ../../Zotlabs/Module/Network.php:18
#: ../../Zotlabs/Module/Register.php:200 ../../Zotlabs/Module/Setup.php:208
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Channel.php:223 ../../Zotlabs/Module/Channel.php:379
-#: ../../Zotlabs/Module/Channel.php:418 ../../Zotlabs/Module/Group.php:15
-#: ../../Zotlabs/Module/Group.php:31 ../../Zotlabs/Module/Card_edit.php:51
+#: ../../Zotlabs/Module/Channel.php:220 ../../Zotlabs/Module/Channel.php:376
+#: ../../Zotlabs/Module/Channel.php:415 ../../Zotlabs/Module/Group.php:14
+#: ../../Zotlabs/Module/Group.php:30 ../../Zotlabs/Module/Card_edit.php:51
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:107
#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Chat.php:111
#: ../../Zotlabs/Module/Chat.php:116
#: ../../Zotlabs/Module/Channel_calendar.php:232
-#: ../../Zotlabs/Module/Like.php:242 ../../Zotlabs/Module/Poke.php:157
-#: ../../Zotlabs/Module/Item.php:507 ../../Zotlabs/Module/Item.php:526
-#: ../../Zotlabs/Module/Item.php:536 ../../Zotlabs/Module/Item.php:1451
+#: ../../Zotlabs/Module/Like.php:248 ../../Zotlabs/Module/Poke.php:157
+#: ../../Zotlabs/Module/Item.php:501 ../../Zotlabs/Module/Item.php:520
+#: ../../Zotlabs/Module/Item.php:530 ../../Zotlabs/Module/Item.php:1445
#: ../../Zotlabs/Module/Mitem.php:129 ../../Zotlabs/Module/Profile.php:99
#: ../../Zotlabs/Module/Profile.php:114
#: ../../Zotlabs/Module/Sharedwithme.php:19
@@ -741,15 +763,15 @@ msgstr ""
#: ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Manage.php:10
#: ../../Zotlabs/Module/Authtest.php:13 ../../Zotlabs/Module/Viewsrc.php:19
-#: ../../Zotlabs/Module/Moderate.php:15 ../../Zotlabs/Module/Display.php:421
+#: ../../Zotlabs/Module/Moderate.php:15 ../../Zotlabs/Module/Display.php:424
#: ../../Zotlabs/Module/Common.php:38 ../../Zotlabs/Module/New_channel.php:105
#: ../../Zotlabs/Module/New_channel.php:130
#: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Mood.php:126
-#: ../../Zotlabs/Module/Appman.php:91 ../../Zotlabs/Module/Cards.php:84
+#: ../../Zotlabs/Module/Appman.php:153 ../../Zotlabs/Module/Cards.php:84
#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Regmod.php:20
#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
-#: ../../Zotlabs/Module/Vote.php:19 ../../Zotlabs/Module/Profile_photo.php:338
-#: ../../Zotlabs/Module/Profile_photo.php:351
+#: ../../Zotlabs/Module/Vote.php:19 ../../Zotlabs/Module/Profile_photo.php:390
+#: ../../Zotlabs/Module/Profile_photo.php:417
#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Settings.php:58
#: ../../Zotlabs/Module/Editlayout.php:67
#: ../../Zotlabs/Module/Editlayout.php:90
@@ -757,16 +779,16 @@ msgstr ""
#: ../../Zotlabs/Module/Cover_photo.php:341
#: ../../Zotlabs/Module/Cover_photo.php:354 ../../Zotlabs/Module/Photos.php:71
#: ../../Zotlabs/Module/Page.php:34 ../../Zotlabs/Module/Page.php:133
-#: ../../Zotlabs/Module/Profiles.php:200 ../../Zotlabs/Module/Profiles.php:636
+#: ../../Zotlabs/Module/Profiles.php:171 ../../Zotlabs/Module/Profiles.php:614
#: ../../Zotlabs/Module/Articles.php:87 ../../Zotlabs/Module/Bookmarks.php:70
#: ../../Zotlabs/Module/Invite.php:51 ../../Zotlabs/Module/Invite.php:302
#: ../../Zotlabs/Module/Block.php:24 ../../Zotlabs/Module/Block.php:74
#: ../../Zotlabs/Module/Menu.php:130 ../../Zotlabs/Module/Menu.php:141
-#: ../../Zotlabs/Module/Defperms.php:182 ../../Zotlabs/Module/Thing.php:282
+#: ../../Zotlabs/Module/Defperms.php:181 ../../Zotlabs/Module/Thing.php:282
#: ../../Zotlabs/Module/Thing.php:302 ../../Zotlabs/Module/Thing.php:343
#: ../../Zotlabs/Module/Pdledit.php:35 ../../Zotlabs/Module/Wiki.php:57
#: ../../Zotlabs/Module/Wiki.php:282 ../../Zotlabs/Module/Wiki.php:425
-#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Module/Connedit.php:394
+#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Module/Connedit.php:299
#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Locs.php:98
#: ../../Zotlabs/Module/Sources.php:80 ../../Zotlabs/Lib/Chatroom.php:135
@@ -774,26 +796,26 @@ msgstr ""
msgid "Permission denied."
msgstr ""
-#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:60
-#: ../../include/selectors.php:77 ../../include/channel.php:1670
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:64
+#: ../../include/selectors.php:81 ../../include/channel.php:1715
msgid "Male"
msgstr ""
-#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:60
-#: ../../include/selectors.php:77 ../../include/channel.php:1668
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:64
+#: ../../include/selectors.php:81 ../../include/channel.php:1713
msgid "Female"
msgstr ""
-#: ../../addon/openid/Mod_Openid.php:30
+#: ../../addon/openid/Mod_Openid.php:32
msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../addon/openid/Mod_Openid.php:76 ../../addon/openid/Mod_Openid.php:178
+#: ../../addon/openid/Mod_Openid.php:78 ../../addon/openid/Mod_Openid.php:179
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:320
+#: ../../addon/openid/Mod_Openid.php:189 ../../include/auth.php:320
msgid "Login failed."
msgstr ""
@@ -816,7 +838,7 @@ msgid "Last Name"
msgstr ""
#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/Mod_Redred.php:73
-#: ../../boot.php:1719
+#: ../../boot.php:1732
msgid "Nickname"
msgstr ""
@@ -830,13 +852,13 @@ msgstr ""
#: ../../Zotlabs/Module/Cdav.php:1376
#: ../../Zotlabs/Module/Admin/Accounts.php:316
#: ../../Zotlabs/Module/Admin/Accounts.php:330
-#: ../../Zotlabs/Module/Profiles.php:788 ../../Zotlabs/Module/Connedit.php:912
+#: ../../Zotlabs/Module/Profiles.php:803 ../../Zotlabs/Module/Connedit.php:736
msgid "Email"
msgstr ""
#: ../../addon/openid/MysqlProvider.php:58
#: ../../addon/openid/MysqlProvider.php:59
-#: ../../addon/openid/MysqlProvider.php:60 ../../Zotlabs/Lib/Apps.php:364
+#: ../../addon/openid/MysqlProvider.php:60 ../../Zotlabs/Lib/Apps.php:365
msgid "Profile Photo"
msgstr ""
@@ -869,11 +891,11 @@ msgid "Timezone"
msgstr ""
#: ../../addon/openid/MysqlProvider.php:68
-#: ../../Zotlabs/Module/Profiles.php:768
+#: ../../Zotlabs/Module/Profiles.php:783
msgid "Homepage URL"
msgstr ""
-#: ../../addon/openid/MysqlProvider.php:69 ../../Zotlabs/Lib/Apps.php:362
+#: ../../addon/openid/MysqlProvider.php:69 ../../Zotlabs/Lib/Apps.php:363
msgid "Language"
msgstr ""
@@ -894,7 +916,7 @@ msgid "Birthdate"
msgstr ""
#: ../../addon/openid/MysqlProvider.php:74
-#: ../../Zotlabs/Module/Profiles.php:488
+#: ../../Zotlabs/Module/Profiles.php:457
msgid "Gender"
msgstr ""
@@ -1049,7 +1071,7 @@ msgstr ""
msgid "Channel is required."
msgstr ""
-#: ../../addon/redred/Mod_Redred.php:29 ../../Zotlabs/Module/Network.php:326
+#: ../../addon/redred/Mod_Redred.php:29 ../../Zotlabs/Module/Network.php:325
msgid "Invalid channel."
msgstr ""
@@ -1095,9 +1117,9 @@ msgstr ""
#: ../../addon/redphotos/redphotos.php:119
#: ../../addon/redfiles/redfiles.php:109 ../../addon/hzfiles/hzfiles.php:75
-#: ../../include/items.php:440 ../../Zotlabs/Module/Import_items.php:120
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Group.php:95
-#: ../../Zotlabs/Module/Like.php:342 ../../Zotlabs/Module/Cloud.php:123
+#: ../../include/items.php:440 ../../Zotlabs/Module/Import_items.php:116
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Group.php:108
+#: ../../Zotlabs/Module/Like.php:348 ../../Zotlabs/Module/Cloud.php:123
#: ../../Zotlabs/Module/Share.php:72 ../../Zotlabs/Module/Subthread.php:89
#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:55
#: ../../Zotlabs/Web/WebServer.php:115
@@ -1143,11 +1165,11 @@ msgstr ""
msgid "0 or blank to import all available"
msgstr ""
-#: ../../addon/redphotos/redphotohelper.php:71 ../../addon/pubcrawl/as.php:1937
-#: ../../addon/diaspora/Receiver.php:1626 ../../include/text.php:2251
-#: ../../include/conversation.php:128 ../../Zotlabs/Module/Like.php:439
+#: ../../addon/redphotos/redphotohelper.php:71 ../../addon/pubcrawl/as.php:1943
+#: ../../addon/diaspora/Receiver.php:1629 ../../include/text.php:2302
+#: ../../include/conversation.php:128 ../../Zotlabs/Module/Like.php:445
#: ../../Zotlabs/Module/Tagger.php:71 ../../Zotlabs/Module/Subthread.php:115
-#: ../../Zotlabs/Lib/Activity.php:3301
+#: ../../Zotlabs/Lib/Activity.php:3391
msgid "photo"
msgstr ""
@@ -1397,7 +1419,7 @@ msgid "Files imported"
msgstr ""
#: ../../addon/content_import/Mod_content_import.php:134
-#: ../../Zotlabs/Lib/Apps.php:335
+#: ../../Zotlabs/Lib/Apps.php:336
msgid "Content Import"
msgstr ""
@@ -1438,139 +1460,139 @@ msgstr ""
msgid "Until modified date yyyy-mm-dd"
msgstr ""
-#: ../../addon/hsse/hsse.php:82 ../../include/conversation.php:1335
+#: ../../addon/hsse/hsse.php:82 ../../include/conversation.php:1349
msgid "Set your location"
msgstr ""
-#: ../../addon/hsse/hsse.php:83 ../../include/conversation.php:1336
+#: ../../addon/hsse/hsse.php:83 ../../include/conversation.php:1350
msgid "Clear browser location"
msgstr ""
-#: ../../addon/hsse/hsse.php:95 ../../addon/mail/Mod_Mail.php:205
-#: ../../include/conversation.php:1348 ../../Zotlabs/Module/Article_edit.php:99
+#: ../../addon/hsse/hsse.php:95 ../../include/conversation.php:1362
+#: ../../Zotlabs/Module/Article_edit.php:99
#: ../../Zotlabs/Module/Card_edit.php:101
#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Chat.php:218
#: ../../Zotlabs/Module/Editblock.php:116
msgid "Insert web link"
msgstr ""
-#: ../../addon/hsse/hsse.php:99 ../../include/conversation.php:1352
+#: ../../addon/hsse/hsse.php:99 ../../include/conversation.php:1366
msgid "Embed (existing) photo from your photo albums"
msgstr ""
-#: ../../addon/hsse/hsse.php:134 ../../addon/mail/Mod_Mail.php:135
-#: ../../include/conversation.php:1385 ../../Zotlabs/Module/Chat.php:216
+#: ../../addon/hsse/hsse.php:134 ../../include/conversation.php:1399
+#: ../../Zotlabs/Module/Chat.php:216
msgid "Please enter a link URL:"
msgstr ""
-#: ../../addon/hsse/hsse.php:135 ../../include/conversation.php:1386
+#: ../../addon/hsse/hsse.php:135 ../../include/conversation.php:1400
msgid "Tag term:"
msgstr ""
-#: ../../addon/hsse/hsse.php:136 ../../include/conversation.php:1387
+#: ../../addon/hsse/hsse.php:136 ../../include/conversation.php:1401
msgid "Where are you right now?"
msgstr ""
-#: ../../addon/hsse/hsse.php:139 ../../include/conversation.php:1390
-#: ../../Zotlabs/Module/Profile_photo.php:509
+#: ../../addon/hsse/hsse.php:139 ../../include/conversation.php:1404
+#: ../../Zotlabs/Module/Profile_photo.php:551
#: ../../Zotlabs/Module/Cover_photo.php:430 ../../Zotlabs/Module/Wiki.php:400
msgid "Choose images to embed"
msgstr ""
-#: ../../addon/hsse/hsse.php:140 ../../include/conversation.php:1391
-#: ../../Zotlabs/Module/Profile_photo.php:510
+#: ../../addon/hsse/hsse.php:140 ../../include/conversation.php:1405
+#: ../../Zotlabs/Module/Profile_photo.php:552
#: ../../Zotlabs/Module/Cover_photo.php:431 ../../Zotlabs/Module/Wiki.php:401
msgid "Choose an album"
msgstr ""
-#: ../../addon/hsse/hsse.php:141 ../../include/conversation.php:1392
+#: ../../addon/hsse/hsse.php:141 ../../include/conversation.php:1406
msgid "Choose a different album..."
msgstr ""
-#: ../../addon/hsse/hsse.php:142 ../../include/conversation.php:1393
-#: ../../Zotlabs/Module/Profile_photo.php:512
+#: ../../addon/hsse/hsse.php:142 ../../include/conversation.php:1407
+#: ../../Zotlabs/Module/Profile_photo.php:554
#: ../../Zotlabs/Module/Cover_photo.php:433 ../../Zotlabs/Module/Wiki.php:403
msgid "Error getting album list"
msgstr ""
-#: ../../addon/hsse/hsse.php:143 ../../include/conversation.php:1394
-#: ../../Zotlabs/Module/Profile_photo.php:513
+#: ../../addon/hsse/hsse.php:143 ../../include/conversation.php:1408
+#: ../../Zotlabs/Module/Profile_photo.php:555
#: ../../Zotlabs/Module/Cover_photo.php:434 ../../Zotlabs/Module/Wiki.php:404
msgid "Error getting photo link"
msgstr ""
-#: ../../addon/hsse/hsse.php:144 ../../include/conversation.php:1395
-#: ../../Zotlabs/Module/Profile_photo.php:514
+#: ../../addon/hsse/hsse.php:144 ../../include/conversation.php:1409
+#: ../../Zotlabs/Module/Profile_photo.php:556
#: ../../Zotlabs/Module/Cover_photo.php:435 ../../Zotlabs/Module/Wiki.php:405
msgid "Error getting album"
msgstr ""
-#: ../../addon/hsse/hsse.php:145 ../../include/conversation.php:1396
+#: ../../addon/hsse/hsse.php:145 ../../include/conversation.php:1410
msgid "Comments enabled"
msgstr ""
-#: ../../addon/hsse/hsse.php:146 ../../include/conversation.php:1397
+#: ../../addon/hsse/hsse.php:146 ../../include/conversation.php:1411
msgid "Comments disabled"
msgstr ""
-#: ../../addon/hsse/hsse.php:153 ../../include/conversation.php:1408
-#: ../../Zotlabs/Module/Webpages.php:259 ../../Zotlabs/Module/Photos.php:1099
-#: ../../Zotlabs/Lib/ThreadItem.php:837
+#: ../../addon/hsse/hsse.php:153 ../../include/conversation.php:1422
+#: ../../Zotlabs/Module/Webpages.php:259 ../../Zotlabs/Module/Photos.php:1105
+#: ../../Zotlabs/Lib/ThreadItem.php:861
msgid "Preview"
msgstr ""
-#: ../../addon/hsse/hsse.php:186 ../../include/conversation.php:1441
+#: ../../addon/hsse/hsse.php:186 ../../include/conversation.php:1455
#: ../../Zotlabs/Widget/Cdav.php:136 ../../Zotlabs/Module/Webpages.php:253
-#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1078
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1084
#: ../../Zotlabs/Module/Wiki.php:298 ../../Zotlabs/Module/Layouts.php:194
msgid "Share"
msgstr ""
-#: ../../addon/hsse/hsse.php:195 ../../include/conversation.php:1450
+#: ../../addon/hsse/hsse.php:195 ../../include/conversation.php:1464
msgid "Page link name"
msgstr ""
-#: ../../addon/hsse/hsse.php:198 ../../include/conversation.php:1453
+#: ../../addon/hsse/hsse.php:198 ../../include/conversation.php:1467
msgid "Post as"
msgstr ""
-#: ../../addon/hsse/hsse.php:200 ../../include/conversation.php:1455
-#: ../../Zotlabs/Lib/ThreadItem.php:828
+#: ../../addon/hsse/hsse.php:200 ../../include/conversation.php:1469
+#: ../../Zotlabs/Lib/ThreadItem.php:852
msgid "Bold"
msgstr ""
-#: ../../addon/hsse/hsse.php:201 ../../include/conversation.php:1456
-#: ../../Zotlabs/Lib/ThreadItem.php:829
+#: ../../addon/hsse/hsse.php:201 ../../include/conversation.php:1470
+#: ../../Zotlabs/Lib/ThreadItem.php:853
msgid "Italic"
msgstr ""
-#: ../../addon/hsse/hsse.php:202 ../../include/conversation.php:1457
-#: ../../Zotlabs/Lib/ThreadItem.php:830
+#: ../../addon/hsse/hsse.php:202 ../../include/conversation.php:1471
+#: ../../Zotlabs/Lib/ThreadItem.php:854
msgid "Underline"
msgstr ""
-#: ../../addon/hsse/hsse.php:203 ../../include/conversation.php:1458
-#: ../../Zotlabs/Lib/ThreadItem.php:831
+#: ../../addon/hsse/hsse.php:203 ../../include/conversation.php:1472
+#: ../../Zotlabs/Lib/ThreadItem.php:855
msgid "Quote"
msgstr ""
-#: ../../addon/hsse/hsse.php:204 ../../include/conversation.php:1459
-#: ../../Zotlabs/Lib/ThreadItem.php:832
+#: ../../addon/hsse/hsse.php:204 ../../include/conversation.php:1473
+#: ../../Zotlabs/Lib/ThreadItem.php:856
msgid "Code"
msgstr ""
-#: ../../addon/hsse/hsse.php:205 ../../include/conversation.php:1460
-#: ../../Zotlabs/Lib/ThreadItem.php:834
+#: ../../addon/hsse/hsse.php:205 ../../include/conversation.php:1474
+#: ../../Zotlabs/Lib/ThreadItem.php:858
msgid "Attach/Upload file"
msgstr ""
-#: ../../addon/hsse/hsse.php:208 ../../include/conversation.php:1463
+#: ../../addon/hsse/hsse.php:208 ../../include/conversation.php:1477
#: ../../Zotlabs/Module/Wiki.php:397
msgid "Embed an image from your albums"
msgstr ""
#: ../../addon/hsse/hsse.php:209 ../../addon/hsse/hsse.php:258
-#: ../../include/conversation.php:1464 ../../include/conversation.php:1519
+#: ../../include/conversation.php:1478 ../../include/conversation.php:1533
#: ../../Zotlabs/Module/Article_edit.php:130
#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
#: ../../Zotlabs/Module/Card_edit.php:132 ../../Zotlabs/Module/Oauth.php:110
@@ -1579,68 +1601,66 @@ msgstr ""
#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
#: ../../Zotlabs/Module/Editpost.php:111
#: ../../Zotlabs/Module/Admin/Addons.php:427
-#: ../../Zotlabs/Module/Profile_photo.php:507
+#: ../../Zotlabs/Module/Profile_photo.php:549
#: ../../Zotlabs/Module/Editblock.php:141 ../../Zotlabs/Module/Filer.php:56
#: ../../Zotlabs/Module/Editlayout.php:140
#: ../../Zotlabs/Module/Cover_photo.php:428
-#: ../../Zotlabs/Module/Profiles.php:802 ../../Zotlabs/Module/Oauth2.php:115
+#: ../../Zotlabs/Module/Profiles.php:817 ../../Zotlabs/Module/Oauth2.php:115
#: ../../Zotlabs/Module/Oauth2.php:143 ../../Zotlabs/Module/Wiki.php:365
-#: ../../Zotlabs/Module/Wiki.php:398 ../../Zotlabs/Module/Connedit.php:926
+#: ../../Zotlabs/Module/Wiki.php:398 ../../Zotlabs/Module/Connedit.php:750
#: ../../Zotlabs/Storage/Browser.php:383
msgid "Cancel"
msgstr ""
#: ../../addon/hsse/hsse.php:210 ../../addon/hsse/hsse.php:257
-#: ../../include/conversation.php:1465 ../../include/conversation.php:1518
-#: ../../Zotlabs/Module/Profile_photo.php:508
+#: ../../include/conversation.php:1479 ../../include/conversation.php:1532
+#: ../../Zotlabs/Module/Profile_photo.php:550
#: ../../Zotlabs/Module/Cover_photo.php:429 ../../Zotlabs/Module/Wiki.php:399
msgid "OK"
msgstr ""
-#: ../../addon/hsse/hsse.php:212 ../../include/conversation.php:1467
+#: ../../addon/hsse/hsse.php:212 ../../include/conversation.php:1481
msgid "Toggle voting"
msgstr ""
-#: ../../addon/hsse/hsse.php:215 ../../include/conversation.php:1474
+#: ../../addon/hsse/hsse.php:215 ../../include/conversation.php:1488
msgid "Disable comments"
msgstr ""
-#: ../../addon/hsse/hsse.php:216 ../../include/conversation.php:1475
+#: ../../addon/hsse/hsse.php:216 ../../include/conversation.php:1489
msgid "Toggle comments"
msgstr ""
-#: ../../addon/hsse/hsse.php:221 ../../include/conversation.php:1481
+#: ../../addon/hsse/hsse.php:221 ../../include/conversation.php:1495
#: ../../Zotlabs/Module/Article_edit.php:116
#: ../../Zotlabs/Module/Card_edit.php:118
-#: ../../Zotlabs/Module/Editblock.php:129 ../../Zotlabs/Module/Photos.php:674
-#: ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Editblock.php:129 ../../Zotlabs/Module/Photos.php:678
+#: ../../Zotlabs/Module/Photos.php:1050
msgid "Title (optional)"
msgstr ""
-#: ../../addon/hsse/hsse.php:224 ../../include/conversation.php:1485
+#: ../../addon/hsse/hsse.php:224 ../../include/conversation.php:1499
msgid "Categories (optional, comma-separated list)"
msgstr ""
-#: ../../addon/hsse/hsse.php:225 ../../include/conversation.php:1486
+#: ../../addon/hsse/hsse.php:225 ../../include/conversation.php:1500
msgid "Permission settings"
msgstr ""
-#: ../../addon/hsse/hsse.php:247 ../../include/conversation.php:1508
+#: ../../addon/hsse/hsse.php:247 ../../include/conversation.php:1522
msgid "Other networks and post services"
msgstr ""
-#: ../../addon/hsse/hsse.php:250 ../../addon/mail/Mod_Mail.php:209
-#: ../../include/conversation.php:1511
+#: ../../addon/hsse/hsse.php:250 ../../include/conversation.php:1525
msgid "Set expiration date"
msgstr ""
-#: ../../addon/hsse/hsse.php:253 ../../include/conversation.php:1514
+#: ../../addon/hsse/hsse.php:253 ../../include/conversation.php:1528
msgid "Set publish date"
msgstr ""
-#: ../../addon/hsse/hsse.php:255 ../../addon/mail/Mod_Mail.php:211
-#: ../../include/conversation.php:1516 ../../Zotlabs/Module/Chat.php:217
-#: ../../Zotlabs/Lib/ThreadItem.php:841
+#: ../../addon/hsse/hsse.php:255 ../../include/conversation.php:1530
+#: ../../Zotlabs/Module/Chat.php:217 ../../Zotlabs/Lib/ThreadItem.php:865
msgid "Encrypt text"
msgstr ""
@@ -1699,10 +1719,10 @@ msgstr ""
#: ../../addon/openstreetmap/openstreetmap.php:171
#: ../../addon/rendezvous/rendezvous.php:82 ../../addon/twitter/twitter.php:493
-#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/diaspora/diaspora.php:102
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/diaspora/diaspora.php:104
#: ../../addon/piwik/piwik.php:116 ../../addon/logrot/logrot.php:54
-#: ../../addon/xmpp/xmpp.php:54 ../../Zotlabs/Module/Settings/Channel.php:267
-#: ../../Zotlabs/Module/Defperms.php:112
+#: ../../addon/xmpp/xmpp.php:54 ../../Zotlabs/Module/Settings/Channel.php:146
+#: ../../Zotlabs/Module/Defperms.php:111
msgid "Settings updated."
msgstr ""
@@ -1759,26 +1779,26 @@ msgstr ""
msgid "Enter some text"
msgstr ""
-#: ../../addon/pubcrawl/as.php:1340 ../../addon/pubcrawl/as.php:1775
-#: ../../addon/pubcrawl/as.php:1983 ../../include/network.php:1742
-#: ../../Zotlabs/Lib/Activity.php:3151 ../../Zotlabs/Lib/Activity.php:3343
+#: ../../addon/pubcrawl/as.php:1332 ../../addon/pubcrawl/as.php:1776
+#: ../../addon/pubcrawl/as.php:1987 ../../include/network.php:1742
+#: ../../Zotlabs/Lib/Activity.php:3241 ../../Zotlabs/Lib/Activity.php:3433
msgid "ActivityPub"
msgstr ""
-#: ../../addon/pubcrawl/as.php:1937 ../../addon/diaspora/Receiver.php:1626
-#: ../../Zotlabs/Module/Like.php:439 ../../Zotlabs/Module/Subthread.php:115
+#: ../../addon/pubcrawl/as.php:1943 ../../addon/diaspora/Receiver.php:1629
+#: ../../Zotlabs/Module/Like.php:445 ../../Zotlabs/Module/Subthread.php:115
msgid "status"
msgstr ""
-#: ../../addon/pubcrawl/as.php:1974 ../../addon/diaspora/Receiver.php:1572
-#: ../../include/conversation.php:174 ../../Zotlabs/Module/Like.php:471
-#: ../../Zotlabs/Lib/Activity.php:3334
+#: ../../addon/pubcrawl/as.php:1978 ../../addon/diaspora/Receiver.php:1575
+#: ../../include/conversation.php:174 ../../Zotlabs/Module/Like.php:477
+#: ../../Zotlabs/Lib/Activity.php:3424
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../addon/pubcrawl/as.php:1976 ../../include/conversation.php:177
-#: ../../Zotlabs/Module/Like.php:473 ../../Zotlabs/Lib/Activity.php:3336
+#: ../../addon/pubcrawl/as.php:1980 ../../include/conversation.php:177
+#: ../../Zotlabs/Module/Like.php:479 ../../Zotlabs/Lib/Activity.php:3426
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
@@ -2056,21 +2076,21 @@ msgstr ""
#: ../../addon/rendezvous/rendezvous.php:172
#: ../../Zotlabs/Widget/Wiki_page_history.php:22
-#: ../../Zotlabs/Module/Group.php:153 ../../Zotlabs/Module/Oauth.php:111
-#: ../../Zotlabs/Module/Oauth.php:137 ../../Zotlabs/Module/Chat.php:255
-#: ../../Zotlabs/Module/Cdav.php:1372 ../../Zotlabs/Module/Sharedwithme.php:106
+#: ../../Zotlabs/Module/Oauth.php:111 ../../Zotlabs/Module/Oauth.php:137
+#: ../../Zotlabs/Module/Chat.php:255 ../../Zotlabs/Module/Cdav.php:1372
+#: ../../Zotlabs/Module/Sharedwithme.php:106
#: ../../Zotlabs/Module/Admin/Channels.php:159
#: ../../Zotlabs/Module/Oauth2.php:116 ../../Zotlabs/Module/Oauth2.php:144
-#: ../../Zotlabs/Module/Wiki.php:215 ../../Zotlabs/Module/Connedit.php:908
-#: ../../Zotlabs/Lib/NativeWikiPage.php:576
+#: ../../Zotlabs/Module/Wiki.php:215 ../../Zotlabs/Module/Connedit.php:732
+#: ../../Zotlabs/Lib/NativeWikiPage.php:582
#: ../../Zotlabs/Storage/Browser.php:377
msgid "Name"
msgstr ""
#: ../../addon/rendezvous/rendezvous.php:173
-#: ../../addon/cart/submodules/hzservices.php:656
+#: ../../addon/cart/submodules/hzservices.php:657
#: ../../addon/cart/submodules/manualcat.php:260
-#: ../../Zotlabs/Module/Cdav.php:1013 ../../Zotlabs/Module/Appman.php:149
+#: ../../Zotlabs/Module/Cdav.php:1013 ../../Zotlabs/Module/Appman.php:211
#: ../../Zotlabs/Module/Rbmark.php:100
msgid "Description"
msgstr ""
@@ -2169,78 +2189,6 @@ msgstr ""
msgid "Startpage"
msgstr ""
-#: ../../addon/mail/Mod_Mail.php:36
-msgid "Messages"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:48
-msgid "message"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:75
-msgid "Conversation removed."
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:136
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:166 ../../Zotlabs/Module/Wiki.php:209
-#: ../../Zotlabs/Storage/Browser.php:404
-msgid "Download"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:167
-msgid "Delete message"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:168
-msgid "Delivery report"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:169
-msgid "Recall message"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:171
-msgid "Message has been recalled."
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:189
-msgid "Delete Conversation"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:191
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:195
-msgid "Send Reply"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:196
-msgid "To:"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:198 ../../Zotlabs/Module/Invite.php:541
-msgid "Subject:"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:200
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:204
-msgid "Attach file"
-msgstr ""
-
-#: ../../addon/mail/Mod_Mail.php:401 ../../include/text.php:1842
-msgid "Download binary/encrypted content"
-msgstr ""
-
#: ../../addon/adultphotoflag/adultphotoflag.php:24
msgid "Flag Adult Photos"
msgstr ""
@@ -2469,7 +2417,7 @@ msgid "Send ZID"
msgstr ""
#: ../../addon/cart/widgets/catalogitem.php:57
-#: ../../addon/cart/submodules/hzservices.php:659
+#: ../../addon/cart/submodules/hzservices.php:660
#: ../../addon/cart/submodules/manualcat.php:263
msgid "Price"
msgstr ""
@@ -2546,72 +2494,72 @@ msgstr ""
msgid "Term"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:64
+#: ../../addon/cart/submodules/hzservices.php:65
msgid "Enable Hubzilla Services Module"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:163
+#: ../../addon/cart/submodules/hzservices.php:164
#: ../../addon/cart/submodules/manualcat.php:172
msgid "New Sku"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:198
+#: ../../addon/cart/submodules/hzservices.php:199
#: ../../addon/cart/submodules/manualcat.php:208
msgid "Cannot save edits to locked item."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:247
-#: ../../addon/cart/submodules/hzservices.php:334
+#: ../../addon/cart/submodules/hzservices.php:248
+#: ../../addon/cart/submodules/hzservices.php:335
msgid "SKU not found."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:300
-#: ../../addon/cart/submodules/hzservices.php:304
+#: ../../addon/cart/submodules/hzservices.php:301
+#: ../../addon/cart/submodules/hzservices.php:305
msgid "Invalid Activation Directive."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:375
-#: ../../addon/cart/submodules/hzservices.php:379
+#: ../../addon/cart/submodules/hzservices.php:376
+#: ../../addon/cart/submodules/hzservices.php:380
msgid "Invalid Deactivation Directive."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:565
+#: ../../addon/cart/submodules/hzservices.php:566
msgid "Add to this privacy group"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:581
+#: ../../addon/cart/submodules/hzservices.php:582
msgid "Set user service class"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:608
+#: ../../addon/cart/submodules/hzservices.php:609
msgid "You must be using a local account to purchase this service."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:648
+#: ../../addon/cart/submodules/hzservices.php:649
#: ../../addon/cart/submodules/manualcat.php:252
msgid "Changes Locked"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:652
+#: ../../addon/cart/submodules/hzservices.php:653
#: ../../addon/cart/submodules/manualcat.php:256
msgid "Item available for purchase."
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:662
+#: ../../addon/cart/submodules/hzservices.php:663
#: ../../addon/cart/submodules/manualcat.php:266
msgid "Photo URL"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:666
+#: ../../addon/cart/submodules/hzservices.php:667
msgid "Add buyer to privacy group"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:671
+#: ../../addon/cart/submodules/hzservices.php:672
msgid "Add buyer as connection"
msgstr ""
-#: ../../addon/cart/submodules/hzservices.php:679
-#: ../../addon/cart/submodules/hzservices.php:721
+#: ../../addon/cart/submodules/hzservices.php:680
+#: ../../addon/cart/submodules/hzservices.php:722
msgid "Set Service Class"
msgstr ""
@@ -2631,9 +2579,9 @@ msgstr ""
#: ../../addon/cart/submodules/orderoptions.php:434
#: ../../addon/cart/submodules/orderoptions.php:458
#: ../../include/js_strings.php:123 ../../include/datetime.php:211
-#: ../../Zotlabs/Module/Register.php:498 ../../Zotlabs/Module/Appman.php:147
-#: ../../Zotlabs/Module/Appman.php:148 ../../Zotlabs/Module/Profiles.php:746
-#: ../../Zotlabs/Module/Profiles.php:750
+#: ../../Zotlabs/Module/Register.php:498 ../../Zotlabs/Module/Appman.php:209
+#: ../../Zotlabs/Module/Appman.php:210 ../../Zotlabs/Module/Profiles.php:761
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Required"
msgstr ""
@@ -2815,24 +2763,24 @@ msgstr ""
msgid "This will import all your Redmatrix cloud files to this channel."
msgstr ""
-#: ../../addon/diaspora/diaspora.php:75
+#: ../../addon/diaspora/diaspora.php:77
msgid ""
"Please install the statistics addon to be able to configure a diaspora relay"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:85
+#: ../../addon/diaspora/diaspora.php:87
msgid "Diaspora Relay Handle"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:85
+#: ../../addon/diaspora/diaspora.php:87
msgid "Address of a diaspora relay. Example: relay@diasporarelay.tld"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:105
+#: ../../addon/diaspora/diaspora.php:107
msgid "Diaspora relay could not be imported"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:999
+#: ../../addon/diaspora/diaspora.php:1027
msgid "No subject"
msgstr ""
@@ -2841,16 +2789,15 @@ msgstr ""
msgid "$projectname"
msgstr ""
-#: ../../addon/diaspora/import_diaspora.php:19
+#: ../../addon/diaspora/import_diaspora.php:18
msgid "No username found in import file."
msgstr ""
-#: ../../addon/diaspora/import_diaspora.php:44 ../../include/import.php:76
+#: ../../addon/diaspora/import_diaspora.php:43 ../../include/import.php:77
msgid "Unable to create a unique channel address. Import failed."
msgstr ""
-#: ../../addon/diaspora/import_diaspora.php:142
-#: ../../Zotlabs/Module/Import.php:530
+#: ../../addon/diaspora/import_diaspora.php:140
msgid "Import completed."
msgstr ""
@@ -2891,22 +2838,22 @@ msgstr ""
msgid "Diaspora Protocol"
msgstr ""
-#: ../../addon/diaspora/Receiver.php:1576
+#: ../../addon/diaspora/Receiver.php:1579
#, php-format
msgid "%1$s dislikes %2$s's %3$s"
msgstr ""
-#: ../../addon/diaspora/Receiver.php:2205 ../../Zotlabs/Module/Like.php:481
+#: ../../addon/diaspora/Receiver.php:2208 ../../Zotlabs/Module/Like.php:487
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr ""
-#: ../../addon/diaspora/Receiver.php:2207 ../../Zotlabs/Module/Like.php:483
+#: ../../addon/diaspora/Receiver.php:2210 ../../Zotlabs/Module/Like.php:489
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
-#: ../../addon/diaspora/Receiver.php:2209 ../../Zotlabs/Module/Like.php:485
+#: ../../addon/diaspora/Receiver.php:2212 ../../Zotlabs/Module/Like.php:491
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr ""
@@ -2963,7 +2910,7 @@ msgstr ""
msgid "This channel"
msgstr ""
-#: ../../addon/workflow/workflow.php:285 ../../Zotlabs/Module/Locs.php:128
+#: ../../addon/workflow/workflow.php:285 ../../Zotlabs/Module/Locs.php:123
msgid "Primary"
msgstr ""
@@ -2999,7 +2946,7 @@ msgstr ""
#: ../../addon/workflow/workflow.php:2617
#: ../../addon/workflow/workflow.php:2678 ../../Zotlabs/Module/Cdav.php:1374
-#: ../../Zotlabs/Module/Connedit.php:910
+#: ../../Zotlabs/Module/Connedit.php:734
msgid "Title"
msgstr ""
@@ -3008,8 +2955,8 @@ msgstr ""
msgid "Brief description or title"
msgstr ""
-#: ../../addon/workflow/workflow.php:2625 ../../Zotlabs/Widget/Notes.php:21
-#: ../../Zotlabs/Lib/Apps.php:373
+#: ../../addon/workflow/workflow.php:2625 ../../Zotlabs/Widget/Notes.php:26
+#: ../../Zotlabs/Lib/Apps.php:374
msgid "Notes"
msgstr ""
@@ -3131,7 +3078,7 @@ msgid "$Projectname"
msgstr ""
#: ../../addon/opensearch/opensearch.php:42 ../../Zotlabs/Module/Invite.php:225
-#: ../../Zotlabs/Module/Invite.php:493 ../../Zotlabs/Module/Invite.php:507
+#: ../../Zotlabs/Module/Invite.php:494 ../../Zotlabs/Module/Invite.php:508
#: ../../Zotlabs/Module/Home.php:87 ../../Zotlabs/Module/Home.php:95
#: ../../Zotlabs/Lib/Enotify.php:66
msgid "$Projectname"
@@ -3212,9 +3159,9 @@ msgstr ""
#: ../../addon/flashcards/Mod_Flashcards.php:261
#: ../../include/acl_selectors.php:154 ../../Zotlabs/Module/Chat.php:239
-#: ../../Zotlabs/Module/Filestorage.php:195 ../../Zotlabs/Module/Photos.php:678
-#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Module/Thing.php:321
-#: ../../Zotlabs/Module/Thing.php:374 ../../Zotlabs/Module/Connedit.php:675
+#: ../../Zotlabs/Module/Filestorage.php:195 ../../Zotlabs/Module/Photos.php:682
+#: ../../Zotlabs/Module/Photos.php:1053 ../../Zotlabs/Module/Thing.php:321
+#: ../../Zotlabs/Module/Thing.php:374
msgid "Permissions"
msgstr ""
@@ -3224,12 +3171,12 @@ msgid "Set/edit permissions"
msgstr ""
#: ../../addon/flashcards/Mod_Flashcards.php:291
-#: ../../addon/flashcards/Mod_Flashcards.php:292 ../../include/items.php:3667
+#: ../../addon/flashcards/Mod_Flashcards.php:292 ../../include/items.php:3804
#: ../../Zotlabs/Module/Filestorage.php:29
#: ../../Zotlabs/Module/Admin/Themes.php:72
#: ../../Zotlabs/Module/Admin/Addons.php:260
-#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:45
-#: ../../Zotlabs/Module/Display.php:425 ../../Zotlabs/Module/Admin.php:61
+#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:53
+#: ../../Zotlabs/Module/Display.php:428 ../../Zotlabs/Module/Admin.php:61
#: ../../Zotlabs/Module/Thing.php:96
msgid "Item not found."
msgstr ""
@@ -3274,7 +3221,7 @@ msgstr ""
msgid "&lt;blush&gt;"
msgstr ""
-#: ../../addon/buglink/buglink.php:16 ../../Zotlabs/Lib/Apps.php:331
+#: ../../addon/buglink/buglink.php:16 ../../Zotlabs/Lib/Apps.php:332
msgid "Report Bug"
msgstr ""
@@ -3631,7 +3578,7 @@ msgstr ""
msgid "Posted by"
msgstr ""
-#: ../../addon/mdpost/mdpost.php:41 ../../include/text.php:2115
+#: ../../addon/mdpost/mdpost.php:41 ../../include/text.php:2166
#: ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95 ../../Zotlabs/Module/Wiki.php:214
#: ../../Zotlabs/Module/Wiki.php:368
@@ -3738,61 +3685,57 @@ msgstr ""
msgid "XMPP Settings"
msgstr ""
-#: ../../include/text.php:524
+#: ../../include/text.php:525
msgid "prev"
msgstr ""
-#: ../../include/text.php:526
+#: ../../include/text.php:527
msgid "first"
msgstr ""
-#: ../../include/text.php:555
+#: ../../include/text.php:556
msgid "last"
msgstr ""
-#: ../../include/text.php:558
+#: ../../include/text.php:559
msgid "next"
msgstr ""
-#: ../../include/text.php:576
+#: ../../include/text.php:577
msgid "older"
msgstr ""
-#: ../../include/text.php:578
+#: ../../include/text.php:579
msgid "newer"
msgstr ""
-#: ../../include/text.php:1019
-msgid "No connections"
-msgstr ""
-
-#: ../../include/text.php:1031 ../../include/features.php:133
-#: ../../Zotlabs/Module/Connections.php:375 ../../Zotlabs/Lib/Apps.php:336
+#: ../../include/text.php:1033 ../../include/features.php:133
+#: ../../Zotlabs/Module/Connections.php:390 ../../Zotlabs/Lib/Apps.php:337
msgid "Connections"
msgstr ""
-#: ../../include/text.php:1039 ../../Zotlabs/Module/Viewconnections.php:80
-#: ../../Zotlabs/Module/Connections.php:289
+#: ../../include/text.php:1041 ../../Zotlabs/Module/Viewconnections.php:80
+#: ../../Zotlabs/Module/Connections.php:297
msgid "Accepts"
msgstr ""
-#: ../../include/text.php:1042 ../../Zotlabs/Module/Viewconnections.php:83
-#: ../../Zotlabs/Module/Connections.php:292
+#: ../../include/text.php:1044 ../../Zotlabs/Module/Viewconnections.php:83
+#: ../../Zotlabs/Module/Connections.php:300
msgid "Comments"
msgstr ""
-#: ../../include/text.php:1047 ../../Zotlabs/Module/Viewconnections.php:88
-#: ../../Zotlabs/Module/Connections.php:297
+#: ../../include/text.php:1049 ../../Zotlabs/Module/Viewconnections.php:88
+#: ../../Zotlabs/Module/Connections.php:305
msgid "Stream items"
msgstr ""
-#: ../../include/text.php:1052 ../../Zotlabs/Module/Viewconnections.php:93
-#: ../../Zotlabs/Module/Connections.php:302
+#: ../../include/text.php:1054 ../../Zotlabs/Module/Viewconnections.php:93
+#: ../../Zotlabs/Module/Connections.php:310
msgid "Wall posts"
msgstr ""
-#: ../../include/text.php:1056 ../../Zotlabs/Module/Viewconnections.php:97
-#: ../../Zotlabs/Module/Connections.php:306
+#: ../../include/text.php:1058 ../../Zotlabs/Module/Viewconnections.php:97
+#: ../../Zotlabs/Module/Connections.php:314
msgid "Nothing"
msgstr ""
@@ -3807,11 +3750,11 @@ msgid "Network: %s"
msgstr ""
#: ../../include/text.php:1145 ../../include/text.php:1157
-#: ../../include/nav.php:192 ../../include/acl_selectors.php:149
+#: ../../include/nav.php:190 ../../include/acl_selectors.php:149
#: ../../Zotlabs/Widget/Sitesearch.php:31
#: ../../Zotlabs/Widget/Activity_filter.php:203
-#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:379
-#: ../../Zotlabs/Lib/Apps.php:356
+#: ../../Zotlabs/Module/Search.php:45 ../../Zotlabs/Module/Connections.php:394
+#: ../../Zotlabs/Lib/Apps.php:357
msgid "Search"
msgstr ""
@@ -4045,173 +3988,194 @@ msgstr ""
msgid "remove from file"
msgstr ""
-#: ../../include/text.php:1913
-msgid "Poll has ended."
+#: ../../include/text.php:1843
+msgid "Download binary/encrypted content"
msgstr ""
-#: ../../include/text.php:1916
+#: ../../include/text.php:1901 ../../include/text.php:1910
+#: ../../include/text.php:1937 ../../include/text.php:1946
+#, php-format
+msgctxt "noun"
+msgid "%d Vote"
+msgid_plural "%d Votes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/text.php:1953
#, php-format
-msgid "Poll ends: %s"
+msgctxt "noun"
+msgid "%d Vote in total"
+msgid_plural "%d Votes in total"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/text.php:1959
+msgid "Poll has ended"
+msgstr ""
+
+#: ../../include/text.php:1962
+#, php-format
+msgid "Poll ends in %s"
msgstr ""
-#: ../../include/text.php:1921 ../../Zotlabs/Lib/ThreadItem.php:446
+#: ../../include/text.php:1969 ../../Zotlabs/Lib/ThreadItem.php:470
msgid "Vote"
msgstr ""
-#: ../../include/text.php:2073
+#: ../../include/text.php:2124
msgid "Link to Source"
msgstr ""
-#: ../../include/text.php:2095 ../../include/language.php:428
+#: ../../include/text.php:2146 ../../include/language.php:428
msgid "default"
msgstr ""
-#: ../../include/text.php:2103
+#: ../../include/text.php:2154
msgid "Page layout"
msgstr ""
-#: ../../include/text.php:2103
+#: ../../include/text.php:2154
msgid "You can create your own with the layouts tool"
msgstr ""
-#: ../../include/text.php:2113 ../../Zotlabs/Widget/Wiki_pages.php:38
+#: ../../include/text.php:2164 ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95 ../../Zotlabs/Module/Wiki.php:214
#: ../../Zotlabs/Module/Wiki.php:368
msgid "BBcode"
msgstr ""
-#: ../../include/text.php:2114
+#: ../../include/text.php:2165
msgid "HTML"
msgstr ""
-#: ../../include/text.php:2116 ../../Zotlabs/Widget/Wiki_pages.php:38
+#: ../../include/text.php:2167 ../../Zotlabs/Widget/Wiki_pages.php:38
#: ../../Zotlabs/Widget/Wiki_pages.php:95 ../../Zotlabs/Module/Wiki.php:214
msgid "Text"
msgstr ""
-#: ../../include/text.php:2117
+#: ../../include/text.php:2168
msgid "Comanche Layout"
msgstr ""
-#: ../../include/text.php:2122
+#: ../../include/text.php:2173
msgid "PHP"
msgstr ""
-#: ../../include/text.php:2131
+#: ../../include/text.php:2182
msgid "Page content type"
msgstr ""
-#: ../../include/text.php:2254 ../../include/event.php:1259
+#: ../../include/text.php:2305 ../../include/event.php:1259
#: ../../include/conversation.php:132
#: ../../Zotlabs/Module/Channel_calendar.php:221
-#: ../../Zotlabs/Module/Like.php:441 ../../Zotlabs/Module/Tagger.php:75
+#: ../../Zotlabs/Module/Like.php:447 ../../Zotlabs/Module/Tagger.php:75
msgid "event"
msgstr ""
-#: ../../include/text.php:2257 ../../include/conversation.php:158
+#: ../../include/text.php:2308 ../../include/conversation.php:158
#: ../../include/bbcode.php:555 ../../include/markdown.php:205
-#: ../../Zotlabs/Module/Tagger.php:79 ../../Zotlabs/Lib/Activity.php:3301
+#: ../../Zotlabs/Module/Tagger.php:79 ../../Zotlabs/Lib/Activity.php:3391
msgid "post"
msgstr ""
-#: ../../include/text.php:2259 ../../include/conversation.php:160
+#: ../../include/text.php:2310 ../../include/conversation.php:160
#: ../../Zotlabs/Module/Tagger.php:81
msgid "comment"
msgstr ""
-#: ../../include/text.php:2264
+#: ../../include/text.php:2315
msgid "activity"
msgstr ""
-#: ../../include/text.php:2267
+#: ../../include/text.php:2318
msgid "poll"
msgstr ""
-#: ../../include/text.php:2380
+#: ../../include/text.php:2431
msgid "a-z, 0-9, -, and _ only"
msgstr ""
-#: ../../include/text.php:2685
+#: ../../include/text.php:2736
msgid "Design Tools"
msgstr ""
-#: ../../include/text.php:2688 ../../Zotlabs/Module/Blocks.php:154
+#: ../../include/text.php:2739 ../../Zotlabs/Module/Blocks.php:154
msgid "Blocks"
msgstr ""
-#: ../../include/text.php:2689 ../../Zotlabs/Module/Menu.php:171
+#: ../../include/text.php:2740 ../../Zotlabs/Module/Menu.php:171
msgid "Menus"
msgstr ""
-#: ../../include/text.php:2690 ../../Zotlabs/Module/Layouts.php:184
+#: ../../include/text.php:2741 ../../Zotlabs/Module/Layouts.php:184
msgid "Layouts"
msgstr ""
-#: ../../include/text.php:2691
+#: ../../include/text.php:2742
msgid "Pages"
msgstr ""
-#: ../../include/text.php:2703
+#: ../../include/text.php:2754
msgid "Import"
msgstr ""
-#: ../../include/text.php:2704
+#: ../../include/text.php:2755
msgid "Import website..."
msgstr ""
-#: ../../include/text.php:2705
+#: ../../include/text.php:2756
msgid "Select folder to import"
msgstr ""
-#: ../../include/text.php:2706
+#: ../../include/text.php:2757
msgid "Import from a zipped folder:"
msgstr ""
-#: ../../include/text.php:2707
+#: ../../include/text.php:2758
msgid "Import from cloud files:"
msgstr ""
-#: ../../include/text.php:2708
+#: ../../include/text.php:2759
msgid "/cloud/channel/path/to/folder"
msgstr ""
-#: ../../include/text.php:2709
+#: ../../include/text.php:2760
msgid "Enter path to website files"
msgstr ""
-#: ../../include/text.php:2710
+#: ../../include/text.php:2761
msgid "Select folder"
msgstr ""
-#: ../../include/text.php:2711
+#: ../../include/text.php:2762
msgid "Export website..."
msgstr ""
-#: ../../include/text.php:2712
+#: ../../include/text.php:2763
msgid "Export to a zip file"
msgstr ""
-#: ../../include/text.php:2713
+#: ../../include/text.php:2764
msgid "website.zip"
msgstr ""
-#: ../../include/text.php:2714
+#: ../../include/text.php:2765
msgid "Enter a name for the zip file."
msgstr ""
-#: ../../include/text.php:2715
+#: ../../include/text.php:2766
msgid "Export to cloud files"
msgstr ""
-#: ../../include/text.php:2716
+#: ../../include/text.php:2767
msgid "/path/to/export/folder"
msgstr ""
-#: ../../include/text.php:2717
+#: ../../include/text.php:2768
msgid "Enter a path to a cloud files destination."
msgstr ""
-#: ../../include/text.php:2718
+#: ../../include/text.php:2769
msgid "Specify folder"
msgstr ""
@@ -4233,7 +4197,7 @@ msgid "Finishes:"
msgstr ""
#: ../../include/event.php:63 ../../include/event.php:134
-#: ../../include/channel.php:1581 ../../Zotlabs/Module/Directory.php:353
+#: ../../include/channel.php:1625 ../../Zotlabs/Module/Directory.php:353
msgid "Location:"
msgstr ""
@@ -4273,47 +4237,47 @@ msgstr ""
msgid "Cancelled"
msgstr ""
-#: ../../include/event.php:1422 ../../include/connections.php:721
-#: ../../Zotlabs/Module/Cdav.php:1381 ../../Zotlabs/Module/Profiles.php:793
-#: ../../Zotlabs/Module/Connedit.php:917
+#: ../../include/event.php:1422 ../../include/connections.php:751
+#: ../../Zotlabs/Module/Cdav.php:1381 ../../Zotlabs/Module/Profiles.php:808
+#: ../../Zotlabs/Module/Connedit.php:741
msgid "Mobile"
msgstr ""
-#: ../../include/event.php:1423 ../../include/connections.php:722
+#: ../../include/event.php:1423 ../../include/connections.php:752
#: ../../Zotlabs/Widget/Notifications.php:36 ../../Zotlabs/Module/Cdav.php:1382
-#: ../../Zotlabs/Module/Profiles.php:794 ../../Zotlabs/Module/Connedit.php:918
+#: ../../Zotlabs/Module/Profiles.php:809 ../../Zotlabs/Module/Connedit.php:742
msgid "Home"
msgstr ""
-#: ../../include/event.php:1424 ../../include/connections.php:723
+#: ../../include/event.php:1424 ../../include/connections.php:753
msgid "Home, Voice"
msgstr ""
-#: ../../include/event.php:1425 ../../include/connections.php:724
+#: ../../include/event.php:1425 ../../include/connections.php:754
msgid "Home, Fax"
msgstr ""
-#: ../../include/event.php:1426 ../../include/connections.php:725
-#: ../../Zotlabs/Module/Cdav.php:1383 ../../Zotlabs/Module/Profiles.php:795
-#: ../../Zotlabs/Module/Connedit.php:919
+#: ../../include/event.php:1426 ../../include/connections.php:755
+#: ../../Zotlabs/Module/Cdav.php:1383 ../../Zotlabs/Module/Profiles.php:810
+#: ../../Zotlabs/Module/Connedit.php:743
msgid "Work"
msgstr ""
-#: ../../include/event.php:1427 ../../include/connections.php:726
+#: ../../include/event.php:1427 ../../include/connections.php:756
msgid "Work, Voice"
msgstr ""
-#: ../../include/event.php:1428 ../../include/connections.php:727
+#: ../../include/event.php:1428 ../../include/connections.php:757
msgid "Work, Fax"
msgstr ""
#: ../../include/event.php:1429 ../../include/event.php:1436
-#: ../../include/selectors.php:60 ../../include/selectors.php:77
-#: ../../include/selectors.php:115 ../../include/selectors.php:151
-#: ../../include/connections.php:728 ../../include/connections.php:735
-#: ../../Zotlabs/Module/Cdav.php:1384 ../../Zotlabs/Module/Profiles.php:796
-#: ../../Zotlabs/Module/Connedit.php:920
-#: ../../Zotlabs/Access/PermissionRoles.php:310
+#: ../../include/selectors.php:64 ../../include/selectors.php:81
+#: ../../include/selectors.php:119 ../../include/selectors.php:155
+#: ../../include/connections.php:758 ../../include/connections.php:765
+#: ../../Zotlabs/Module/Cdav.php:1384 ../../Zotlabs/Module/Profiles.php:811
+#: ../../Zotlabs/Module/Connedit.php:744
+#: ../../Zotlabs/Access/PermissionRoles.php:360
msgid "Other"
msgstr ""
@@ -4329,8 +4293,8 @@ msgstr ""
msgid "On"
msgstr ""
-#: ../../include/features.php:82 ../../include/nav.php:468
-#: ../../include/nav.php:471 ../../Zotlabs/Lib/Apps.php:349
+#: ../../include/features.php:82 ../../include/nav.php:466
+#: ../../include/nav.php:469 ../../Zotlabs/Lib/Apps.php:350
msgid "Calendar"
msgstr ""
@@ -4350,7 +4314,7 @@ msgstr ""
msgid "Allow event creation in timezones other than your own."
msgstr ""
-#: ../../include/features.php:104 ../../Zotlabs/Lib/Apps.php:346
+#: ../../include/features.php:104 ../../Zotlabs/Lib/Apps.php:347
msgid "Channel Home"
msgstr ""
@@ -4422,7 +4386,7 @@ msgstr ""
msgid "Ability to reply on selected comment"
msgstr ""
-#: ../../include/features.php:192 ../../Zotlabs/Lib/Apps.php:350
+#: ../../include/features.php:192 ../../Zotlabs/Lib/Apps.php:351
msgid "Directory"
msgstr ""
@@ -4522,7 +4486,7 @@ msgid "Change channels directly from within the navigation dropdown menu"
msgstr ""
#: ../../include/features.php:290 ../../Zotlabs/Widget/Notifications.php:16
-#: ../../Zotlabs/Module/Connections.php:333
+#: ../../Zotlabs/Module/Connections.php:338
msgid "Network"
msgstr ""
@@ -4594,8 +4558,8 @@ msgstr ""
msgid "Ability to display only posts that you've interacted on"
msgstr ""
-#: ../../include/features.php:368 ../../include/nav.php:449
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:348
+#: ../../include/features.php:368 ../../include/nav.php:447
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:349
msgid "Photos"
msgstr ""
@@ -4607,7 +4571,7 @@ msgstr ""
msgid "If location data is available on uploaded photos, link this to a map."
msgstr ""
-#: ../../include/features.php:382 ../../Zotlabs/Lib/Apps.php:366
+#: ../../include/features.php:382 ../../Zotlabs/Lib/Apps.php:367
msgid "Profiles"
msgstr ""
@@ -4635,7 +4599,7 @@ msgstr ""
msgid "Ability to create multiple profiles"
msgstr ""
-#: ../../include/security.php:607
+#: ../../include/security.php:629
msgid ""
"The form security token was not correct. This probably happened because the "
"form has been opened for too long (>3 hours) before submitting it."
@@ -4645,12 +4609,12 @@ msgstr ""
msgid "Delete this item?"
msgstr ""
-#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1097
-#: ../../Zotlabs/Module/Photos.php:1213 ../../Zotlabs/Lib/ThreadItem.php:826
+#: ../../include/js_strings.php:6 ../../Zotlabs/Module/Photos.php:1103
+#: ../../Zotlabs/Module/Photos.php:1219 ../../Zotlabs/Lib/ThreadItem.php:850
msgid "Comment"
msgstr ""
-#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:535
+#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:559
#, php-format
msgid "%s show all"
msgstr ""
@@ -4706,7 +4670,7 @@ msgstr ""
msgid "Rate This Channel (this is public)"
msgstr ""
-#: ../../include/js_strings.php:20 ../../Zotlabs/Module/Connedit.php:872
+#: ../../include/js_strings.php:20
msgid "Rating"
msgstr ""
@@ -4723,8 +4687,8 @@ msgid "Unsaved changes. Are you sure you wish to leave this page?"
msgstr ""
#: ../../include/js_strings.php:25 ../../Zotlabs/Module/Pubsites.php:52
-#: ../../Zotlabs/Module/Cdav.php:1014 ../../Zotlabs/Module/Profiles.php:511
-#: ../../Zotlabs/Module/Profiles.php:735 ../../Zotlabs/Module/Locs.php:126
+#: ../../Zotlabs/Module/Cdav.php:1014 ../../Zotlabs/Module/Profiles.php:480
+#: ../../Zotlabs/Module/Profiles.php:750 ../../Zotlabs/Module/Locs.php:121
msgid "Location"
msgstr ""
@@ -4778,12 +4742,12 @@ msgstr ""
msgid "Pinned"
msgstr ""
-#: ../../include/js_strings.php:38 ../../Zotlabs/Lib/ThreadItem.php:473
+#: ../../include/js_strings.php:38 ../../Zotlabs/Lib/ThreadItem.php:497
msgid "Pin to the top"
msgstr ""
#: ../../include/js_strings.php:39 ../../Zotlabs/Widget/Pinned.php:155
-#: ../../Zotlabs/Lib/ThreadItem.php:473
+#: ../../Zotlabs/Lib/ThreadItem.php:497
msgid "Unpin from the top"
msgstr ""
@@ -4990,8 +4954,8 @@ msgid "Help:"
msgstr ""
#: ../../include/help.php:118 ../../include/help.php:126
-#: ../../include/nav.php:178 ../../include/nav.php:317
-#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:351
+#: ../../include/nav.php:176 ../../include/nav.php:315
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:352
msgid "Help"
msgstr ""
@@ -4999,52 +4963,52 @@ msgstr ""
msgid "Not Found"
msgstr ""
-#: ../../include/help.php:133 ../../Zotlabs/Module/Display.php:139
-#: ../../Zotlabs/Module/Display.php:156 ../../Zotlabs/Module/Display.php:176
-#: ../../Zotlabs/Module/Display.php:182 ../../Zotlabs/Module/Page.php:136
-#: ../../Zotlabs/Module/Block.php:77 ../../Zotlabs/Lib/NativeWikiPage.php:533
+#: ../../include/help.php:133 ../../Zotlabs/Module/Display.php:142
+#: ../../Zotlabs/Module/Display.php:159 ../../Zotlabs/Module/Display.php:179
+#: ../../Zotlabs/Module/Display.php:185 ../../Zotlabs/Module/Page.php:136
+#: ../../Zotlabs/Module/Block.php:77 ../../Zotlabs/Lib/NativeWikiPage.php:539
#: ../../Zotlabs/Web/Router.php:186
msgid "Page not found."
msgstr ""
-#: ../../include/photos.php:154
+#: ../../include/photos.php:153
#, php-format
msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../include/photos.php:165
+#: ../../include/photos.php:164
msgid "Image file is empty."
msgstr ""
-#: ../../include/photos.php:199 ../../Zotlabs/Module/Profile_photo.php:261
+#: ../../include/photos.php:198 ../../Zotlabs/Module/Profile_photo.php:275
#: ../../Zotlabs/Module/Cover_photo.php:241
msgid "Unable to process image"
msgstr ""
-#: ../../include/photos.php:327
+#: ../../include/photos.php:324
msgid "Photo storage failed."
msgstr ""
-#: ../../include/photos.php:376
+#: ../../include/photos.php:373
msgid "a new photo"
msgstr ""
-#: ../../include/photos.php:380
+#: ../../include/photos.php:377
#, php-format
msgctxt "photo_upload"
msgid "%1$s posted %2$s to %3$s"
msgstr ""
-#: ../../include/photos.php:714 ../../include/nav.php:452
+#: ../../include/photos.php:722 ../../include/nav.php:450
msgid "Photo Albums"
msgstr ""
-#: ../../include/photos.php:715 ../../Zotlabs/Module/Photos.php:1346
-#: ../../Zotlabs/Module/Photos.php:1359 ../../Zotlabs/Module/Photos.php:1360
+#: ../../include/photos.php:723 ../../Zotlabs/Module/Photos.php:1352
+#: ../../Zotlabs/Module/Photos.php:1365 ../../Zotlabs/Module/Photos.php:1366
msgid "Recent Photos"
msgstr ""
-#: ../../include/photos.php:719
+#: ../../include/photos.php:727
msgid "Upload New Photos"
msgstr ""
@@ -5141,7 +5105,7 @@ msgstr ""
#: ../../include/contact_widgets.php:23 ../../Zotlabs/Module/Directory.php:432
#: ../../Zotlabs/Module/Directory.php:437
-#: ../../Zotlabs/Module/Connections.php:382
+#: ../../Zotlabs/Module/Connections.php:398
msgid "Find"
msgstr ""
@@ -5191,16 +5155,16 @@ msgstr ""
msgid "Select an alternate language"
msgstr ""
-#: ../../include/import.php:29
+#: ../../include/import.php:30
msgid "Unable to import a removed channel."
msgstr ""
-#: ../../include/import.php:55
+#: ../../include/import.php:56
msgid ""
"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/import.php:121
+#: ../../include/import.php:122
msgid "Cloned channel not found. Import failed."
msgstr ""
@@ -5214,7 +5178,7 @@ msgstr ""
#: ../../include/nav.php:98 ../../Zotlabs/Widget/Admin.php:24
#: ../../Zotlabs/Module/Admin/Channels.php:146
-#: ../../Zotlabs/Module/Manage.php:160 ../../Zotlabs/Module/Admin.php:116
+#: ../../Zotlabs/Module/Manage.php:162 ../../Zotlabs/Module/Admin.php:116
msgid "Channels"
msgstr ""
@@ -5222,206 +5186,194 @@ msgstr ""
msgid "Manage your channels"
msgstr ""
-#: ../../include/nav.php:101 ../../include/group.php:327
-#: ../../include/acl_selectors.php:87
-#: ../../Zotlabs/Widget/Activity_filter.php:88
-#: ../../Zotlabs/Module/Group.php:140 ../../Zotlabs/Module/Group.php:152
-#: ../../Zotlabs/Lib/Group.php:324 ../../Zotlabs/Lib/Apps.php:367
-msgid "Privacy Groups"
-msgstr ""
-
-#: ../../include/nav.php:101
-msgid "Manage your privacy groups"
-msgstr ""
-
-#: ../../include/nav.php:103 ../../Zotlabs/Widget/Settings_menu.php:61
+#: ../../include/nav.php:101 ../../Zotlabs/Widget/Settings_menu.php:66
#: ../../Zotlabs/Widget/Newmember.php:53
#: ../../Zotlabs/Module/Admin/Themes.php:125
-#: ../../Zotlabs/Module/Admin/Addons.php:345 ../../Zotlabs/Lib/Apps.php:342
+#: ../../Zotlabs/Module/Admin/Addons.php:345 ../../Zotlabs/Lib/Apps.php:343
msgid "Settings"
msgstr ""
-#: ../../include/nav.php:103
+#: ../../include/nav.php:101
msgid "Account/Channel Settings"
msgstr ""
-#: ../../include/nav.php:109 ../../include/nav.php:139
-#: ../../include/nav.php:160 ../../boot.php:1724
+#: ../../include/nav.php:107 ../../include/nav.php:137
+#: ../../include/nav.php:158 ../../boot.php:1737
msgid "Logout"
msgstr ""
-#: ../../include/nav.php:109 ../../include/nav.php:139
+#: ../../include/nav.php:107 ../../include/nav.php:137
msgid "End this session"
msgstr ""
-#: ../../include/nav.php:112
+#: ../../include/nav.php:110
msgid "Your profile page"
msgstr ""
-#: ../../include/nav.php:115 ../../include/channel.php:1486
-#: ../../Zotlabs/Module/Profiles.php:831
+#: ../../include/nav.php:113 ../../include/channel.php:1530
+#: ../../Zotlabs/Module/Profiles.php:851
msgid "Edit Profiles"
msgstr ""
-#: ../../include/nav.php:115
+#: ../../include/nav.php:113
msgid "Manage/Edit profiles"
msgstr ""
-#: ../../include/nav.php:117 ../../Zotlabs/Widget/Newmember.php:35
+#: ../../include/nav.php:115 ../../Zotlabs/Widget/Newmember.php:35
msgid "Edit your profile"
msgstr ""
-#: ../../include/nav.php:124 ../../include/nav.php:128
-#: ../../Zotlabs/Lib/Apps.php:339 ../../boot.php:1725
+#: ../../include/nav.php:122 ../../include/nav.php:126
+#: ../../Zotlabs/Lib/Apps.php:340 ../../boot.php:1738
msgid "Login"
msgstr ""
-#: ../../include/nav.php:124 ../../include/nav.php:128
+#: ../../include/nav.php:122 ../../include/nav.php:126
msgid "Sign in"
msgstr ""
-#: ../../include/nav.php:158
+#: ../../include/nav.php:156
msgid "Take me home"
msgstr ""
-#: ../../include/nav.php:160
+#: ../../include/nav.php:158
msgid "Log me out of this site"
msgstr ""
-#: ../../include/nav.php:165 ../../Zotlabs/Module/Register.php:542
-#: ../../boot.php:1702
+#: ../../include/nav.php:163 ../../Zotlabs/Module/Register.php:542
+#: ../../boot.php:1715
msgid "Register"
msgstr ""
-#: ../../include/nav.php:165
+#: ../../include/nav.php:163
msgid "Create an account"
msgstr ""
-#: ../../include/nav.php:178
+#: ../../include/nav.php:176
msgid "Help and documentation"
msgstr ""
-#: ../../include/nav.php:192
+#: ../../include/nav.php:190
msgid "Search site @name, !forum, #tag, ?docs, content"
msgstr ""
-#: ../../include/nav.php:198 ../../Zotlabs/Widget/Admin.php:55
+#: ../../include/nav.php:196 ../../Zotlabs/Widget/Admin.php:55
msgid "Admin"
msgstr ""
-#: ../../include/nav.php:198
+#: ../../include/nav.php:196
msgid "Site Setup and Configuration"
msgstr ""
-#: ../../include/nav.php:321 ../../Zotlabs/Widget/Messages.php:27
+#: ../../include/nav.php:319 ../../Zotlabs/Widget/Messages.php:28
#: ../../Zotlabs/Widget/Notifications.php:166
#: ../../Zotlabs/Module/New_channel.php:157
#: ../../Zotlabs/Module/New_channel.php:164
-#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:854
+#: ../../Zotlabs/Module/Defperms.php:254
msgid "Loading"
msgstr ""
-#: ../../include/nav.php:326
+#: ../../include/nav.php:324
msgid "@name, #tag, ?doc, content"
msgstr ""
-#: ../../include/nav.php:327
+#: ../../include/nav.php:325
msgid "Please wait..."
msgstr ""
-#: ../../include/nav.php:333 ../../Zotlabs/Lib/Apps.php:326
+#: ../../include/nav.php:331 ../../Zotlabs/Lib/Apps.php:327
msgid "Apps"
msgstr ""
-#: ../../include/nav.php:334
+#: ../../include/nav.php:332
msgid "Channel Apps"
msgstr ""
-#: ../../include/nav.php:335
+#: ../../include/nav.php:333
msgid "System Apps"
msgstr ""
-#: ../../include/nav.php:336
+#: ../../include/nav.php:334
msgid "Pinned Apps"
msgstr ""
-#: ../../include/nav.php:337
+#: ../../include/nav.php:335
msgid "Featured Apps"
msgstr ""
-#: ../../include/nav.php:426 ../../Zotlabs/Module/Admin/Channels.php:154
+#: ../../include/nav.php:424 ../../Zotlabs/Module/Admin/Channels.php:154
msgid "Channel"
msgstr ""
-#: ../../include/nav.php:429
+#: ../../include/nav.php:427
msgid "Status Messages and Posts"
msgstr ""
-#: ../../include/nav.php:439 ../../Zotlabs/Module/Help.php:83
+#: ../../include/nav.php:437 ../../Zotlabs/Module/Help.php:83
msgid "About"
msgstr ""
-#: ../../include/nav.php:442
+#: ../../include/nav.php:440
msgid "Profile Details"
msgstr ""
-#: ../../include/nav.php:457 ../../Zotlabs/Widget/Notifications.php:101
-#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:343
+#: ../../include/nav.php:455 ../../Zotlabs/Widget/Notifications.php:101
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:344
#: ../../Zotlabs/Storage/Browser.php:351
msgid "Files"
msgstr ""
-#: ../../include/nav.php:460
+#: ../../include/nav.php:458
msgid "Files and Storage"
msgstr ""
-#: ../../include/nav.php:482 ../../include/nav.php:485
-#: ../../Zotlabs/Widget/Chatroom_list.php:16 ../../Zotlabs/Lib/Apps.php:333
+#: ../../include/nav.php:480 ../../include/nav.php:483
+#: ../../Zotlabs/Widget/Chatroom_list.php:16 ../../Zotlabs/Lib/Apps.php:334
msgid "Chatrooms"
msgstr ""
-#: ../../include/nav.php:495 ../../Zotlabs/Module/Bookmarks.php:90
-#: ../../Zotlabs/Lib/Apps.php:332
+#: ../../include/nav.php:493 ../../Zotlabs/Module/Bookmarks.php:90
+#: ../../Zotlabs/Lib/Apps.php:333
msgid "Bookmarks"
msgstr ""
-#: ../../include/nav.php:498
+#: ../../include/nav.php:496
msgid "Saved Bookmarks"
msgstr ""
-#: ../../include/nav.php:506 ../../Zotlabs/Module/Cards.php:205
-#: ../../Zotlabs/Lib/Apps.php:329
+#: ../../include/nav.php:504 ../../Zotlabs/Module/Cards.php:205
+#: ../../Zotlabs/Lib/Apps.php:330
msgid "Cards"
msgstr ""
-#: ../../include/nav.php:509
+#: ../../include/nav.php:507
msgid "View Cards"
msgstr ""
-#: ../../include/nav.php:517 ../../Zotlabs/Module/Articles.php:223
-#: ../../Zotlabs/Lib/Apps.php:328
+#: ../../include/nav.php:515 ../../Zotlabs/Module/Articles.php:223
+#: ../../Zotlabs/Lib/Apps.php:329
msgid "Articles"
msgstr ""
-#: ../../include/nav.php:520
+#: ../../include/nav.php:518
msgid "View Articles"
msgstr ""
-#: ../../include/nav.php:529 ../../Zotlabs/Module/Webpages.php:249
-#: ../../Zotlabs/Lib/Apps.php:344
+#: ../../include/nav.php:527 ../../Zotlabs/Module/Webpages.php:249
+#: ../../Zotlabs/Lib/Apps.php:345
msgid "Webpages"
msgstr ""
-#: ../../include/nav.php:532
+#: ../../include/nav.php:530
msgid "View Webpages"
msgstr ""
-#: ../../include/nav.php:541 ../../Zotlabs/Widget/Wiki_list.php:15
+#: ../../include/nav.php:539 ../../Zotlabs/Widget/Wiki_list.php:15
#: ../../Zotlabs/Module/Wiki.php:203
msgid "Wikis"
msgstr ""
-#: ../../include/nav.php:544 ../../Zotlabs/Lib/Apps.php:345
+#: ../../include/nav.php:542 ../../Zotlabs/Lib/Apps.php:346
msgid "Wiki"
msgstr ""
@@ -5442,7 +5394,7 @@ msgid "Failed authentication"
msgstr ""
#: ../../include/datetime.php:58 ../../Zotlabs/Widget/Newmember.php:51
-#: ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Profiles.php:752
msgid "Miscellaneous"
msgstr ""
@@ -5458,7 +5410,7 @@ msgstr ""
msgid "YYYY-MM-DD or MM-DD"
msgstr ""
-#: ../../include/datetime.php:238 ../../boot.php:2739
+#: ../../include/datetime.php:238 ../../boot.php:2751
msgid "never"
msgstr ""
@@ -5540,12 +5492,12 @@ msgid "Summary: "
msgstr ""
#: ../../include/cdav.php:158 ../../include/cdav.php:159
-#: ../../include/cdav.php:167 ../../include/conversation.php:1217
+#: ../../include/cdav.php:167 ../../include/conversation.php:1231
#: ../../Zotlabs/Widget/Album.php:84 ../../Zotlabs/Widget/Pinned.php:268
#: ../../Zotlabs/Widget/Portfolio.php:95
-#: ../../Zotlabs/Module/Embedphotos.php:177 ../../Zotlabs/Module/Photos.php:793
-#: ../../Zotlabs/Module/Photos.php:1253 ../../Zotlabs/Lib/Activity.php:1602
-#: ../../Zotlabs/Lib/Apps.php:1148 ../../Zotlabs/Lib/Apps.php:1232
+#: ../../Zotlabs/Module/Embedphotos.php:177 ../../Zotlabs/Module/Photos.php:799
+#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/Activity.php:1656
+#: ../../Zotlabs/Lib/Apps.php:1146 ../../Zotlabs/Lib/Apps.php:1230
msgid "Unknown"
msgstr ""
@@ -5565,7 +5517,7 @@ msgstr ""
msgid "Name: "
msgstr ""
-#: ../../include/conversation.php:135 ../../Zotlabs/Module/Like.php:178
+#: ../../include/conversation.php:135 ../../Zotlabs/Module/Like.php:184
msgid "channel"
msgstr ""
@@ -5595,100 +5547,102 @@ msgctxt "mood"
msgid "%1$s is %2$s"
msgstr ""
-#: ../../include/conversation.php:516 ../../Zotlabs/Lib/ThreadItem.php:502
+#: ../../include/conversation.php:516 ../../Zotlabs/Lib/ThreadItem.php:526
msgid "This is an unsaved preview"
msgstr ""
-#: ../../include/conversation.php:652 ../../Zotlabs/Module/Photos.php:1113
+#: ../../include/conversation.php:652 ../../Zotlabs/Module/Photos.php:1119
msgctxt "title"
msgid "Likes"
msgstr ""
-#: ../../include/conversation.php:653 ../../Zotlabs/Module/Photos.php:1113
+#: ../../include/conversation.php:653 ../../Zotlabs/Module/Photos.php:1119
msgctxt "title"
msgid "Dislikes"
msgstr ""
#: ../../include/conversation.php:654 ../../Zotlabs/Widget/Pinned.php:77
-#: ../../Zotlabs/Module/Photos.php:1114
+#: ../../Zotlabs/Module/Photos.php:1120
msgctxt "title"
msgid "Agree"
msgstr ""
#: ../../include/conversation.php:655 ../../Zotlabs/Widget/Pinned.php:78
-#: ../../Zotlabs/Module/Photos.php:1114
+#: ../../Zotlabs/Module/Photos.php:1120
msgctxt "title"
msgid "Disagree"
msgstr ""
#: ../../include/conversation.php:656 ../../Zotlabs/Widget/Pinned.php:79
-#: ../../Zotlabs/Module/Photos.php:1114
+#: ../../Zotlabs/Module/Photos.php:1120
msgctxt "title"
msgid "Abstain"
msgstr ""
#: ../../include/conversation.php:657 ../../Zotlabs/Widget/Pinned.php:66
-#: ../../Zotlabs/Module/Photos.php:1115
+#: ../../Zotlabs/Module/Photos.php:1121
msgctxt "title"
msgid "Attending"
msgstr ""
#: ../../include/conversation.php:658 ../../Zotlabs/Widget/Pinned.php:67
-#: ../../Zotlabs/Module/Photos.php:1115
+#: ../../Zotlabs/Module/Photos.php:1121
msgctxt "title"
msgid "Not attending"
msgstr ""
#: ../../include/conversation.php:659 ../../Zotlabs/Widget/Pinned.php:68
-#: ../../Zotlabs/Module/Photos.php:1115
+#: ../../Zotlabs/Module/Photos.php:1121
msgctxt "title"
msgid "Might attend"
msgstr ""
-#: ../../include/conversation.php:729 ../../Zotlabs/Lib/ThreadItem.php:181
+#: ../../include/conversation.php:729 ../../Zotlabs/Lib/ThreadItem.php:204
msgid "Select"
msgstr ""
#: ../../include/conversation.php:730 ../../include/conversation.php:784
-#: ../../Zotlabs/Module/Article_edit.php:128
+#: ../../Zotlabs/Module/Tokens.php:295
+#: ../../Zotlabs/Module/Article_edit.php:128 ../../Zotlabs/Module/Group.php:251
#: ../../Zotlabs/Module/Card_edit.php:130 ../../Zotlabs/Module/Oauth.php:172
#: ../../Zotlabs/Module/Editwebpage.php:167 ../../Zotlabs/Module/Cdav.php:1055
#: ../../Zotlabs/Module/Cdav.php:1389 ../../Zotlabs/Module/Webpages.php:254
#: ../../Zotlabs/Module/Admin/Accounts.php:320
#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Admin/Profs.php:176 ../../Zotlabs/Module/Blocks.php:162
+#: ../../Zotlabs/Module/Admin/Profs.php:176
+#: ../../Zotlabs/Module/Permcats.php:232
+#: ../../Zotlabs/Module/Contactedit.php:660 ../../Zotlabs/Module/Blocks.php:162
#: ../../Zotlabs/Module/Editblock.php:139
-#: ../../Zotlabs/Module/Editlayout.php:138
-#: ../../Zotlabs/Module/Connections.php:329
-#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Profiles.php:801
-#: ../../Zotlabs/Module/Oauth2.php:193 ../../Zotlabs/Module/Thing.php:269
-#: ../../Zotlabs/Module/Connedit.php:653 ../../Zotlabs/Module/Connedit.php:925
-#: ../../Zotlabs/Lib/Apps.php:595 ../../Zotlabs/Lib/ThreadItem.php:171
-#: ../../Zotlabs/Storage/Browser.php:384
+#: ../../Zotlabs/Module/Editlayout.php:138 ../../Zotlabs/Module/Photos.php:1185
+#: ../../Zotlabs/Module/Profiles.php:816 ../../Zotlabs/Module/Oauth2.php:193
+#: ../../Zotlabs/Module/Thing.php:269 ../../Zotlabs/Module/Connedit.php:540
+#: ../../Zotlabs/Module/Connedit.php:749 ../../Zotlabs/Lib/Apps.php:596
+#: ../../Zotlabs/Lib/ThreadItem.php:194 ../../Zotlabs/Storage/Browser.php:384
msgid "Delete"
msgstr ""
-#: ../../include/conversation.php:736 ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../include/conversation.php:736 ../../Zotlabs/Lib/ThreadItem.php:297
msgid "Toggle Star Status"
msgstr ""
-#: ../../include/conversation.php:742 ../../Zotlabs/Lib/ThreadItem.php:103
+#: ../../include/conversation.php:742
msgid "Private Message"
msgstr ""
#: ../../include/conversation.php:751 ../../Zotlabs/Widget/Pinned.php:88
-#: ../../Zotlabs/Lib/ThreadItem.php:285
+#: ../../Zotlabs/Lib/ThreadItem.php:308
msgid "Message signature validated"
msgstr ""
#: ../../include/conversation.php:752 ../../Zotlabs/Widget/Pinned.php:89
-#: ../../Zotlabs/Lib/ThreadItem.php:286
+#: ../../Zotlabs/Lib/ThreadItem.php:309
msgid "Message signature incorrect"
msgstr ""
#: ../../include/conversation.php:783
#: ../../Zotlabs/Module/Admin/Accounts.php:318
-#: ../../Zotlabs/Module/Connections.php:343
+#: ../../Zotlabs/Module/Connections.php:349
+#: ../../Zotlabs/Module/Connections.php:400
msgid "Approve"
msgstr ""
@@ -5706,19 +5660,19 @@ msgid "Filed under:"
msgstr ""
#: ../../include/conversation.php:817 ../../Zotlabs/Widget/Pinned.php:132
-#: ../../Zotlabs/Lib/ThreadItem.php:430
+#: ../../Zotlabs/Lib/ThreadItem.php:454
#, php-format
msgid "from %s"
msgstr ""
#: ../../include/conversation.php:820 ../../Zotlabs/Widget/Pinned.php:135
-#: ../../Zotlabs/Lib/ThreadItem.php:433
+#: ../../Zotlabs/Lib/ThreadItem.php:457
#, php-format
msgid "last edited: %s"
msgstr ""
#: ../../include/conversation.php:821 ../../Zotlabs/Widget/Pinned.php:136
-#: ../../Zotlabs/Lib/ThreadItem.php:434
+#: ../../Zotlabs/Lib/ThreadItem.php:458
#, php-format
msgid "Expires: %s"
msgstr ""
@@ -5727,8 +5681,8 @@ msgstr ""
msgid "View in context"
msgstr ""
-#: ../../include/conversation.php:838 ../../Zotlabs/Module/Photos.php:1079
-#: ../../Zotlabs/Lib/ThreadItem.php:503
+#: ../../include/conversation.php:838 ../../Zotlabs/Module/Photos.php:1085
+#: ../../Zotlabs/Lib/ThreadItem.php:527
msgid "Please wait"
msgstr ""
@@ -5740,7 +5694,7 @@ msgstr ""
msgid "Loading..."
msgstr ""
-#: ../../include/conversation.php:943 ../../Zotlabs/Lib/ThreadItem.php:302
+#: ../../include/conversation.php:943 ../../Zotlabs/Lib/ThreadItem.php:325
msgid "Conversation Features"
msgstr ""
@@ -5760,464 +5714,464 @@ msgstr ""
msgid "Unfollow Thread"
msgstr ""
-#: ../../include/conversation.php:1096 ../../Zotlabs/Module/Connedit.php:614
+#: ../../include/conversation.php:1098 ../../Zotlabs/Module/Connedit.php:501
msgid "Recent Activity"
msgstr ""
-#: ../../include/conversation.php:1106 ../../include/connections.php:110
-#: ../../include/channel.php:1566 ../../Zotlabs/Widget/Suggestions.php:46
+#: ../../include/conversation.php:1110 ../../include/connections.php:112
+#: ../../include/channel.php:1610 ../../Zotlabs/Widget/Suggestions.php:46
#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Module/Directory.php:369
-#: ../../Zotlabs/Module/Connections.php:350 ../../Zotlabs/Module/Suggest.php:69
+#: ../../Zotlabs/Module/Connections.php:356 ../../Zotlabs/Module/Suggest.php:69
msgid "Connect"
msgstr ""
-#: ../../include/conversation.php:1116
+#: ../../include/conversation.php:1122
msgid "Edit Connection"
msgstr ""
-#: ../../include/conversation.php:1126
+#: ../../include/conversation.php:1134
#: ../../Zotlabs/Module/Admin/Accounts.php:347
msgid "Message"
msgstr ""
-#: ../../include/conversation.php:1136 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1146 ../../Zotlabs/Module/Pubsites.php:35
msgid "Ratings"
msgstr ""
-#: ../../include/conversation.php:1146 ../../Zotlabs/Module/Poke.php:197
-#: ../../Zotlabs/Lib/Apps.php:354
+#: ../../include/conversation.php:1158 ../../Zotlabs/Module/Poke.php:197
+#: ../../Zotlabs/Lib/Apps.php:355
msgid "Poke"
msgstr ""
-#: ../../include/conversation.php:1268
+#: ../../include/conversation.php:1282
#, php-format
msgid "%s likes this."
msgstr ""
-#: ../../include/conversation.php:1268
+#: ../../include/conversation.php:1282
#, php-format
msgid "%s doesn't like this."
msgstr ""
-#: ../../include/conversation.php:1272
+#: ../../include/conversation.php:1286
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgid_plural "<span %1$s>%2$d people</span> like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1274
+#: ../../include/conversation.php:1288
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgid_plural "<span %1$s>%2$d people</span> don't like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1280
+#: ../../include/conversation.php:1294
msgid "and"
msgstr ""
-#: ../../include/conversation.php:1283
+#: ../../include/conversation.php:1297
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1284
+#: ../../include/conversation.php:1298
#, php-format
msgid "%s like this."
msgstr ""
-#: ../../include/conversation.php:1284
+#: ../../include/conversation.php:1298
#, php-format
msgid "%s don't like this."
msgstr ""
-#: ../../include/conversation.php:1468
+#: ../../include/conversation.php:1482
msgid "Toggle poll"
msgstr ""
-#: ../../include/conversation.php:1469
+#: ../../include/conversation.php:1483
msgid "Option"
msgstr ""
-#: ../../include/conversation.php:1470
+#: ../../include/conversation.php:1484
msgid "Add option"
msgstr ""
-#: ../../include/conversation.php:1471
+#: ../../include/conversation.php:1485
msgid "Minutes"
msgstr ""
-#: ../../include/conversation.php:1471
+#: ../../include/conversation.php:1485
msgid "Hours"
msgstr ""
-#: ../../include/conversation.php:1471
+#: ../../include/conversation.php:1485
msgid "Days"
msgstr ""
-#: ../../include/conversation.php:1472
+#: ../../include/conversation.php:1486
msgid "Allow multiple answers"
msgstr ""
-#: ../../include/conversation.php:1482
+#: ../../include/conversation.php:1496
msgid "Summary (optional)"
msgstr ""
-#: ../../include/conversation.php:1754 ../../include/taxonomy.php:670
-#: ../../include/channel.php:1729 ../../Zotlabs/Module/Photos.php:1136
-#: ../../Zotlabs/Lib/ThreadItem.php:243
+#: ../../include/conversation.php:1768 ../../include/taxonomy.php:670
+#: ../../include/channel.php:1774 ../../Zotlabs/Module/Photos.php:1142
+#: ../../Zotlabs/Lib/ThreadItem.php:266
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1757 ../../Zotlabs/Module/Photos.php:1141
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../include/conversation.php:1771 ../../Zotlabs/Module/Photos.php:1147
+#: ../../Zotlabs/Lib/ThreadItem.php:271
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1760
+#: ../../include/conversation.php:1774
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1763
+#: ../../include/conversation.php:1777
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1766
+#: ../../include/conversation.php:1780
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1769
+#: ../../include/conversation.php:1783
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1772
+#: ../../include/conversation.php:1786
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1775
+#: ../../include/conversation.php:1789
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/selectors.php:18
-msgid "Profile to assign new connections"
+#: ../../include/selectors.php:17
+msgid "Select a profile to assign to this contact"
msgstr ""
-#: ../../include/selectors.php:41
+#: ../../include/selectors.php:45
msgid "Frequently"
msgstr ""
-#: ../../include/selectors.php:42
+#: ../../include/selectors.php:46
msgid "Hourly"
msgstr ""
-#: ../../include/selectors.php:43
+#: ../../include/selectors.php:47
msgid "Twice daily"
msgstr ""
-#: ../../include/selectors.php:44
+#: ../../include/selectors.php:48
msgid "Daily"
msgstr ""
-#: ../../include/selectors.php:45
+#: ../../include/selectors.php:49
msgid "Weekly"
msgstr ""
-#: ../../include/selectors.php:46
+#: ../../include/selectors.php:50
msgid "Monthly"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Currently Male"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Currently Female"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Mostly Male"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Mostly Female"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Transgender"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Intersex"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Transsexual"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Hermaphrodite"
msgstr ""
-#: ../../include/selectors.php:60 ../../include/channel.php:1674
+#: ../../include/selectors.php:64 ../../include/channel.php:1719
msgid "Neuter"
msgstr ""
-#: ../../include/selectors.php:60 ../../include/channel.php:1676
+#: ../../include/selectors.php:64 ../../include/channel.php:1721
msgid "Non-specific"
msgstr ""
-#: ../../include/selectors.php:60
+#: ../../include/selectors.php:64
msgid "Undecided"
msgstr ""
-#: ../../include/selectors.php:96 ../../include/selectors.php:115
+#: ../../include/selectors.php:100 ../../include/selectors.php:119
msgid "Males"
msgstr ""
-#: ../../include/selectors.php:96 ../../include/selectors.php:115
+#: ../../include/selectors.php:100 ../../include/selectors.php:119
msgid "Females"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Gay"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Lesbian"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "No Preference"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Bisexual"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Autosexual"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Abstinent"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Virgin"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Deviant"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Fetish"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Oodles"
msgstr ""
-#: ../../include/selectors.php:96
+#: ../../include/selectors.php:100
msgid "Nonsexual"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Single"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Lonely"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Available"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Unavailable"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Has crush"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Infatuated"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Dating"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Unfaithful"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Sex Addict"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/channel.php:457
-#: ../../include/channel.php:460 ../../Zotlabs/Widget/Affinity.php:32
-#: ../../Zotlabs/Module/Settings/Channel.php:71
-#: ../../Zotlabs/Module/Settings/Channel.php:75
-#: ../../Zotlabs/Module/Settings/Channel.php:76
-#: ../../Zotlabs/Module/Settings/Channel.php:79
-#: ../../Zotlabs/Module/Settings/Channel.php:90
-#: ../../Zotlabs/Module/Connedit.php:710
+#: ../../include/selectors.php:138 ../../include/channel.php:456
+#: ../../include/channel.php:459 ../../Zotlabs/Widget/Affinity.php:32
+#: ../../Zotlabs/Module/Contactedit.php:297
+#: ../../Zotlabs/Module/Connedit.php:581
msgid "Friends"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Friends/Benefits"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Casual"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Engaged"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Married"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Imaginarily married"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Partners"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Cohabiting"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Common law"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Happy"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Not looking"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Swinger"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Betrayed"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Separated"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Unstable"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Divorced"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Imaginarily divorced"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "Widowed"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Uncertain"
msgstr ""
-#: ../../include/selectors.php:134 ../../include/selectors.php:151
+#: ../../include/selectors.php:138 ../../include/selectors.php:155
msgid "It's complicated"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Don't care"
msgstr ""
-#: ../../include/selectors.php:134
+#: ../../include/selectors.php:138
msgid "Ask me"
msgstr ""
-#: ../../include/connections.php:134
+#: ../../include/connections.php:136
msgid "New window"
msgstr ""
-#: ../../include/connections.php:135
+#: ../../include/connections.php:137
msgid "Open the selected location in a different window or browser tab"
msgstr ""
-#: ../../include/group.php:23 ../../Zotlabs/Lib/Group.php:28
+#: ../../include/group.php:23
msgid ""
"A deleted group with this name was revived. Existing item permissions "
"<strong>may</strong> apply to this group and any future members. If this is "
"not what you intended, please create another group with a different name."
msgstr ""
-#: ../../include/group.php:271 ../../Zotlabs/Lib/Group.php:270
+#: ../../include/group.php:271
msgid "Add new connections to this privacy group"
msgstr ""
-#: ../../include/group.php:305 ../../Zotlabs/Lib/AccessList.php:311
-#: ../../Zotlabs/Lib/Group.php:302
+#: ../../include/group.php:305
msgid "edit"
msgstr ""
-#: ../../include/group.php:328 ../../Zotlabs/Lib/Group.php:325
+#: ../../include/group.php:327 ../../include/acl_selectors.php:87
+#: ../../Zotlabs/Widget/Activity_filter.php:88
+#: ../../Zotlabs/Module/Group.php:143 ../../Zotlabs/Lib/Apps.php:368
+msgid "Privacy Groups"
+msgstr ""
+
+#: ../../include/group.php:328
msgid "Edit group"
msgstr ""
-#: ../../include/group.php:329 ../../Zotlabs/Lib/Group.php:326
-msgid "Add privacy group"
+#: ../../include/group.php:329
+msgid "Manage privacy groups"
msgstr ""
-#: ../../include/group.php:330 ../../Zotlabs/Lib/Group.php:327
+#: ../../include/group.php:330
msgid "Channels not in any privacy group"
msgstr ""
#: ../../include/group.php:332 ../../Zotlabs/Widget/Savedsearch.php:84
-#: ../../Zotlabs/Lib/AccessList.php:336 ../../Zotlabs/Lib/Group.php:329
msgid "add"
msgstr ""
@@ -6250,7 +6204,7 @@ msgstr ""
msgid "wants"
msgstr ""
-#: ../../include/taxonomy.php:584 ../../Zotlabs/Lib/ThreadItem.php:318
+#: ../../include/taxonomy.php:584 ../../Zotlabs/Lib/ThreadItem.php:341
msgid "like"
msgstr ""
@@ -6258,7 +6212,7 @@ msgstr ""
msgid "likes"
msgstr ""
-#: ../../include/taxonomy.php:585 ../../Zotlabs/Lib/ThreadItem.php:319
+#: ../../include/taxonomy.php:585 ../../Zotlabs/Lib/ThreadItem.php:342
msgid "dislike"
msgstr ""
@@ -6270,100 +6224,106 @@ msgstr ""
msgid "(Unknown)"
msgstr ""
-#: ../../include/items.php:1243
+#: ../../include/items.php:1246
msgid "Visible to anybody on the internet."
msgstr ""
-#: ../../include/items.php:1245
+#: ../../include/items.php:1248
msgid "Visible to you only."
msgstr ""
-#: ../../include/items.php:1247
+#: ../../include/items.php:1250
msgid "Visible to anybody in this network."
msgstr ""
-#: ../../include/items.php:1249
+#: ../../include/items.php:1252
msgid "Visible to anybody authenticated."
msgstr ""
-#: ../../include/items.php:1251
+#: ../../include/items.php:1254
#, php-format
msgid "Visible to anybody on %s."
msgstr ""
-#: ../../include/items.php:1253
+#: ../../include/items.php:1256
msgid "Visible to all connections."
msgstr ""
-#: ../../include/items.php:1255
+#: ../../include/items.php:1258
msgid "Visible to approved connections."
msgstr ""
-#: ../../include/items.php:1257
+#: ../../include/items.php:1260
msgid "Visible to specific connections."
msgstr ""
-#: ../../include/items.php:4241 ../../Zotlabs/Module/Group.php:62
-#: ../../Zotlabs/Module/Group.php:212
+#: ../../include/items.php:3322 ../../Zotlabs/Module/Share.php:104
+#: ../../Zotlabs/Lib/Activity.php:2310
+#, php-format
+msgid "&#x1f501; Repeated %1$s's %2$s"
+msgstr ""
+
+#: ../../include/items.php:4381 ../../Zotlabs/Module/Group.php:62
+#: ../../Zotlabs/Module/Group.php:206
msgid "Privacy group not found."
msgstr ""
-#: ../../include/items.php:4257
+#: ../../include/items.php:4397
msgid "Privacy group is empty."
msgstr ""
-#: ../../include/items.php:4264
+#: ../../include/items.php:4404
#, php-format
msgid "Privacy group: %s"
msgstr ""
-#: ../../include/items.php:4274 ../../Zotlabs/Module/Connedit.php:852
+#: ../../include/items.php:4414
#, php-format
msgid "Connection: %s"
msgstr ""
-#: ../../include/items.php:4276
+#: ../../include/items.php:4416
msgid "Connection not found."
msgstr ""
-#: ../../include/items.php:4622 ../../Zotlabs/Module/Cover_photo.php:297
+#: ../../include/items.php:4762 ../../Zotlabs/Module/Cover_photo.php:297
msgid "female"
msgstr ""
-#: ../../include/items.php:4623 ../../Zotlabs/Module/Cover_photo.php:298
+#: ../../include/items.php:4763 ../../Zotlabs/Module/Cover_photo.php:298
#, php-format
msgid "%1$s updated her %2$s"
msgstr ""
-#: ../../include/items.php:4624 ../../Zotlabs/Module/Cover_photo.php:299
+#: ../../include/items.php:4764 ../../Zotlabs/Module/Cover_photo.php:299
msgid "male"
msgstr ""
-#: ../../include/items.php:4625 ../../Zotlabs/Module/Cover_photo.php:300
+#: ../../include/items.php:4765 ../../Zotlabs/Module/Cover_photo.php:300
#, php-format
msgid "%1$s updated his %2$s"
msgstr ""
-#: ../../include/items.php:4627 ../../Zotlabs/Module/Cover_photo.php:302
+#: ../../include/items.php:4767 ../../Zotlabs/Module/Cover_photo.php:302
#, php-format
msgid "%1$s updated their %2$s"
msgstr ""
-#: ../../include/items.php:4629
+#: ../../include/items.php:4769
msgid "profile photo"
msgstr ""
-#: ../../include/items.php:4821
+#: ../../include/items.php:4962
#, php-format
msgid "[Edited %s]"
msgstr ""
-#: ../../include/items.php:4821
+#: ../../include/items.php:4962
msgctxt "edit_activity"
msgid "Post"
msgstr ""
-#: ../../include/items.php:4821
+#: ../../include/items.php:4962
msgctxt "edit_activity"
msgid "Comment"
msgstr ""
@@ -6465,8 +6425,8 @@ msgid "please come back"
msgstr ""
#: ../../include/photo/photo_driver.php:434
-#: ../../Zotlabs/Module/Profile_photo.php:147
-#: ../../Zotlabs/Module/Profile_photo.php:284
+#: ../../Zotlabs/Module/Profile_photo.php:167
+#: ../../Zotlabs/Module/Profile_photo.php:337
msgid "Profile Photos"
msgstr ""
@@ -6547,31 +6507,31 @@ msgstr ""
msgid "%1$s's bookmarks"
msgstr ""
-#: ../../include/menu.php:120 ../../include/channel.php:1486
-#: ../../include/channel.php:1490 ../../Zotlabs/Widget/Cdav.php:138
+#: ../../include/menu.php:120 ../../include/channel.php:1530
+#: ../../include/channel.php:1534 ../../Zotlabs/Widget/Cdav.php:138
#: ../../Zotlabs/Widget/Cdav.php:175 ../../Zotlabs/Module/Article_edit.php:97
-#: ../../Zotlabs/Module/Group.php:251 ../../Zotlabs/Module/Card_edit.php:99
+#: ../../Zotlabs/Module/Group.php:245 ../../Zotlabs/Module/Card_edit.php:99
#: ../../Zotlabs/Module/Oauth.php:171 ../../Zotlabs/Module/Editwebpage.php:142
#: ../../Zotlabs/Module/Webpages.php:252
#: ../../Zotlabs/Module/Admin/Profs.php:175 ../../Zotlabs/Module/Blocks.php:160
#: ../../Zotlabs/Module/Editblock.php:114
#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Connections.php:321
-#: ../../Zotlabs/Module/Connections.php:363
-#: ../../Zotlabs/Module/Connections.php:383 ../../Zotlabs/Module/Menu.php:176
+#: ../../Zotlabs/Module/Connections.php:329
+#: ../../Zotlabs/Module/Connections.php:378
+#: ../../Zotlabs/Module/Connections.php:399 ../../Zotlabs/Module/Menu.php:176
#: ../../Zotlabs/Module/Oauth2.php:192 ../../Zotlabs/Module/Thing.php:268
#: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:381
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Lib/Apps.php:594
-#: ../../Zotlabs/Lib/ThreadItem.php:149
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Lib/Apps.php:595
+#: ../../Zotlabs/Lib/ThreadItem.php:172
msgid "Edit"
msgstr ""
#: ../../include/bbcode.php:233 ../../include/bbcode.php:928
-#: ../../include/bbcode.php:1546 ../../include/bbcode.php:1554
+#: ../../include/bbcode.php:1549 ../../include/bbcode.php:1557
msgid "Image/photo"
msgstr ""
-#: ../../include/bbcode.php:280 ../../include/bbcode.php:1571
+#: ../../include/bbcode.php:280 ../../include/bbcode.php:1574
msgid "Encrypted content"
msgstr ""
@@ -6587,19 +6547,19 @@ msgid ""
"to install it on this site."
msgstr ""
-#: ../../include/bbcode.php:348 ../../Zotlabs/Module/Impel.php:43
+#: ../../include/bbcode.php:348 ../../Zotlabs/Module/Impel.php:47
msgid "webpage"
msgstr ""
-#: ../../include/bbcode.php:351 ../../Zotlabs/Module/Impel.php:53
+#: ../../include/bbcode.php:351 ../../Zotlabs/Module/Impel.php:57
msgid "layout"
msgstr ""
-#: ../../include/bbcode.php:354 ../../Zotlabs/Module/Impel.php:48
+#: ../../include/bbcode.php:354 ../../Zotlabs/Module/Impel.php:52
msgid "block"
msgstr ""
-#: ../../include/bbcode.php:357 ../../Zotlabs/Module/Impel.php:60
+#: ../../include/bbcode.php:357 ../../Zotlabs/Module/Impel.php:64
msgid "menu"
msgstr ""
@@ -6632,239 +6592,240 @@ msgstr ""
msgid "View summary"
msgstr ""
-#: ../../include/bbcode.php:1050 ../../include/bbcode.php:1238
-#: ../../Zotlabs/Lib/NativeWikiPage.php:618
+#: ../../include/bbcode.php:1050 ../../include/bbcode.php:1235
+#: ../../Zotlabs/Lib/NativeWikiPage.php:624
msgid "Different viewers will see this text differently"
msgstr ""
-#: ../../include/bbcode.php:1522
+#: ../../include/bbcode.php:1525
msgid "$1 wrote:"
msgstr ""
-#: ../../include/channel.php:46
+#: ../../include/channel.php:48
msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../include/channel.php:79
+#: ../../include/channel.php:81
msgid "Empty name"
msgstr ""
-#: ../../include/channel.php:82
+#: ../../include/channel.php:84
msgid "Name too long"
msgstr ""
-#: ../../include/channel.php:199
+#: ../../include/channel.php:201
msgid "No account identifier"
msgstr ""
-#: ../../include/channel.php:211 ../../Zotlabs/Module/Register.php:95
+#: ../../include/channel.php:213 ../../Zotlabs/Module/Register.php:95
msgid "Nickname is required."
msgstr ""
-#: ../../include/channel.php:225 ../../include/channel.php:657
+#: ../../include/channel.php:227 ../../include/channel.php:659
#: ../../Zotlabs/Module/Register.php:100 ../../Zotlabs/Module/Changeaddr.php:46
msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../include/channel.php:230 ../../include/channel.php:662
+#: ../../include/channel.php:232 ../../include/channel.php:664
#: ../../Zotlabs/Module/Register.php:105 ../../Zotlabs/Module/Changeaddr.php:51
msgid ""
"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../include/channel.php:290
+#: ../../include/channel.php:292
msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../include/channel.php:393
+#: ../../include/channel.php:402
msgid "Default Profile"
msgstr ""
-#: ../../include/channel.php:590 ../../include/channel.php:679
+#: ../../include/channel.php:592 ../../include/channel.php:681
msgid "Unable to retrieve modified identity"
msgstr ""
-#: ../../include/channel.php:1330
+#: ../../include/channel.php:1373
msgid "Requested channel is not available"
msgstr ""
-#: ../../include/channel.php:1479 ../../Zotlabs/Module/Profiles.php:729
+#: ../../include/channel.php:1523 ../../Zotlabs/Module/Profiles.php:744
msgid "Change profile photo"
msgstr ""
-#: ../../include/channel.php:1487
+#: ../../include/channel.php:1531
msgid "Create New Profile"
msgstr ""
-#: ../../include/channel.php:1505 ../../Zotlabs/Module/Profiles.php:821
+#: ../../include/channel.php:1549 ../../Zotlabs/Module/Profiles.php:841
msgid "Profile Image"
msgstr ""
-#: ../../include/channel.php:1508
+#: ../../include/channel.php:1552
msgid "Visible to everybody"
msgstr ""
-#: ../../include/channel.php:1509 ../../Zotlabs/Module/Profiles.php:726
-#: ../../Zotlabs/Module/Profiles.php:825
+#: ../../include/channel.php:1553 ../../Zotlabs/Module/Profiles.php:741
+#: ../../Zotlabs/Module/Profiles.php:845
msgid "Edit visibility"
msgstr ""
-#: ../../include/channel.php:1585 ../../include/channel.php:1713
+#: ../../include/channel.php:1629 ../../include/channel.php:1758
msgid "Gender:"
msgstr ""
-#: ../../include/channel.php:1586 ../../include/channel.php:1757
+#: ../../include/channel.php:1630 ../../include/channel.php:1802
msgid "Status:"
msgstr ""
-#: ../../include/channel.php:1587 ../../include/channel.php:1781
+#: ../../include/channel.php:1631 ../../include/channel.php:1826
msgid "Homepage:"
msgstr ""
-#: ../../include/channel.php:1588
+#: ../../include/channel.php:1632 ../../include/channel.php:1828
+#: ../../Zotlabs/Module/Directory.php:366
+msgid "Hometown:"
+msgstr ""
+
+#: ../../include/channel.php:1633
msgid "Online Now"
msgstr ""
-#: ../../include/channel.php:1641
+#: ../../include/channel.php:1686
msgid "Change your profile photo"
msgstr ""
-#: ../../include/channel.php:1672
+#: ../../include/channel.php:1717
msgid "Trans"
msgstr ""
-#: ../../include/channel.php:1711 ../../Zotlabs/Module/Settings/Channel.php:501
+#: ../../include/channel.php:1756
msgid "Full Name:"
msgstr ""
-#: ../../include/channel.php:1718
+#: ../../include/channel.php:1763
msgid "Like this channel"
msgstr ""
-#: ../../include/channel.php:1742
+#: ../../include/channel.php:1787
msgid "j F, Y"
msgstr ""
-#: ../../include/channel.php:1743
+#: ../../include/channel.php:1788
msgid "j F"
msgstr ""
-#: ../../include/channel.php:1750
+#: ../../include/channel.php:1795
msgid "Birthday:"
msgstr ""
-#: ../../include/channel.php:1754 ../../Zotlabs/Module/Directory.php:348
+#: ../../include/channel.php:1799 ../../Zotlabs/Module/Directory.php:348
msgid "Age:"
msgstr ""
-#: ../../include/channel.php:1763
+#: ../../include/channel.php:1808
#, php-format
msgid "for %1$d %2$s"
msgstr ""
-#: ../../include/channel.php:1775
+#: ../../include/channel.php:1820
msgid "Tags:"
msgstr ""
-#: ../../include/channel.php:1779
+#: ../../include/channel.php:1824
msgid "Sexual Preference:"
msgstr ""
-#: ../../include/channel.php:1783 ../../Zotlabs/Module/Directory.php:366
-msgid "Hometown:"
-msgstr ""
-
-#: ../../include/channel.php:1785
+#: ../../include/channel.php:1830
msgid "Political Views:"
msgstr ""
-#: ../../include/channel.php:1787
+#: ../../include/channel.php:1832
msgid "Religion:"
msgstr ""
-#: ../../include/channel.php:1789 ../../Zotlabs/Module/Directory.php:368
+#: ../../include/channel.php:1834 ../../Zotlabs/Module/Directory.php:368
msgid "About:"
msgstr ""
-#: ../../include/channel.php:1791
+#: ../../include/channel.php:1836
msgid "Hobbies/Interests:"
msgstr ""
-#: ../../include/channel.php:1793
+#: ../../include/channel.php:1838
msgid "Likes:"
msgstr ""
-#: ../../include/channel.php:1795
+#: ../../include/channel.php:1840
msgid "Dislikes:"
msgstr ""
-#: ../../include/channel.php:1797
+#: ../../include/channel.php:1842
msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../include/channel.php:1799
+#: ../../include/channel.php:1844
msgid "My other channels:"
msgstr ""
-#: ../../include/channel.php:1801
+#: ../../include/channel.php:1846
msgid "Musical interests:"
msgstr ""
-#: ../../include/channel.php:1803
+#: ../../include/channel.php:1848
msgid "Books, literature:"
msgstr ""
-#: ../../include/channel.php:1805
+#: ../../include/channel.php:1850
msgid "Television:"
msgstr ""
-#: ../../include/channel.php:1807
+#: ../../include/channel.php:1852
msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../include/channel.php:1809
+#: ../../include/channel.php:1854
msgid "Love/Romance:"
msgstr ""
-#: ../../include/channel.php:1811
+#: ../../include/channel.php:1856
msgid "Work/employment:"
msgstr ""
-#: ../../include/channel.php:1813
+#: ../../include/channel.php:1858
msgid "School/education:"
msgstr ""
-#: ../../include/channel.php:1834 ../../Zotlabs/Module/Profperm.php:113
-#: ../../Zotlabs/Lib/Apps.php:365
+#: ../../include/channel.php:1879 ../../Zotlabs/Module/Profperm.php:113
+#: ../../Zotlabs/Lib/Apps.php:366
msgid "Profile"
msgstr ""
-#: ../../include/channel.php:1836
+#: ../../include/channel.php:1881
msgid "Like this thing"
msgstr ""
-#: ../../include/channel.php:1837
+#: ../../include/channel.php:1882
msgid "Export"
msgstr ""
-#: ../../include/channel.php:2276 ../../Zotlabs/Module/Cover_photo.php:304
+#: ../../include/channel.php:2335 ../../Zotlabs/Module/Cover_photo.php:304
msgid "cover photo"
msgstr ""
-#: ../../include/channel.php:2545 ../../Zotlabs/Module/Rmagic.php:96
-#: ../../boot.php:1726
+#: ../../include/channel.php:2610 ../../Zotlabs/Module/Rmagic.php:96
+#: ../../boot.php:1739
msgid "Remote Authentication"
msgstr ""
-#: ../../include/channel.php:2546 ../../Zotlabs/Module/Rmagic.php:97
+#: ../../include/channel.php:2611 ../../Zotlabs/Module/Rmagic.php:97
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../include/channel.php:2547 ../../Zotlabs/Module/Rmagic.php:98
+#: ../../include/channel.php:2612 ../../Zotlabs/Module/Rmagic.php:98
msgid "Authenticate"
msgstr ""
-#: ../../include/channel.php:2705 ../../Zotlabs/Module/Admin/Accounts.php:184
+#: ../../include/channel.php:2770 ../../Zotlabs/Module/Admin/Accounts.php:184
#, php-format
msgid "Account '%s' deleted"
msgstr ""
@@ -6890,6 +6851,7 @@ msgid "Forums"
msgstr ""
#: ../../include/acl_selectors.php:136
+#: ../../Zotlabs/Module/Settings/Privacy.php:56
#: ../../Zotlabs/Lib/PermissionDescription.php:107
msgid "Only me"
msgstr ""
@@ -6943,7 +6905,7 @@ msgstr ""
msgid "Embedding disabled"
msgstr ""
-#: ../../include/zid.php:403
+#: ../../include/zid.php:406
#, php-format
msgid "OpenWebAuth: %1$s welcomes %2$s"
msgstr ""
@@ -6976,6 +6938,14 @@ msgstr ""
msgid "Stream Order"
msgstr ""
+#: ../../Zotlabs/Widget/Tokens.php:35
+msgid "Add new guest"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Tokens.php:43 ../../Zotlabs/Module/Lockview.php:226
+msgid "Guest access"
+msgstr ""
+
#: ../../Zotlabs/Widget/Archive.php:43
msgid "Archives"
msgstr ""
@@ -6999,21 +6969,21 @@ msgid "Page name"
msgstr ""
#: ../../Zotlabs/Widget/Album.php:78 ../../Zotlabs/Widget/Portfolio.php:87
-#: ../../Zotlabs/Module/Embedphotos.php:171 ../../Zotlabs/Module/Photos.php:787
-#: ../../Zotlabs/Module/Photos.php:1331
+#: ../../Zotlabs/Module/Embedphotos.php:171 ../../Zotlabs/Module/Photos.php:793
+#: ../../Zotlabs/Module/Photos.php:1337
msgid "View Photo"
msgstr ""
#: ../../Zotlabs/Widget/Album.php:95 ../../Zotlabs/Widget/Portfolio.php:108
-#: ../../Zotlabs/Module/Embedphotos.php:187 ../../Zotlabs/Module/Photos.php:818
+#: ../../Zotlabs/Module/Embedphotos.php:187 ../../Zotlabs/Module/Photos.php:824
msgid "Edit Album"
msgstr ""
#: ../../Zotlabs/Widget/Album.php:97 ../../Zotlabs/Widget/Cdav.php:146
#: ../../Zotlabs/Widget/Cdav.php:182 ../../Zotlabs/Widget/Portfolio.php:110
#: ../../Zotlabs/Module/Embedphotos.php:189
-#: ../../Zotlabs/Module/Profile_photo.php:500
-#: ../../Zotlabs/Module/Cover_photo.php:423 ../../Zotlabs/Module/Photos.php:688
+#: ../../Zotlabs/Module/Profile_photo.php:543
+#: ../../Zotlabs/Module/Cover_photo.php:423 ../../Zotlabs/Module/Photos.php:692
#: ../../Zotlabs/Storage/Browser.php:540
msgid "Upload"
msgstr ""
@@ -7026,59 +6996,39 @@ msgstr ""
msgid "Public Hubs"
msgstr ""
-#: ../../Zotlabs/Widget/Conversations.php:15
-msgid "Received Messages"
-msgstr ""
-
-#: ../../Zotlabs/Widget/Conversations.php:19
-msgid "Sent Messages"
-msgstr ""
-
-#: ../../Zotlabs/Widget/Conversations.php:23
-msgid "Conversations"
-msgstr ""
-
-#: ../../Zotlabs/Widget/Conversations.php:33
-msgid "No messages."
-msgstr ""
-
-#: ../../Zotlabs/Widget/Conversations.php:53
-msgid "Delete conversation"
-msgstr ""
-
#: ../../Zotlabs/Widget/Chatroom_members.php:11
msgid "Chat Members"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:206
+#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:229
msgid "I will attend"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:206
+#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:229
msgid "I will not attend"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:206
+#: ../../Zotlabs/Widget/Pinned.php:70 ../../Zotlabs/Lib/ThreadItem.php:229
msgid "I might attend"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:220
+#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:243
msgid "I agree"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:220
+#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:243
msgid "I disagree"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:220
+#: ../../Zotlabs/Widget/Pinned.php:81 ../../Zotlabs/Lib/ThreadItem.php:243
msgid "I abstain"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:99 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Widget/Pinned.php:99 ../../Zotlabs/Lib/ThreadItem.php:353
msgid "Share This"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:99 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Widget/Pinned.php:99 ../../Zotlabs/Lib/ThreadItem.php:353
msgid "share"
msgstr ""
@@ -7087,20 +7037,20 @@ msgstr ""
msgid "View %s's profile - %s"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:127 ../../Zotlabs/Widget/Messages.php:93
-#: ../../Zotlabs/Lib/ThreadItem.php:414
+#: ../../Zotlabs/Widget/Pinned.php:127 ../../Zotlabs/Widget/Messages.php:99
+#: ../../Zotlabs/Lib/ThreadItem.php:438
msgid "via"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:141 ../../Zotlabs/Lib/ThreadItem.php:445
+#: ../../Zotlabs/Widget/Pinned.php:141 ../../Zotlabs/Lib/ThreadItem.php:469
msgid "Attendance Options"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:142 ../../Zotlabs/Lib/ThreadItem.php:447
+#: ../../Zotlabs/Widget/Pinned.php:142 ../../Zotlabs/Lib/ThreadItem.php:471
msgid "Voting Options"
msgstr ""
-#: ../../Zotlabs/Widget/Pinned.php:154 ../../Zotlabs/Lib/ThreadItem.php:471
+#: ../../Zotlabs/Widget/Pinned.php:154 ../../Zotlabs/Lib/ThreadItem.php:495
msgid "Pinned post"
msgstr ""
@@ -7154,8 +7104,8 @@ msgstr ""
#: ../../Zotlabs/Module/Cdav.php:1058 ../../Zotlabs/Module/Cdav.php:1387
#: ../../Zotlabs/Module/Webpages.php:251
#: ../../Zotlabs/Module/New_channel.php:189 ../../Zotlabs/Module/Blocks.php:159
-#: ../../Zotlabs/Module/Profiles.php:799 ../../Zotlabs/Module/Menu.php:182
-#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Layouts.php:185
+#: ../../Zotlabs/Module/Profiles.php:814 ../../Zotlabs/Module/Menu.php:182
+#: ../../Zotlabs/Module/Connedit.php:747 ../../Zotlabs/Module/Layouts.php:185
#: ../../Zotlabs/Storage/Browser.php:365 ../../Zotlabs/Storage/Browser.php:538
msgid "Create"
msgstr ""
@@ -7224,11 +7174,15 @@ msgstr ""
msgid "Channel settings"
msgstr ""
-#: ../../Zotlabs/Widget/Settings_menu.php:46
+#: ../../Zotlabs/Widget/Settings_menu.php:44
+msgid "Privacy settings"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Settings_menu.php:51
msgid "Display settings"
msgstr ""
-#: ../../Zotlabs/Widget/Settings_menu.php:53
+#: ../../Zotlabs/Widget/Settings_menu.php:58
msgid "Manage locations"
msgstr ""
@@ -7257,23 +7211,23 @@ msgid "App Categories"
msgstr ""
#: ../../Zotlabs/Widget/Wiki_page_history.php:23
-#: ../../Zotlabs/Lib/NativeWikiPage.php:577
+#: ../../Zotlabs/Lib/NativeWikiPage.php:583
msgctxt "wiki_history"
msgid "Message"
msgstr ""
#: ../../Zotlabs/Widget/Wiki_page_history.php:24
-#: ../../Zotlabs/Lib/NativeWikiPage.php:578
+#: ../../Zotlabs/Lib/NativeWikiPage.php:584
msgid "Date"
msgstr ""
#: ../../Zotlabs/Widget/Wiki_page_history.php:25
-#: ../../Zotlabs/Module/Wiki.php:364 ../../Zotlabs/Lib/NativeWikiPage.php:579
+#: ../../Zotlabs/Module/Wiki.php:364 ../../Zotlabs/Lib/NativeWikiPage.php:585
msgid "Revert"
msgstr ""
#: ../../Zotlabs/Widget/Wiki_page_history.php:26
-#: ../../Zotlabs/Lib/NativeWikiPage.php:580
+#: ../../Zotlabs/Lib/NativeWikiPage.php:586
msgid "Compare"
msgstr ""
@@ -7285,20 +7239,17 @@ msgstr ""
msgid "Toggle personal notes"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:13
-msgid "Private Mail Menu"
+#: ../../Zotlabs/Widget/Permcats.php:35
+msgid "Add new role"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:15
-msgid "Combined View"
+#: ../../Zotlabs/Widget/Permcats.php:86
+#: ../../Zotlabs/Module/Contactedit.php:409
+msgid "Contact roles"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:20
-msgid "Inbox"
-msgstr ""
-
-#: ../../Zotlabs/Widget/Mailmenu.php:25
-msgid "Outbox"
+#: ../../Zotlabs/Widget/Permcats.php:87
+msgid "Role members"
msgstr ""
#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
@@ -7324,7 +7275,7 @@ msgstr ""
msgid "Security"
msgstr ""
-#: ../../Zotlabs/Widget/Admin.php:26 ../../Zotlabs/Lib/Apps.php:361
+#: ../../Zotlabs/Widget/Admin.php:26 ../../Zotlabs/Lib/Apps.php:362
msgid "Features"
msgstr ""
@@ -7467,6 +7418,14 @@ msgstr ""
msgid "Import Calendar"
msgstr ""
+#: ../../Zotlabs/Widget/Privacygroups.php:38
+msgid "Add new group"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Privacygroups.php:47
+msgid "Privacy groups"
+msgstr ""
+
#: ../../Zotlabs/Widget/Rating.php:51
msgid "Rating Tools"
msgstr ""
@@ -7483,7 +7442,7 @@ msgstr ""
msgid "Click to show more"
msgstr ""
-#: ../../Zotlabs/Widget/Follow.php:22
+#: ../../Zotlabs/Widget/Follow.php:22 ../../Zotlabs/Module/Connections.php:368
#, php-format
msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
@@ -7512,7 +7471,13 @@ msgstr ""
msgid "Starred messages"
msgstr ""
-#: ../../Zotlabs/Widget/Messages.php:28
+#: ../../Zotlabs/Widget/Messages.php:27
+#: ../../Zotlabs/Widget/Notifications.php:109
+#: ../../Zotlabs/Widget/Notifications.php:110
+msgid "Notices"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Messages.php:29
msgid "No messages"
msgstr ""
@@ -7581,21 +7546,49 @@ msgstr ""
msgid "New Member Links"
msgstr ""
-#: ../../Zotlabs/Widget/Affinity.php:30 ../../Zotlabs/Module/Connedit.php:708
+#: ../../Zotlabs/Widget/Notes.php:27
+msgid "Read mode"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Notes.php:28
+msgid "Edit mode"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Notes.php:29
+msgid "Editing"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Notes.php:30
+msgid "Saving"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Notes.php:31
+msgid "Saved"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Affinity.php:30
+#: ../../Zotlabs/Module/Contactedit.php:295
+#: ../../Zotlabs/Module/Connedit.php:579
msgid "Me"
msgstr ""
-#: ../../Zotlabs/Widget/Affinity.php:31 ../../Zotlabs/Module/Connedit.php:709
+#: ../../Zotlabs/Widget/Affinity.php:31
+#: ../../Zotlabs/Module/Contactedit.php:296
+#: ../../Zotlabs/Module/Connedit.php:580
msgid "Family"
msgstr ""
-#: ../../Zotlabs/Widget/Affinity.php:33 ../../Zotlabs/Module/Connedit.php:711
+#: ../../Zotlabs/Widget/Affinity.php:33
+#: ../../Zotlabs/Module/Contactedit.php:298
+#: ../../Zotlabs/Module/Connedit.php:582
msgid "Acquaintances"
msgstr ""
-#: ../../Zotlabs/Widget/Affinity.php:34 ../../Zotlabs/Module/Connections.php:97
+#: ../../Zotlabs/Widget/Affinity.php:34
+#: ../../Zotlabs/Module/Contactedit.php:299
+#: ../../Zotlabs/Module/Connections.php:97
#: ../../Zotlabs/Module/Connections.php:111
-#: ../../Zotlabs/Module/Connedit.php:712
+#: ../../Zotlabs/Module/Connedit.php:583
msgid "All"
msgstr ""
@@ -7681,11 +7674,6 @@ msgstr ""
msgid "New files notifications"
msgstr ""
-#: ../../Zotlabs/Widget/Notifications.php:109
-#: ../../Zotlabs/Widget/Notifications.php:110
-msgid "Notices"
-msgstr ""
-
#: ../../Zotlabs/Widget/Notifications.php:113
msgid "View all notices"
msgstr ""
@@ -7703,7 +7691,7 @@ msgid "New registrations notifications"
msgstr ""
#: ../../Zotlabs/Widget/Notifications.php:147
-#: ../../Zotlabs/Module/Pubstream.php:100 ../../Zotlabs/Lib/Apps.php:378
+#: ../../Zotlabs/Module/Pubstream.php:100 ../../Zotlabs/Lib/Apps.php:379
msgid "Public Stream"
msgstr ""
@@ -7719,76 +7707,50 @@ msgstr ""
msgid "Sorry, you have got no notifications at the moment"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:39
+#: ../../Zotlabs/Module/Tokens.php:94
#, php-format
msgid "This channel is limited to %d tokens"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:45
+#: ../../Zotlabs/Module/Tokens.php:100
msgid "Name and Password are required."
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:85
+#: ../../Zotlabs/Module/Tokens.php:215
msgid "Token saved."
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:131
+#: ../../Zotlabs/Module/Tokens.php:261
msgid ""
"Use this form to create temporary access identifiers to share things with "
"non-members. These identities may be used in Access Control Lists and "
"visitors may login using these credentials to access private content."
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:133
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
+#: ../../Zotlabs/Module/Tokens.php:274
+msgid "Please select a role for this guest!"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:168
-msgid "Guest Access Tokens"
+#: ../../Zotlabs/Module/Tokens.php:287
+msgid "Select a role for this guest"
+msgstr ""
+
+#: ../../Zotlabs/Module/Tokens.php:288 ../../Zotlabs/Lib/Apps.php:373
+msgid "Guest Access"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:175
+#: ../../Zotlabs/Module/Tokens.php:291
msgid "Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:176
+#: ../../Zotlabs/Module/Tokens.php:292
msgid "Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:177
+#: ../../Zotlabs/Module/Tokens.php:293
msgid "Expires (yyyy-mm-dd)"
msgstr ""
-#: ../../Zotlabs/Module/Tokens.php:178 ../../Zotlabs/Module/Connedit.php:892
-msgid "Their Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tokens.php:179 ../../Zotlabs/Module/Permcats.php:120
-#: ../../Zotlabs/Module/Defperms.php:265 ../../Zotlabs/Module/Connedit.php:893
-msgid "My Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tokens.php:181 ../../Zotlabs/Module/Permcats.php:122
-#: ../../Zotlabs/Module/Defperms.php:263 ../../Zotlabs/Module/Connedit.php:888
-msgid "inherited"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tokens.php:184 ../../Zotlabs/Module/Permcats.php:125
-#: ../../Zotlabs/Module/Defperms.php:268 ../../Zotlabs/Module/Connedit.php:895
-msgid "Individual Permissions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tokens.php:185 ../../Zotlabs/Module/Permcats.php:126
-#: ../../Zotlabs/Module/Connedit.php:896
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can <strong>not</strong> change those settings here."
-msgstr ""
-
#: ../../Zotlabs/Module/Article_edit.php:17
#: ../../Zotlabs/Module/Article_edit.php:33
#: ../../Zotlabs/Module/Card_edit.php:17 ../../Zotlabs/Module/Card_edit.php:33
@@ -7825,112 +7787,141 @@ msgstr ""
msgid "Can not move folder \"%s\" into itself."
msgstr ""
-#: ../../Zotlabs/Module/Network.php:107
+#: ../../Zotlabs/Module/Network.php:106
msgid "No such group"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:156
+#: ../../Zotlabs/Module/Network.php:155
msgid "No such channel"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:168 ../../Zotlabs/Module/Channel.php:235
+#: ../../Zotlabs/Module/Network.php:167 ../../Zotlabs/Module/Channel.php:232
msgid "Search Results For:"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:209 ../../Zotlabs/Module/Channel.php:270
+#: ../../Zotlabs/Module/Network.php:208 ../../Zotlabs/Module/Channel.php:267
#: ../../Zotlabs/Module/Hq.php:114 ../../Zotlabs/Module/Pubstream.php:90
-#: ../../Zotlabs/Module/Display.php:79
+#: ../../Zotlabs/Module/Display.php:87
msgid "Reset form"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:243
+#: ../../Zotlabs/Module/Network.php:242
msgid "Privacy group is empty"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:253
+#: ../../Zotlabs/Module/Network.php:252
msgid "Privacy group: "
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:68
-msgid "Nothing to import."
+#: ../../Zotlabs/Module/Import_items.php:50
+msgid "Not a zip file or zip file corrupted."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:83
-#: ../../Zotlabs/Module/Import.php:99
-msgid "Unable to download data from old server"
+#: ../../Zotlabs/Module/Import_items.php:121
+msgid "Import Items"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:77 ../../Zotlabs/Module/Import.php:106
+#: ../../Zotlabs/Module/Import_items.php:122
+msgid "Use this form to import existing posts and content from an export file."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_items.php:123
+#: ../../Zotlabs/Module/Import.php:594
+msgid "File to Upload"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_items.php:136
+#: ../../Zotlabs/Module/Import.php:107
msgid "Imported file is empty."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:93
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
+#: ../../Zotlabs/Module/Import_items.php:159
+msgid "Content import completed"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:108
-msgid "Import completed"
+#: ../../Zotlabs/Module/Import_items.php:164
+msgid "Chatroom import completed"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:125
-msgid "Import Items"
+#: ../../Zotlabs/Module/Import_items.php:170
+msgid "Channel calendar import 1/2 completed"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:126
-msgid "Use this form to import existing posts and content from an export file."
+#: ../../Zotlabs/Module/Import_items.php:176
+msgid "Channel calendar import 2/2 completed"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:127
-#: ../../Zotlabs/Module/Import.php:565
-msgid "File to Upload"
+#: ../../Zotlabs/Module/Import_items.php:181
+msgid "Menu import completed"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:162
+#: ../../Zotlabs/Module/Import_items.php:186
+msgid "Wiki import completed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_items.php:191
+msgid "Webpages import completed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:70
+msgid "Nothing to import."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:86 ../../Zotlabs/Module/Import.php:100
+msgid "Unable to download data from old server"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:163
#, php-format
msgid "Your service plan only allows %d channels."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:189
+#: ../../Zotlabs/Module/Import.php:190
msgid "No channel. Import failed."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:558
+#: ../../Zotlabs/Module/Import.php:557
+msgid ""
+"Automatic content and files import was not possible due to API version "
+"incompatiblity. Please import content and files manually!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:585
msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:563
-msgid "Import Channel"
+#: ../../Zotlabs/Module/Import.php:592
+msgid "Channel Import"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:564
+#: ../../Zotlabs/Module/Import.php:593
msgid ""
"Use this form to import an existing channel from a different server/hub. You "
"may retrieve the channel identity from the old server/hub via the network or "
"provide an export file."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:566
+#: ../../Zotlabs/Module/Import.php:595
msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:568
+#: ../../Zotlabs/Module/Import.php:597
msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:569
+#: ../../Zotlabs/Module/Import.php:598
msgid "Your old login email address"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:570
+#: ../../Zotlabs/Module/Import.php:599
msgid "Your old login password"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:571
-msgid "Import a few months of posts if possible (limited by available memory"
+#: ../../Zotlabs/Module/Import.php:600
+msgid "Import your items and files (limited by available memory)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:573
+#: ../../Zotlabs/Module/Import.php:602
msgid ""
"For either option, please choose whether to make this hub your new primary "
"address, or whether your old location should continue this role. You will be "
@@ -7938,25 +7929,25 @@ msgid ""
"location for files, photos, and media."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:575
+#: ../../Zotlabs/Module/Import.php:604
msgid "Make this hub my primary location"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:576
+#: ../../Zotlabs/Module/Import.php:605
msgid "Move this channel (disable all previous locations)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:577
+#: ../../Zotlabs/Module/Import.php:606
msgid "Use this channel nickname instead of the one provided"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:577
+#: ../../Zotlabs/Module/Import.php:606
msgid ""
"Leave blank to keep your existing channel nickname. You will be randomly "
"assigned a similar nickname if either name is already allocated on this site."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:579
+#: ../../Zotlabs/Module/Import.php:608
msgid ""
"This process may take several minutes to complete. Please submit the form "
"only once and leave this page open until finished."
@@ -8122,19 +8113,19 @@ msgid ""
"This site has exceeded the number of allowed daily account registrations."
msgstr ""
-#: ../../Zotlabs/Module/Search.php:21
+#: ../../Zotlabs/Module/Search.php:22
#: ../../Zotlabs/Module/Viewconnections.php:23
#: ../../Zotlabs/Module/Display.php:28 ../../Zotlabs/Module/Directory.php:72
-#: ../../Zotlabs/Module/Directory.php:77 ../../Zotlabs/Module/Photos.php:519
+#: ../../Zotlabs/Module/Directory.php:77 ../../Zotlabs/Module/Photos.php:523
msgid "Public access denied."
msgstr ""
-#: ../../Zotlabs/Module/Search.php:249
+#: ../../Zotlabs/Module/Search.php:239
#, php-format
msgid "Items tagged with: %s"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:251
+#: ../../Zotlabs/Module/Search.php:241
#, php-format
msgid "Search results for: %s"
msgstr ""
@@ -8177,7 +8168,7 @@ msgid "System check"
msgstr ""
#: ../../Zotlabs/Module/Setup.php:262 ../../Zotlabs/Module/Cdav.php:1035
-#: ../../Zotlabs/Module/Cal.php:204 ../../Zotlabs/Module/Photos.php:956
+#: ../../Zotlabs/Module/Cal.php:204 ../../Zotlabs/Module/Photos.php:962
msgid "Next"
msgstr ""
@@ -8635,27 +8626,27 @@ msgstr ""
msgid "View"
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:142 ../../Zotlabs/Module/Hcard.php:37
+#: ../../Zotlabs/Module/Channel.php:139 ../../Zotlabs/Module/Hcard.php:37
#: ../../Zotlabs/Module/Profile.php:62
msgid "Posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:149 ../../Zotlabs/Module/Hcard.php:44
+#: ../../Zotlabs/Module/Channel.php:146 ../../Zotlabs/Module/Hcard.php:44
#: ../../Zotlabs/Module/Profile.php:69
msgid "Only posts"
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:162 ../../Zotlabs/Module/Channel.php:184
+#: ../../Zotlabs/Module/Channel.php:159 ../../Zotlabs/Module/Channel.php:181
#: ../../Zotlabs/Module/Hq.php:39 ../../Zotlabs/Module/Pubstream.php:47
-#: ../../Zotlabs/Module/Display.php:99 ../../Zotlabs/Module/Oep.php:83
+#: ../../Zotlabs/Module/Display.php:47 ../../Zotlabs/Module/Oep.php:83
msgid "Malformed message id."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:220
+#: ../../Zotlabs/Module/Channel.php:217
msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:497 ../../Zotlabs/Module/Display.php:355
+#: ../../Zotlabs/Module/Channel.php:494 ../../Zotlabs/Module/Display.php:358
msgid ""
"You must enable javascript for your browser to be able to view this content."
msgstr ""
@@ -8681,64 +8672,60 @@ msgstr ""
msgid "All Connections"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:46
+#: ../../Zotlabs/Module/Group.php:47
msgid "Privacy group created."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:49
+#: ../../Zotlabs/Module/Group.php:50
msgid "Could not create privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:81
+#: ../../Zotlabs/Module/Group.php:82
msgid "Privacy group updated."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:141
-msgid "Add Group"
+#: ../../Zotlabs/Module/Group.php:137 ../../Zotlabs/Module/Group.php:301
+msgid "Post to this group by default"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:145
-msgid "Privacy group name"
+#: ../../Zotlabs/Module/Group.php:138 ../../Zotlabs/Module/Group.php:302
+msgid "Add new contacts to this group by default"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:146 ../../Zotlabs/Module/Group.php:255
-msgid "Members are visible to other channels"
+#: ../../Zotlabs/Module/Group.php:146
+msgid "Privacy group name"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:154 ../../Zotlabs/Module/Help.php:84
-msgid "Members"
+#: ../../Zotlabs/Module/Group.php:147 ../../Zotlabs/Module/Group.php:249
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:181
+#: ../../Zotlabs/Module/Group.php:175
msgid "Privacy group removed."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:184
+#: ../../Zotlabs/Module/Group.php:178
msgid "Unable to remove privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:250
+#: ../../Zotlabs/Module/Group.php:244
#, php-format
msgid "Privacy Group: %s"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:252
+#: ../../Zotlabs/Module/Group.php:246
msgid "Privacy group name: "
msgstr ""
-#: ../../Zotlabs/Module/Group.php:257
-msgid "Delete Group"
-msgstr ""
-
-#: ../../Zotlabs/Module/Group.php:268
+#: ../../Zotlabs/Module/Group.php:262
msgid "Group members"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:270
+#: ../../Zotlabs/Module/Group.php:264
msgid "Not in this group"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:302
+#: ../../Zotlabs/Module/Group.php:296
msgid "Click a channel to toggle membership"
msgstr ""
@@ -8816,9 +8803,9 @@ msgstr ""
#: ../../Zotlabs/Module/Oauth.php:53 ../../Zotlabs/Module/Oauth.php:135
#: ../../Zotlabs/Module/Cdav.php:1052 ../../Zotlabs/Module/Cdav.php:1388
#: ../../Zotlabs/Module/Admin/Addons.php:457
-#: ../../Zotlabs/Module/Profiles.php:800 ../../Zotlabs/Module/Oauth2.php:58
-#: ../../Zotlabs/Module/Oauth2.php:142 ../../Zotlabs/Module/Connedit.php:924
-#: ../../Zotlabs/Lib/Apps.php:539
+#: ../../Zotlabs/Module/Profiles.php:815 ../../Zotlabs/Module/Oauth2.php:58
+#: ../../Zotlabs/Module/Oauth2.php:142 ../../Zotlabs/Module/Connedit.php:748
+#: ../../Zotlabs/Lib/Apps.php:540
msgid "Update"
msgstr ""
@@ -8889,7 +8876,7 @@ msgstr ""
msgid "This directory server requires an access token"
msgstr ""
-#: ../../Zotlabs/Module/Pin.php:36 ../../Zotlabs/Module/Item.php:472
+#: ../../Zotlabs/Module/Pin.php:36 ../../Zotlabs/Module/Item.php:466
msgid "Unable to locate original post."
msgstr ""
@@ -8990,57 +8977,57 @@ msgstr ""
msgid "Failed to remove event"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:106
+#: ../../Zotlabs/Module/Like.php:112
msgid "Like/Dislike"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:112
+#: ../../Zotlabs/Module/Like.php:118
msgid "This action is restricted to members."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:113
+#: ../../Zotlabs/Module/Like.php:119
msgid ""
"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
"\"register\">register as a new $Projectname member</a> to continue."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:166 ../../Zotlabs/Module/Like.php:192
-#: ../../Zotlabs/Module/Like.php:230
+#: ../../Zotlabs/Module/Like.php:172 ../../Zotlabs/Module/Like.php:198
+#: ../../Zotlabs/Module/Like.php:236
msgid "Invalid request."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:207
+#: ../../Zotlabs/Module/Like.php:213
msgid "thing"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:253
+#: ../../Zotlabs/Module/Like.php:259
msgid "Channel unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:289
+#: ../../Zotlabs/Module/Like.php:295
msgid "Previous action reversed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:475
+#: ../../Zotlabs/Module/Like.php:481
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:477
+#: ../../Zotlabs/Module/Like.php:483
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:479
+#: ../../Zotlabs/Module/Like.php:485
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:586
+#: ../../Zotlabs/Module/Like.php:592
msgid "Action completed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:587
+#: ../../Zotlabs/Module/Like.php:593
msgid "Thank you."
msgstr ""
@@ -9093,7 +9080,7 @@ msgid "Timezone:"
msgstr ""
#: ../../Zotlabs/Module/Cdav.php:1034 ../../Zotlabs/Module/Cal.php:203
-#: ../../Zotlabs/Module/Photos.php:947
+#: ../../Zotlabs/Module/Photos.php:953
msgid "Previous"
msgstr ""
@@ -9150,73 +9137,73 @@ msgid ""
"Could not fetch calendar resource. The selected calendar might be disabled."
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1373 ../../Zotlabs/Module/Connedit.php:909
+#: ../../Zotlabs/Module/Cdav.php:1373 ../../Zotlabs/Module/Connedit.php:733
msgid "Organisation"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1375 ../../Zotlabs/Module/Profiles.php:787
-#: ../../Zotlabs/Module/Connedit.php:911
+#: ../../Zotlabs/Module/Cdav.php:1375 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Module/Connedit.php:735
msgid "Phone"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1377 ../../Zotlabs/Module/Profiles.php:789
-#: ../../Zotlabs/Module/Connedit.php:913
+#: ../../Zotlabs/Module/Cdav.php:1377 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Connedit.php:737
msgid "Instant messenger"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1378 ../../Zotlabs/Module/Profiles.php:790
-#: ../../Zotlabs/Module/Connedit.php:914
+#: ../../Zotlabs/Module/Cdav.php:1378 ../../Zotlabs/Module/Profiles.php:805
+#: ../../Zotlabs/Module/Connedit.php:738
msgid "Website"
msgstr ""
#: ../../Zotlabs/Module/Cdav.php:1379
#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Profiles.php:504 ../../Zotlabs/Module/Profiles.php:791
-#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Locs.php:127
+#: ../../Zotlabs/Module/Profiles.php:473 ../../Zotlabs/Module/Profiles.php:806
+#: ../../Zotlabs/Module/Connedit.php:739 ../../Zotlabs/Module/Locs.php:122
msgid "Address"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1380 ../../Zotlabs/Module/Profiles.php:792
-#: ../../Zotlabs/Module/Connedit.php:916
+#: ../../Zotlabs/Module/Cdav.php:1380 ../../Zotlabs/Module/Profiles.php:807
+#: ../../Zotlabs/Module/Connedit.php:740
msgid "Note"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1385 ../../Zotlabs/Module/Profiles.php:797
-#: ../../Zotlabs/Module/Connedit.php:921
+#: ../../Zotlabs/Module/Cdav.php:1385 ../../Zotlabs/Module/Profiles.php:812
+#: ../../Zotlabs/Module/Connedit.php:745
msgid "Add Contact"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1386 ../../Zotlabs/Module/Profiles.php:798
-#: ../../Zotlabs/Module/Connedit.php:922
+#: ../../Zotlabs/Module/Cdav.php:1386 ../../Zotlabs/Module/Profiles.php:813
+#: ../../Zotlabs/Module/Connedit.php:746
msgid "Add Field"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1391 ../../Zotlabs/Module/Connedit.php:927
+#: ../../Zotlabs/Module/Cdav.php:1391 ../../Zotlabs/Module/Connedit.php:751
msgid "P.O. Box"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1392 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/Cdav.php:1392 ../../Zotlabs/Module/Connedit.php:752
msgid "Additional"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1393 ../../Zotlabs/Module/Connedit.php:929
+#: ../../Zotlabs/Module/Cdav.php:1393 ../../Zotlabs/Module/Connedit.php:753
msgid "Street"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1394 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Cdav.php:1394 ../../Zotlabs/Module/Connedit.php:754
msgid "Locality"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1395 ../../Zotlabs/Module/Connedit.php:931
+#: ../../Zotlabs/Module/Cdav.php:1395 ../../Zotlabs/Module/Connedit.php:755
msgid "Region"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1396 ../../Zotlabs/Module/Connedit.php:932
+#: ../../Zotlabs/Module/Cdav.php:1396 ../../Zotlabs/Module/Connedit.php:756
msgid "ZIP Code"
msgstr ""
-#: ../../Zotlabs/Module/Cdav.php:1397 ../../Zotlabs/Module/Profiles.php:758
-#: ../../Zotlabs/Module/Connedit.php:933
+#: ../../Zotlabs/Module/Cdav.php:1397 ../../Zotlabs/Module/Profiles.php:773
+#: ../../Zotlabs/Module/Connedit.php:757
msgid "Country"
msgstr ""
@@ -9228,46 +9215,59 @@ msgstr ""
msgid "Default Addressbook"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
+#: ../../Zotlabs/Module/Lockview.php:100
+msgid "Remote privacy information not available"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Lockview.php:143 ../../Zotlabs/Module/Lockview.php:184
#: ../../Zotlabs/Module/Acl.php:123
msgctxt "acl"
msgid "Profile"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:758
+#: ../../Zotlabs/Module/Lockview.php:154 ../../Zotlabs/Module/Lockview.php:193
+msgid "Privacy group"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lockview.php:214
+#, php-format
+msgid "Click to copy link to this ressource for guest %s to clipboard"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lockview.php:214
+msgid "Link copied"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lockview.php:221
+msgid "Access"
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:748
msgid "Empty post discarded."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1192
+#: ../../Zotlabs/Module/Item.php:1188
msgid "Duplicate post suppressed."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1337
+#: ../../Zotlabs/Module/Item.php:1331
msgid "System error. Post not saved."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1371
+#: ../../Zotlabs/Module/Item.php:1365
msgid "Your comment is awaiting approval."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1505
+#: ../../Zotlabs/Module/Item.php:1498
msgid "Unable to obtain post information from database."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1512
+#: ../../Zotlabs/Module/Item.php:1505
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1519
+#: ../../Zotlabs/Module/Item.php:1512
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
@@ -9298,7 +9298,6 @@ msgid "Menu Item Permissions"
msgstr ""
#: ../../Zotlabs/Module/Mitem.php:168 ../../Zotlabs/Module/Mitem.php:247
-#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "(click to open/close)"
msgstr ""
@@ -9427,6 +9426,10 @@ msgstr ""
msgid "Documentation Search"
msgstr ""
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Members"
+msgstr ""
+
#: ../../Zotlabs/Module/Help.php:85
msgid "Administrators"
msgstr ""
@@ -9612,11 +9615,6 @@ msgstr ""
msgid "Unknown error"
msgstr ""
-#: ../../Zotlabs/Module/Share.php:104 ../../Zotlabs/Lib/Activity.php:2231
-#, php-format
-msgid "&#x1f501; Repeated %1$s's %2$s"
-msgstr ""
-
#: ../../Zotlabs/Module/Share.php:120
msgid "Post repeated"
msgstr ""
@@ -9967,12 +9965,14 @@ msgid "No verified registrations available"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:321
-#: ../../Zotlabs/Module/Connedit.php:621
+#: ../../Zotlabs/Module/Contactedit.php:632
+#: ../../Zotlabs/Module/Connedit.php:508
msgid "Block"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:322
-#: ../../Zotlabs/Module/Connedit.php:621
+#: ../../Zotlabs/Module/Contactedit.php:632
+#: ../../Zotlabs/Module/Connedit.php:508
msgid "Unblock"
msgstr ""
@@ -10252,7 +10252,7 @@ msgid "Advanced examples:"
msgstr ""
#: ../../Zotlabs/Module/Admin/Site.php:457
-#: ../../Zotlabs/Module/Settings/Channel.php:420
+#: ../../Zotlabs/Module/Settings/Channel.php:178
msgid "or"
msgstr ""
@@ -10387,7 +10387,9 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Site.php:512
#: ../../Zotlabs/Module/Admin/Site.php:513
-#: ../../Zotlabs/Module/Connedit.php:877 ../../Zotlabs/Module/Connedit.php:878
+#: ../../Zotlabs/Module/Contactedit.php:423
+#: ../../Zotlabs/Module/Contactedit.php:424
+#: ../../Zotlabs/Module/Connedit.php:706 ../../Zotlabs/Module/Connedit.php:707
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
@@ -10905,7 +10907,7 @@ msgstr ""
msgid "Install new repo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Addons.php:426 ../../Zotlabs/Lib/Apps.php:539
+#: ../../Zotlabs/Module/Admin/Addons.php:426 ../../Zotlabs/Lib/Apps.php:540
msgid "Install"
msgstr ""
@@ -10973,173 +10975,173 @@ msgid "Please enter your password for verification:"
msgstr ""
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:597
+#: ../../Zotlabs/Module/Settings/Channel.php:277
msgid "Remove Channel"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:81
+#: ../../Zotlabs/Module/Regate.php:84
msgid "Email resent"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:81
+#: ../../Zotlabs/Module/Regate.php:84
msgid "Email resend failed"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:106
+#: ../../Zotlabs/Module/Regate.php:109
msgid "Verification successful"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:150
+#: ../../Zotlabs/Module/Regate.php:153
msgid "Account successfull created"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:191
+#: ../../Zotlabs/Module/Regate.php:211
msgid "Channel successfull created"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:197
+#: ../../Zotlabs/Module/Regate.php:217
msgid "Automatic channel creation failed. Please create a channel."
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:209
+#: ../../Zotlabs/Module/Regate.php:229
msgid "Account creation error"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:221
+#: ../../Zotlabs/Module/Regate.php:241
msgid "Verify failed"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:226
+#: ../../Zotlabs/Module/Regate.php:246
msgid "Token verification failed"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:231
+#: ../../Zotlabs/Module/Regate.php:251
msgid "Request not inside time frame"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:237 ../../Zotlabs/Module/Regate.php:267
+#: ../../Zotlabs/Module/Regate.php:257 ../../Zotlabs/Module/Regate.php:287
msgid "Identity unknown"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:243
+#: ../../Zotlabs/Module/Regate.php:263
msgid "dId2 mistaken"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:271
+#: ../../Zotlabs/Module/Regate.php:291
msgid "Your Registration ID"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:284 ../../Zotlabs/Module/Regate.php:376
-#: ../../Zotlabs/Module/Regate.php:408
+#: ../../Zotlabs/Module/Regate.php:304 ../../Zotlabs/Module/Regate.php:396
+#: ../../Zotlabs/Module/Regate.php:428
msgid "Registration verification"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:291 ../../Zotlabs/Module/Regate.php:413
+#: ../../Zotlabs/Module/Regate.php:311 ../../Zotlabs/Module/Regate.php:433
msgid "Hold on, you can start verification in"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:292
+#: ../../Zotlabs/Module/Regate.php:312
msgid "Please remember your verification token for ID"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:294
+#: ../../Zotlabs/Module/Regate.php:314
msgid "Token validity"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:330
+#: ../../Zotlabs/Module/Regate.php:350
msgid "Resend email"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:335
+#: ../../Zotlabs/Module/Regate.php:355
msgid "Registration status"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:338
+#: ../../Zotlabs/Module/Regate.php:358
msgid "Verification successful!"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:339
+#: ../../Zotlabs/Module/Regate.php:359
msgid "Your login ID is"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:340
+#: ../../Zotlabs/Module/Regate.php:360
msgid ""
"After your account has been approved by our administrator you will be able "
"to login with your login ID and your provided password."
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:352
+#: ../../Zotlabs/Module/Regate.php:372
msgid "Registration request revoked"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:353
+#: ../../Zotlabs/Module/Regate.php:373
msgid "Sorry for any inconvience. Thank you for your response."
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:377
+#: ../../Zotlabs/Module/Regate.php:397
msgid "Please enter your verification token for ID"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:378 ../../Zotlabs/Module/Regate.php:405
+#: ../../Zotlabs/Module/Regate.php:398 ../../Zotlabs/Module/Regate.php:425
msgid "Please check your email!"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:388
+#: ../../Zotlabs/Module/Regate.php:408
msgid "Verification token"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:399
+#: ../../Zotlabs/Module/Regate.php:419
msgid "ID expired"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:414
+#: ../../Zotlabs/Module/Regate.php:434
msgid "You will require the verification token for ID"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:423
+#: ../../Zotlabs/Module/Regate.php:443
msgid "Unknown or expired ID"
msgstr ""
-#: ../../Zotlabs/Module/Regate.php:434
+#: ../../Zotlabs/Module/Regate.php:454
msgid "dId2 malformed"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:128 ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Manage.php:130 ../../Zotlabs/Module/New_channel.php:147
#, php-format
msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:135
+#: ../../Zotlabs/Module/Manage.php:137
msgid "Create a new channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:135 ../../Zotlabs/Module/Profiles.php:832
+#: ../../Zotlabs/Module/Manage.php:137 ../../Zotlabs/Module/Profiles.php:852
#: ../../Zotlabs/Module/Wiki.php:211
msgid "Create New"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:161
+#: ../../Zotlabs/Module/Manage.php:163
msgid "Current Channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:163
+#: ../../Zotlabs/Module/Manage.php:165
msgid "Switch to one of your channels by selecting it."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:164
+#: ../../Zotlabs/Module/Manage.php:166
msgid "Default Channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:165
+#: ../../Zotlabs/Module/Manage.php:167
msgid "Make Default"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:168
+#: ../../Zotlabs/Module/Manage.php:170
#, php-format
msgid "%d new introductions"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:170
+#: ../../Zotlabs/Module/Manage.php:172
msgid "Delegated Channel"
msgstr ""
@@ -11155,26 +11157,67 @@ msgstr ""
msgid "Online"
msgstr ""
-#: ../../Zotlabs/Module/Permcats.php:29
+#: ../../Zotlabs/Module/Permcats.php:56
+msgid "Contact role deleted."
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:82
msgid "Permission category name is required."
msgstr ""
-#: ../../Zotlabs/Module/Permcats.php:48
-msgid "Permission category saved."
+#: ../../Zotlabs/Module/Permcats.php:98 ../../Zotlabs/Module/Permcats.php:123
+msgid "Contact role saved."
msgstr ""
-#: ../../Zotlabs/Module/Permcats.php:78
-msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
+#: ../../Zotlabs/Module/Permcats.php:174
+msgid "Role to assign affected contacts and default role to"
msgstr ""
-#: ../../Zotlabs/Module/Permcats.php:111 ../../Zotlabs/Lib/Apps.php:377
-msgid "Permission Categories"
+#: ../../Zotlabs/Module/Permcats.php:174
+msgid "Role to assign affected contacts to"
msgstr ""
-#: ../../Zotlabs/Module/Permcats.php:119
-msgid "Permission category name"
+#: ../../Zotlabs/Module/Permcats.php:205
+msgid "Assign this role to"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:207
+msgid "All my contacts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:218
+msgid "Automatically assign this role to new contacts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:219 ../../Zotlabs/Lib/Apps.php:378
+msgid "Contact Roles"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:220
+msgid "Role name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:220
+msgid "System role - not editable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:221
+msgid "Deleting"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:224 ../../Zotlabs/Module/Defperms.php:262
+#: ../../Zotlabs/Module/Connedit.php:713
+msgid "inherited"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:226
+msgid "Role Permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Permcats.php:227
+msgid ""
+"Some permissions may be inherited from your <a href=\"settings\">channel "
+"role</a>, which have higher priority than contact role settings."
msgstr ""
#: ../../Zotlabs/Module/Email_resend.php:12
@@ -11257,69 +11300,80 @@ msgstr ""
msgid "Language App"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:71 ../../Zotlabs/Module/Uexport.php:72
+#: ../../Zotlabs/Module/Uexport.php:108
+msgid "No content available for year"
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:171
msgid "Export Channel"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:73
+#: ../../Zotlabs/Module/Uexport.php:173
+msgid "Export channel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:174
msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
+"This will export your identity and social graph into a file which can be "
+"used to import your channel to a new hub."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:74
-msgid "Export Content"
+#: ../../Zotlabs/Module/Uexport.php:177
+msgid "Export content"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:75
+#: ../../Zotlabs/Module/Uexport.php:178
msgid ""
-"Export your channel information and recent content to a JSON backup that can "
-"be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for "
-"this download to begin."
+"This will export your posts, direct messages, articles and cards per month "
+"stored into a zip file per year. Months with no posts will be dismissed."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:77
-msgid "Export your posts from a given year."
+#: ../../Zotlabs/Module/Uexport.php:180
+msgid "Export wikis"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:79
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
+#: ../../Zotlabs/Module/Uexport.php:181
+msgid "This will export your wikis and wiki pages."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:80
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a href=\"%1$s"
-"\">%2$s</a>"
+#: ../../Zotlabs/Module/Uexport.php:183
+msgid "Export webpages"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:81
-#, php-format
+#: ../../Zotlabs/Module/Uexport.php:184
+msgid "This will export your webpages and menus."
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:186
+msgid "Export channel calendar"
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:187
msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
+"This will export your channel calendar events and associated items. CalDAV "
+"calendars are not included."
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:189
+msgid "Export chatrooms"
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:190
+msgid "This will export your chatrooms. Chat history is dismissed."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:82
+#: ../../Zotlabs/Module/Uexport.php:192
#, php-format
msgid ""
-"These content files may be imported or restored by visiting <a href=\"%1$s\">"
-"%2$s</a> on any site containing your channel. For best results please import "
-"or restore these in date order (oldest first)."
+"This export can be imported or restored by visiting <a href=\"%1$s\">%2$s</"
+"a> on any site containing your channel."
msgstr ""
-#: ../../Zotlabs/Module/Display.php:373
+#: ../../Zotlabs/Module/Display.php:376
msgid "Article"
msgstr ""
-#: ../../Zotlabs/Module/Display.php:418
+#: ../../Zotlabs/Module/Display.php:421
msgid "Item has been removed."
msgstr ""
@@ -11335,12 +11389,12 @@ msgstr ""
msgid "View Common Connections"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:185
+#: ../../Zotlabs/Module/Impel.php:188
#, php-format
msgid "%s element installed"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:188
+#: ../../Zotlabs/Module/Impel.php:191
#, php-format
msgid "%s element installation failed"
msgstr ""
@@ -11369,18 +11423,8 @@ msgid "Channel name"
msgstr ""
#: ../../Zotlabs/Module/New_channel.php:178
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Channel role and privacy"
-msgstr ""
-
-#: ../../Zotlabs/Module/New_channel.php:178
-msgid ""
-"Select a channel permission role compatible with your usage needs and "
-"privacy requirements."
-msgstr ""
-
-#: ../../Zotlabs/Module/New_channel.php:178
-msgid "Read more about channel permission roles"
+#: ../../Zotlabs/Module/Settings/Channel.php:228
+msgid "Channel role"
msgstr ""
#: ../../Zotlabs/Module/New_channel.php:181
@@ -11415,7 +11459,7 @@ msgstr ""
msgid "No service class restrictions found."
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:152 ../../Zotlabs/Lib/Apps.php:353
+#: ../../Zotlabs/Module/Mood.php:152 ../../Zotlabs/Lib/Apps.php:354
msgid "Mood"
msgstr ""
@@ -11473,47 +11517,47 @@ msgstr ""
msgid "Malformed app."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:136
+#: ../../Zotlabs/Module/Appman.php:198
msgid "Embed code"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:142
+#: ../../Zotlabs/Module/Appman.php:204
msgid "Edit App"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:142
+#: ../../Zotlabs/Module/Appman.php:204
msgid "Create App"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:147
+#: ../../Zotlabs/Module/Appman.php:209
msgid "Name of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:148
+#: ../../Zotlabs/Module/Appman.php:210
msgid "Location (URL) of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:150
+#: ../../Zotlabs/Module/Appman.php:212
msgid "Photo icon URL"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:150
+#: ../../Zotlabs/Module/Appman.php:212
msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:151
+#: ../../Zotlabs/Module/Appman.php:213
msgid "Categories (optional, comma separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:152
+#: ../../Zotlabs/Module/Appman.php:214
msgid "Version ID"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:153
+#: ../../Zotlabs/Module/Appman.php:215
msgid "Price of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:154
+#: ../../Zotlabs/Module/Appman.php:216
msgid "Location (URL) to purchase app"
msgstr ""
@@ -11569,6 +11613,268 @@ msgstr ""
msgid "Repository version (dev)"
msgstr ""
+#: ../../Zotlabs/Module/Contactedit.php:50
+msgid "Invalid abook_id"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:78 ../../Zotlabs/Module/Defperms.php:67
+#: ../../Zotlabs/Module/Connedit.php:80
+msgid "Could not access contact record."
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:107
+#: ../../Zotlabs/Module/Connedit.php:101
+msgid "Could not locate selected profile."
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:192
+#: ../../Zotlabs/Module/Connedit.php:215
+msgid "is now connected to"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:252
+#: ../../Zotlabs/Module/Contactedit.php:401
+#: ../../Zotlabs/Module/Connedit.php:701
+msgid "Contact Tools"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:329
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "Approve this contact"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:329
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "Accept contact to allow communication"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:362
+#: ../../Zotlabs/Module/Connedit.php:658
+msgid "Please select a role for this contact!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:382
+#: ../../Zotlabs/Module/Connedit.php:678
+msgid "This contact is unreachable from this location."
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:383
+#: ../../Zotlabs/Module/Connedit.php:679
+msgid "This contact may be unreachable from other channel locations."
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:385
+#: ../../Zotlabs/Module/Connedit.php:681
+msgid "Location independence is not supported by their network."
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:395
+msgid "View profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:397
+#: ../../Zotlabs/Module/Connections.php:405
+msgid "This is a group/forum channel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:408
+msgid "Select a role for this contact"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:420
+#: ../../Zotlabs/Module/Connedit.php:703
+msgid "Slide to adjust your degree of friendship"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:422
+#: ../../Zotlabs/Module/Connedit.php:705
+msgid "Custom Filter"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:423
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Only import posts with this text"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:424
+#: ../../Zotlabs/Module/Connedit.php:707
+msgid "Do not import posts with this text"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:429
+#: ../../Zotlabs/Module/Connedit.php:714
+msgid "Approve contact"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:431
+#: ../../Zotlabs/Module/Connedit.php:717
+msgid "Their"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:432
+#: ../../Zotlabs/Module/Connedit.php:718
+msgid "My"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:449
+msgid "Contact updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:449
+msgid "Contact update failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:455
+#: ../../Zotlabs/Module/Connections.php:348
+msgid "Approve connection"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:501
+#: ../../Zotlabs/Module/Contactedit.php:511
+msgid "Refresh succeeded"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:504
+msgid "Refresh failed - channel is currently unavailable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:523
+msgid "Block status updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:527
+msgid "Block failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:538
+msgid "Ignore status updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:542
+msgid "Ignore failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:553
+msgid "Archive status updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:557
+msgid "Archive failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:568
+msgid "Hide status updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:572
+msgid "Hide failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:607
+msgid "Contact removed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:611
+msgid "Delete failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:621
+#: ../../Zotlabs/Module/Connedit.php:487
+msgid "Refresh Permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:622
+#: ../../Zotlabs/Module/Connedit.php:490
+msgid "Fetch updated permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:626
+#: ../../Zotlabs/Module/Connedit.php:494
+msgid "Refresh Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:627
+#: ../../Zotlabs/Module/Connedit.php:497
+msgid "Fetch updated photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:634
+#: ../../Zotlabs/Module/Connedit.php:511
+msgid "Block (or Unblock) all communications with this connection"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:635
+#: ../../Zotlabs/Module/Connedit.php:512
+msgid "This connection is blocked!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:639
+#: ../../Zotlabs/Module/Connedit.php:516
+msgid "Unignore"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:639
+#: ../../Zotlabs/Module/Connections.php:351
+#: ../../Zotlabs/Module/Connedit.php:516
+msgid "Ignore"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:641
+#: ../../Zotlabs/Module/Connedit.php:519
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:642
+#: ../../Zotlabs/Module/Connedit.php:520
+msgid "This connection is ignored!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:646
+#: ../../Zotlabs/Module/Connedit.php:524
+msgid "Unarchive"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:646
+#: ../../Zotlabs/Module/Connedit.php:524
+msgid "Archive"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:648
+#: ../../Zotlabs/Module/Connedit.php:527
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:649
+#: ../../Zotlabs/Module/Connedit.php:528
+msgid "This connection is archived!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:653
+#: ../../Zotlabs/Module/Connedit.php:532
+msgid "Unhide"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:653
+#: ../../Zotlabs/Module/Connedit.php:532
+msgid "Hide"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:655
+#: ../../Zotlabs/Module/Connedit.php:535
+msgid "Hide or Unhide this connection from your other connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:656
+#: ../../Zotlabs/Module/Connedit.php:536
+msgid "This connection is hidden!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Contactedit.php:662
+#: ../../Zotlabs/Module/Connedit.php:543
+msgid "Delete this connection"
+msgstr ""
+
#: ../../Zotlabs/Module/Cards.php:110
msgid "Add Card"
msgstr ""
@@ -11723,101 +12029,89 @@ msgstr ""
msgid "Invalid response."
msgstr ""
-#: ../../Zotlabs/Module/Vote.php:132
+#: ../../Zotlabs/Module/Vote.php:127
msgid "Response submitted. Updates may not appear instantly."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:93
+#: ../../Zotlabs/Module/Profile_photo.php:128
#: ../../Zotlabs/Module/Cover_photo.php:85
msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:166
+#: ../../Zotlabs/Module/Profile_photo.php:184
#: ../../Zotlabs/Module/Cover_photo.php:212
msgid "Image resize failed."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:296
+#: ../../Zotlabs/Module/Profile_photo.php:350
#: ../../Zotlabs/Module/Cover_photo.php:265
msgid "Image upload failed."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:315
+#: ../../Zotlabs/Module/Profile_photo.php:370
#: ../../Zotlabs/Module/Cover_photo.php:282
msgid "Unable to process image."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:379
-#: ../../Zotlabs/Module/Profile_photo.php:431
+#: ../../Zotlabs/Module/Profile_photo.php:428
+#: ../../Zotlabs/Module/Profile_photo.php:493
#: ../../Zotlabs/Module/Cover_photo.php:367
#: ../../Zotlabs/Module/Cover_photo.php:382
msgid "Photo not available."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:495
-msgid ""
-"Your default profile photo is visible to anybody on the internet. Profile "
-"photos for alternate profiles will inherit the permissions of the profile"
-msgstr ""
-
-#: ../../Zotlabs/Module/Profile_photo.php:495
+#: ../../Zotlabs/Module/Profile_photo.php:540
msgid ""
-"Your profile photo is visible to anybody on the internet and may be "
+"This profile photo will be visible to anybody on the internet and may be "
"distributed to other websites."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:497
-#: ../../Zotlabs/Module/Cover_photo.php:420
-msgid "Upload File:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Profile_photo.php:498
-#: ../../Zotlabs/Module/Cover_photo.php:421
-msgid "Select a profile:"
+#: ../../Zotlabs/Module/Profile_photo.php:540
+msgid ""
+"This profile photo will be visible only to channels with permission to view "
+"this profile."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:499
+#: ../../Zotlabs/Module/Profile_photo.php:542
msgid "Use Photo for Profile"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:499
+#: ../../Zotlabs/Module/Profile_photo.php:542
msgid "Change Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:500
-msgid "Use"
+#: ../../Zotlabs/Module/Profile_photo.php:544
+msgid "Reset to default"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:505
-#: ../../Zotlabs/Module/Profile_photo.php:506
+#: ../../Zotlabs/Module/Profile_photo.php:547
+#: ../../Zotlabs/Module/Profile_photo.php:548
#: ../../Zotlabs/Module/Cover_photo.php:426
#: ../../Zotlabs/Module/Cover_photo.php:427
msgid "Use a photo from your albums"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:511
+#: ../../Zotlabs/Module/Profile_photo.php:553
#: ../../Zotlabs/Module/Cover_photo.php:432 ../../Zotlabs/Module/Wiki.php:402
msgid "Choose a different album"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:516
-#: ../../Zotlabs/Module/Cover_photo.php:438
-msgid "Select existing photo"
+#: ../../Zotlabs/Module/Profile_photo.php:558
+msgid "Select existing"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:535
+#: ../../Zotlabs/Module/Profile_photo.php:577
#: ../../Zotlabs/Module/Cover_photo.php:455
msgid "Crop Image"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:536
+#: ../../Zotlabs/Module/Profile_photo.php:578
#: ../../Zotlabs/Module/Cover_photo.php:456
msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:538
-#: ../../Zotlabs/Module/Cover_photo.php:458
-msgid "Done Editing"
+#: ../../Zotlabs/Module/Profile_photo.php:580
+msgid "Done editing"
msgstr ""
#: ../../Zotlabs/Module/Editblock.php:138
@@ -11832,7 +12126,7 @@ msgstr ""
msgid "or select an existing folder (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Lib/ThreadItem.php:185
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Lib/ThreadItem.php:208
msgid "Save to Folder"
msgstr ""
@@ -11851,25 +12145,25 @@ msgstr ""
#: ../../Zotlabs/Module/Connections.php:58
#: ../../Zotlabs/Module/Connections.php:116
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:282
msgid "Active"
msgstr ""
#: ../../Zotlabs/Module/Connections.php:63
#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:279
+#: ../../Zotlabs/Module/Connections.php:287
msgid "Blocked"
msgstr ""
#: ../../Zotlabs/Module/Connections.php:68
#: ../../Zotlabs/Module/Connections.php:189
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:286
msgid "Ignored"
msgstr ""
#: ../../Zotlabs/Module/Connections.php:73
#: ../../Zotlabs/Module/Connections.php:203
-#: ../../Zotlabs/Module/Connections.php:277
+#: ../../Zotlabs/Module/Connections.php:285
msgid "Hidden"
msgstr ""
@@ -11916,74 +12210,70 @@ msgstr ""
msgid "Show all connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Connections.php:283
msgid "Pending approval"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:284
msgid "Archived"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:280
+#: ../../Zotlabs/Module/Connections.php:288
msgid "Not connected at this location"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:319
+#: ../../Zotlabs/Module/Connections.php:327
#, php-format
msgid "%1$s [%2$s]"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:320
+#: ../../Zotlabs/Module/Connections.php:328
msgid "Edit connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:322
+#: ../../Zotlabs/Module/Connections.php:330
msgid "Delete connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:331
+#: ../../Zotlabs/Module/Connections.php:336
msgid "Channel address"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:336
+#: ../../Zotlabs/Module/Connections.php:341
msgid "Call"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:338
+#: ../../Zotlabs/Module/Connections.php:343
msgid "Status"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:340
+#: ../../Zotlabs/Module/Connections.php:346
msgid "Connected"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:342
-msgid "Approve connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:344
+#: ../../Zotlabs/Module/Connections.php:350
msgid "Ignore connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:345
-#: ../../Zotlabs/Module/Connedit.php:629
-msgid "Ignore"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:346
+#: ../../Zotlabs/Module/Connections.php:352
msgid "Recent activity"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:352
+#: ../../Zotlabs/Module/Connections.php:358
msgid "Connect at this location"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:380
+#: ../../Zotlabs/Module/Connections.php:395
+#: ../../Zotlabs/Module/Connedit.php:686
+msgid "Contact role"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connections.php:396
msgid "Search your connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:381
-msgid "Connections search"
+#: ../../Zotlabs/Module/Connections.php:397
+msgid "Contact search"
msgstr ""
#: ../../Zotlabs/Module/Cover_photo.php:196
@@ -11995,10 +12285,26 @@ msgstr ""
msgid "Your cover photo may be visible to anybody on the internet"
msgstr ""
+#: ../../Zotlabs/Module/Cover_photo.php:420
+msgid "Upload File:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:421
+msgid "Select a profile:"
+msgstr ""
+
#: ../../Zotlabs/Module/Cover_photo.php:422
msgid "Change Cover Photo"
msgstr ""
+#: ../../Zotlabs/Module/Cover_photo.php:438
+msgid "Select existing photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:458
+msgid "Done Editing"
+msgstr ""
+
#: ../../Zotlabs/Module/Photos.php:80
msgid "Page owner information could not be retrieved."
msgstr ""
@@ -12011,156 +12317,156 @@ msgstr ""
msgid "Delete Album"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:176 ../../Zotlabs/Module/Photos.php:1059
+#: ../../Zotlabs/Module/Photos.php:177 ../../Zotlabs/Module/Photos.php:1065
msgid "Delete Photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:530
+#: ../../Zotlabs/Module/Photos.php:534
msgid "No photos selected"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:579
+#: ../../Zotlabs/Module/Photos.php:583
msgid "Access to this item is restricted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:622
+#: ../../Zotlabs/Module/Photos.php:626
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:625
+#: ../../Zotlabs/Module/Photos.php:629
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:667
+#: ../../Zotlabs/Module/Photos.php:671
msgid "Upload Photos"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:671
+#: ../../Zotlabs/Module/Photos.php:675
msgid "Enter an album name"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:672
+#: ../../Zotlabs/Module/Photos.php:676
msgid "or select an existing album (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:673
+#: ../../Zotlabs/Module/Photos.php:677
msgid "Create a status post for this upload"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:675
+#: ../../Zotlabs/Module/Photos.php:679
msgid "Description (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:761
+#: ../../Zotlabs/Module/Photos.php:767
msgid "Show Newest First"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:763
+#: ../../Zotlabs/Module/Photos.php:769
msgid "Show Oldest First"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:820 ../../Zotlabs/Module/Photos.php:1362
+#: ../../Zotlabs/Module/Photos.php:826 ../../Zotlabs/Module/Photos.php:1368
msgid "Add Photos"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:868
+#: ../../Zotlabs/Module/Photos.php:874
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:870
+#: ../../Zotlabs/Module/Photos.php:876
msgid "Photo not available"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:928
+#: ../../Zotlabs/Module/Photos.php:934
msgid "Use as profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:929
+#: ../../Zotlabs/Module/Photos.php:935
msgid "Use as cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:936
+#: ../../Zotlabs/Module/Photos.php:942
msgid "Private Photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:951
+#: ../../Zotlabs/Module/Photos.php:957
msgid "View Full Size"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1033
+#: ../../Zotlabs/Module/Photos.php:1039
msgid "Edit photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1035
+#: ../../Zotlabs/Module/Photos.php:1041
msgid "Rotate CW (right)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1036
+#: ../../Zotlabs/Module/Photos.php:1042
msgid "Rotate CCW (left)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1039
+#: ../../Zotlabs/Module/Photos.php:1045
msgid "Move photo to album"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1040
+#: ../../Zotlabs/Module/Photos.php:1046
msgid "Enter a new album name"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1041
+#: ../../Zotlabs/Module/Photos.php:1047
msgid "or select an existing one (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1046
+#: ../../Zotlabs/Module/Photos.php:1052
msgid "Add a Tag"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1054
+#: ../../Zotlabs/Module/Photos.php:1060
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1057
+#: ../../Zotlabs/Module/Photos.php:1063
msgid "Flag as adult in album view"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:318
+#: ../../Zotlabs/Module/Photos.php:1082 ../../Zotlabs/Lib/ThreadItem.php:341
msgid "I like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:319
+#: ../../Zotlabs/Module/Photos.php:1083 ../../Zotlabs/Lib/ThreadItem.php:342
msgid "I don't like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Lib/ThreadItem.php:824
+#: ../../Zotlabs/Module/Photos.php:1101 ../../Zotlabs/Module/Photos.php:1217
+#: ../../Zotlabs/Lib/ThreadItem.php:848
msgid "This is you"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../Zotlabs/Lib/ThreadItem.php:251
+#: ../../Zotlabs/Module/Photos.php:1138 ../../Zotlabs/Module/Photos.php:1150
+#: ../../Zotlabs/Lib/ThreadItem.php:262 ../../Zotlabs/Lib/ThreadItem.php:274
msgid "View all"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1245
+#: ../../Zotlabs/Module/Photos.php:1251
msgid "Photo Tools"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1254
+#: ../../Zotlabs/Module/Photos.php:1260
msgid "In This Photo:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1259
+#: ../../Zotlabs/Module/Photos.php:1265
msgid "Map"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1267 ../../Zotlabs/Lib/ThreadItem.php:491
+#: ../../Zotlabs/Module/Photos.php:1273 ../../Zotlabs/Lib/ThreadItem.php:515
msgctxt "noun"
msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1268 ../../Zotlabs/Lib/ThreadItem.php:492
+#: ../../Zotlabs/Module/Photos.php:1274 ../../Zotlabs/Lib/ThreadItem.php:516
msgctxt "noun"
msgid "Dislikes"
msgstr ""
@@ -12189,7 +12495,7 @@ msgid ""
"Password reset failed."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1734
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1747
msgid "Password Reset"
msgstr ""
@@ -12256,8 +12562,8 @@ msgid ""
"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:26 ../../Zotlabs/Module/Profiles.php:186
-#: ../../Zotlabs/Module/Profiles.php:243 ../../Zotlabs/Module/Profiles.php:660
+#: ../../Zotlabs/Module/Profiles.php:26 ../../Zotlabs/Module/Profiles.php:214
+#: ../../Zotlabs/Module/Profiles.php:642
msgid "Profile not found."
msgstr ""
@@ -12281,227 +12587,239 @@ msgstr ""
msgid "Profile unavailable to export."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:254
+#: ../../Zotlabs/Module/Profiles.php:225
msgid "Profile Name is required."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:461
+#: ../../Zotlabs/Module/Profiles.php:430
msgid "Marital Status"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:465
+#: ../../Zotlabs/Module/Profiles.php:434
msgid "Romantic Partner"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:469 ../../Zotlabs/Module/Profiles.php:773
+#: ../../Zotlabs/Module/Profiles.php:438 ../../Zotlabs/Module/Profiles.php:788
msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:473 ../../Zotlabs/Module/Profiles.php:774
+#: ../../Zotlabs/Module/Profiles.php:442 ../../Zotlabs/Module/Profiles.php:789
msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:477 ../../Zotlabs/Module/Profiles.php:781
+#: ../../Zotlabs/Module/Profiles.php:446 ../../Zotlabs/Module/Profiles.php:796
msgid "Work/Employment"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:480
+#: ../../Zotlabs/Module/Profiles.php:449
msgid "Religion"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:484
+#: ../../Zotlabs/Module/Profiles.php:453
msgid "Political Views"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:492
+#: ../../Zotlabs/Module/Profiles.php:461
msgid "Sexual Preference"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:496
+#: ../../Zotlabs/Module/Profiles.php:465
msgid "Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:500
+#: ../../Zotlabs/Module/Profiles.php:469
msgid "Interests"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:596
+#: ../../Zotlabs/Module/Profiles.php:577
msgid "Profile updated."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:679
-msgid "Hide your connections list from viewers of this profile"
+#: ../../Zotlabs/Module/Profiles.php:672
+msgid "Hide my connections from viewers of this profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profiles.php:685
+msgid "Publish my default profile in the network directory"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profiles.php:693
+msgid "Suggest me as a potential contact to new members"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Reveal my online status"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:723
+#: ../../Zotlabs/Module/Profiles.php:738
msgid "Edit Profile Details"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../Zotlabs/Module/Profiles.php:740
msgid "View this profile"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:727
+#: ../../Zotlabs/Module/Profiles.php:742
msgid "Profile Tools"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:728
+#: ../../Zotlabs/Module/Profiles.php:743
msgid "Change cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:730
+#: ../../Zotlabs/Module/Profiles.php:745
msgid "Create a new profile using these settings"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:731
+#: ../../Zotlabs/Module/Profiles.php:746
msgid "Clone this profile"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:732
+#: ../../Zotlabs/Module/Profiles.php:747
msgid "Delete this profile"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:733
+#: ../../Zotlabs/Module/Profiles.php:748
msgid "Add profile things"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Personal"
+#: ../../Zotlabs/Module/Profiles.php:749
+msgid "Basic"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:736
+#: ../../Zotlabs/Module/Profiles.php:751
msgid "Relationship"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:739
+#: ../../Zotlabs/Module/Profiles.php:754
msgid "Import profile from file"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:740
+#: ../../Zotlabs/Module/Profiles.php:755
msgid "Export profile to file"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:741
+#: ../../Zotlabs/Module/Profiles.php:756
msgid "Your gender"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:742
+#: ../../Zotlabs/Module/Profiles.php:757
msgid "Marital status"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:743
+#: ../../Zotlabs/Module/Profiles.php:758
msgid "Sexual preference"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:746
+#: ../../Zotlabs/Module/Profiles.php:761
msgid "Profile name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:748
+#: ../../Zotlabs/Module/Profiles.php:763
msgid "This is your default profile."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:750
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Your full name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:751
+#: ../../Zotlabs/Module/Profiles.php:766
msgid "Short title/description"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:751
+#: ../../Zotlabs/Module/Profiles.php:766
msgid "Maximal 190 characters"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:754
+#: ../../Zotlabs/Module/Profiles.php:769
msgid "Street address"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:755
+#: ../../Zotlabs/Module/Profiles.php:770
msgid "Locality/City"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:756
+#: ../../Zotlabs/Module/Profiles.php:771
msgid "Region/State"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:757
+#: ../../Zotlabs/Module/Profiles.php:772
msgid "Postal/Zip code"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:763
+#: ../../Zotlabs/Module/Profiles.php:778
msgid "Who (if applicable)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:763
+#: ../../Zotlabs/Module/Profiles.php:778
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:764
+#: ../../Zotlabs/Module/Profiles.php:779
msgid "Since (date)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:767
+#: ../../Zotlabs/Module/Profiles.php:782
msgid "Tell us about yourself"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:769
+#: ../../Zotlabs/Module/Profiles.php:784
msgid "Hometown"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../Zotlabs/Module/Profiles.php:785
msgid "Political views"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:771
+#: ../../Zotlabs/Module/Profiles.php:786
msgid "Religious views"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Profiles.php:787
msgid "Keywords used in directory listings"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Profiles.php:787
msgid "Example: fishing photography software"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:775
+#: ../../Zotlabs/Module/Profiles.php:790
msgid "Musical interests"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:776
+#: ../../Zotlabs/Module/Profiles.php:791
msgid "Books, literature"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:777
+#: ../../Zotlabs/Module/Profiles.php:792
msgid "Television"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:778
+#: ../../Zotlabs/Module/Profiles.php:793
msgid "Film/Dance/Culture/Entertainment"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:779
+#: ../../Zotlabs/Module/Profiles.php:794
msgid "Hobbies/Interests"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:780
+#: ../../Zotlabs/Module/Profiles.php:795
msgid "Love/Romance"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:782
+#: ../../Zotlabs/Module/Profiles.php:797
msgid "School/Education"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:783
+#: ../../Zotlabs/Module/Profiles.php:798
msgid "Contact information and social networks"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:784
+#: ../../Zotlabs/Module/Profiles.php:799
msgid "My other channels"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:786
+#: ../../Zotlabs/Module/Profiles.php:801
msgid "Communications"
msgstr ""
@@ -12557,7 +12875,7 @@ msgstr ""
msgid "Register is closed"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:102 ../../Zotlabs/Module/Invite.php:548
+#: ../../Zotlabs/Module/Invite.php:102 ../../Zotlabs/Module/Invite.php:549
msgid "Note, the invitation code is valid up to"
msgstr ""
@@ -12570,11 +12888,6 @@ msgstr ""
msgid "No recipients for this invitation"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:133
-#, php-format
-msgid "(%s) : Not a valid email address"
-msgstr ""
-
#: ../../Zotlabs/Module/Invite.php:138
#, php-format
msgid "(%s) : Not a real email address"
@@ -12633,39 +12946,43 @@ msgstr ""
msgid "Invitation expires after"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:503 ../../Zotlabs/Module/Invite.php:542
+#: ../../Zotlabs/Module/Invite.php:504 ../../Zotlabs/Module/Invite.php:543
msgid "Invitation"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:533
+#: ../../Zotlabs/Module/Invite.php:534
msgid "Send invitations"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:534
+#: ../../Zotlabs/Module/Invite.php:535
msgid "Invitations I am using"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:535
+#: ../../Zotlabs/Module/Invite.php:536
msgid "Invitations we are using"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:536
+#: ../../Zotlabs/Module/Invite.php:537
msgid "§ Note, the email(s) sent will be recorded in the system logs"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:537
+#: ../../Zotlabs/Module/Invite.php:538
msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:538
+#: ../../Zotlabs/Module/Invite.php:539
msgid "Your message:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:539
+#: ../../Zotlabs/Module/Invite.php:540
msgid "Invite template"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:547
+#: ../../Zotlabs/Module/Invite.php:542
+msgid "Subject:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Invite.php:548
msgid "Here you may enter personal notes to the recipient(s)"
msgstr ""
@@ -12742,399 +13059,272 @@ msgstr ""
msgid "Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:329
-msgid "Nobody except yourself"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:330
-msgid "Only those you specifically allow"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:331
-msgid "Approved connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:332
-msgid "Any connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:333
-msgid "Anybody on this website"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:334
-msgid "Anybody in this network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:335
-msgid "Anybody authenticated"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:336
-msgid "Anybody on the internet"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:411
-msgid "Publish your default profile in the network directory"
+#: ../../Zotlabs/Module/Settings/Channel.php:103
+#: ../../Zotlabs/Module/Settings/Channel.php:212
+msgid "Please select a channel role"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:416
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:429
+#: ../../Zotlabs/Module/Settings/Channel.php:189
msgid "Your channel address is"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:432
+#: ../../Zotlabs/Module/Settings/Channel.php:192
msgid "Your files/photos are accessible via WebDAV at"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:472
-msgid "Automatic membership approval"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:472
-#: ../../Zotlabs/Module/Defperms.php:254
-msgid ""
-"If enabled, connection requests will be approved without your interaction"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:493
+#: ../../Zotlabs/Module/Settings/Channel.php:223
msgid "Channel Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:230
msgid "Basic Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:502
-msgid "Email Address:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Your Timezone:"
+#: ../../Zotlabs/Module/Settings/Channel.php:231
+msgid "Channel timezone:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:504
-msgid "Default Post Location:"
+#: ../../Zotlabs/Module/Settings/Channel.php:232
+msgid "Default post location:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:504
+#: ../../Zotlabs/Module/Settings/Channel.php:232
msgid "Geographical location to display on your posts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "Use Browser Location:"
+#: ../../Zotlabs/Module/Settings/Channel.php:233
+msgid "Use browser location"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "Adult Content"
+#: ../../Zotlabs/Module/Settings/Channel.php:234
+msgid "Adult content"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
+#: ../../Zotlabs/Module/Settings/Channel.php:234
+msgid "This channel frequently or regularly publishes adult content"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "Security and Privacy Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:513
-msgid "Hide my online presence"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:513
-msgid "Prevents displaying in your profile that you are online"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:515
-msgid "Simple Privacy Settings:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:516
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:517
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Private - <em>default private, never open or public</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:521
-msgid "Allow others to tag your posts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:521
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:523
-msgid "Channel Permission Limits"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Expire other channel content after this many days"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "0 or blank to use the website limit."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-#, php-format
-msgid "This website expires after %d days."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "This website does not expire imported content."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "The website limit takes precedence if lower than your limit."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:235
msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:235
msgid "May reduce spam activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:527
-msgid "Default Privacy Group"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "Use my default audience setting for the type of object published"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "Default permissions category"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Maximum private messages per day from unknown people:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Useful to reduce spamming"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:236
#: ../../Zotlabs/Lib/Enotify.php:68
msgid "Notification Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:237
msgid "By default post a status message when:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:238
msgid "accepting a friend request"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:239
msgid "joining a forum/community"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:551
+#: ../../Zotlabs/Module/Settings/Channel.php:240
msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:552
+#: ../../Zotlabs/Module/Settings/Channel.php:241
msgid "Send a notification email when:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:242
msgid "You receive a connection request"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:554
+#: ../../Zotlabs/Module/Settings/Channel.php:243
msgid "Your connections are confirmed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:244
msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:245
msgid "Someone writes a followup comment"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:246
msgid "You receive a private message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:247
msgid "You receive a friend suggestion"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:248
msgid "You are tagged in a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:560
+#: ../../Zotlabs/Module/Settings/Channel.php:249
msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:562
+#: ../../Zotlabs/Module/Settings/Channel.php:250
msgid "Someone likes your post/comment"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:565
+#: ../../Zotlabs/Module/Settings/Channel.php:251
msgid "Show visual notifications including:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:567
+#: ../../Zotlabs/Module/Settings/Channel.php:252
msgid "Unseen stream activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:568
+#: ../../Zotlabs/Module/Settings/Channel.php:253
msgid "Unseen channel activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:569
+#: ../../Zotlabs/Module/Settings/Channel.php:254
msgid "Unseen private messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:569
-#: ../../Zotlabs/Module/Settings/Channel.php:574
-#: ../../Zotlabs/Module/Settings/Channel.php:575
-#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:254
+#: ../../Zotlabs/Module/Settings/Channel.php:259
+#: ../../Zotlabs/Module/Settings/Channel.php:260
+#: ../../Zotlabs/Module/Settings/Channel.php:261
msgid "Recommended"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:570
+#: ../../Zotlabs/Module/Settings/Channel.php:255
msgid "Upcoming events"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:256
msgid "Events today"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:257
msgid "Upcoming birthdays"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:257
msgid "Not available in all themes"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:573
+#: ../../Zotlabs/Module/Settings/Channel.php:258
msgid "System (personal) notifications"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:574
+#: ../../Zotlabs/Module/Settings/Channel.php:259
msgid "System info messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:575
+#: ../../Zotlabs/Module/Settings/Channel.php:260
msgid "System critical alerts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:261
msgid "New connections"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:577
+#: ../../Zotlabs/Module/Settings/Channel.php:262
msgid "System Registrations"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:578
+#: ../../Zotlabs/Module/Settings/Channel.php:263
msgid "Unseen shared files"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:579
+#: ../../Zotlabs/Module/Settings/Channel.php:264
msgid "Unseen public stream activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:580
+#: ../../Zotlabs/Module/Settings/Channel.php:265
msgid "Unseen likes and dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:581
+#: ../../Zotlabs/Module/Settings/Channel.php:266
msgid "Unseen forum posts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:582
+#: ../../Zotlabs/Module/Settings/Channel.php:267
msgid "Email notification hub (hostname)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:582
+#: ../../Zotlabs/Module/Settings/Channel.php:267
#, php-format
msgid ""
"If your channel is mirrored to multiple hubs, set this to your preferred "
"location. This will prevent duplicate email notifications. Example: %s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:583
+#: ../../Zotlabs/Module/Settings/Channel.php:268
msgid "Show new wall posts, private messages and connections under Notices"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:584
+#: ../../Zotlabs/Module/Settings/Channel.php:269
+msgid "Mark all notices of the thread read if a notice is clicked"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:269
+msgid "If no, only the clicked notice will be marked read"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:270
msgid ""
"Desktop notifications are unavailable because the required browser "
"permission has not been granted"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:585
+#: ../../Zotlabs/Module/Settings/Channel.php:271
msgid "Grant permission"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:586
+#: ../../Zotlabs/Module/Settings/Channel.php:272
msgid "Notify me of events this many days in advance"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:586
+#: ../../Zotlabs/Module/Settings/Channel.php:272
msgid "Must be greater than 0"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:591
-msgid "Advanced Account/Page Type Settings"
+#: ../../Zotlabs/Module/Settings/Channel.php:275
+msgid "Default photo upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:592
-msgid "Change the behaviour of this account for special situations"
+#: ../../Zotlabs/Module/Settings/Channel.php:275
+#: ../../Zotlabs/Module/Settings/Channel.php:276
+msgid "%Y - current year, %m - current month"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:594
-msgid "Miscellaneous Settings"
+#: ../../Zotlabs/Module/Settings/Channel.php:276
+msgid "Default file upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:595
-msgid "Default photo upload folder"
+#: ../../Zotlabs/Module/Settings/Channel.php:278
+msgid "Remove this channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:595
-#: ../../Zotlabs/Module/Settings/Channel.php:596
-msgid "%Y - current year, %m - current month"
+#: ../../Zotlabs/Module/Settings/Channel.php:279
+msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:596
-msgid "Default file upload folder"
+#: ../../Zotlabs/Module/Settings/Channel.php:279
+msgid "0 or blank to use the website limit."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:598
-msgid "Remove this channel."
+#: ../../Zotlabs/Module/Settings/Channel.php:279
+#, php-format
+msgid "This website expires after %d days."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:279
+msgid "This website does not expire imported content."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:279
+msgid "The website limit takes precedence if lower than your limit."
msgstr ""
#: ../../Zotlabs/Module/Settings/Account.php:21
@@ -13316,10 +13506,90 @@ msgstr ""
msgid "Photos Settings"
msgstr ""
+#: ../../Zotlabs/Module/Settings/Profiles.php:41
+msgid "Default profile for new contacts"
+msgstr ""
+
#: ../../Zotlabs/Module/Settings/Profiles.php:49
msgid "Profiles Settings"
msgstr ""
+#: ../../Zotlabs/Module/Settings/Privacy.php:39
+msgid "Privacy settings updated."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:57
+msgid "Only those you specifically allow"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:58
+msgid "Approved connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:59
+msgid "Any connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:60
+msgid "Anybody on this website"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:61
+msgid "Anybody in this network"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:62
+msgid "Anybody authenticated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:63
+msgid "Anybody on the internet"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:73
+msgid ""
+"Advise: set to \"Anybody on the internet\" and use privacy groups to "
+"restrict access"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:109
+msgid "Privacy Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:114
+msgid "Advanced configuration"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:116
+msgid "Proceed with caution"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:117
+msgid ""
+"Changing advanced configuration settings can impact your, and your contacts "
+"channels functionality and security."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:118
+msgid "Accept the risk and continue"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:120
+msgid "Automatically approve new contacts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:121
+msgid "Opt-out of search engine indexing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:122
+msgid "Group actor"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Privacy.php:122
+msgid "Allow this channel to act as a forum"
+msgstr ""
+
#: ../../Zotlabs/Module/Settings/Conversation.php:23
msgid "Settings saved."
msgstr ""
@@ -13368,7 +13638,7 @@ msgstr ""
msgid "Submit and proceed"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:177 ../../Zotlabs/Module/Locs.php:129
+#: ../../Zotlabs/Module/Menu.php:177 ../../Zotlabs/Module/Locs.php:124
msgid "Drop"
msgstr ""
@@ -13420,37 +13690,46 @@ msgstr ""
msgid "Allow bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:68 ../../Zotlabs/Module/Connedit.php:90
-msgid "Could not access contact record."
-msgstr ""
-
-#: ../../Zotlabs/Module/Defperms.php:253 ../../Zotlabs/Module/Connedit.php:852
+#: ../../Zotlabs/Module/Defperms.php:252
msgid "Connection Default Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:254 ../../Zotlabs/Module/Connedit.php:853
+#: ../../Zotlabs/Module/Defperms.php:253
msgid "Apply these permissions automatically"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:255 ../../Zotlabs/Module/Connedit.php:854
+#: ../../Zotlabs/Module/Defperms.php:253
+msgid ""
+"If enabled, connection requests will be approved without your interaction"
+msgstr ""
+
+#: ../../Zotlabs/Module/Defperms.php:254
msgid "Permission role"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:256 ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Module/Defperms.php:255
msgid "Add permission role"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:260 ../../Zotlabs/Module/Connedit.php:868
+#: ../../Zotlabs/Module/Defperms.php:259 ../../Zotlabs/Module/Connedit.php:700
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:261
+#: ../../Zotlabs/Module/Defperms.php:260
msgid "Automatic approval settings"
msgstr ""
-#: ../../Zotlabs/Module/Defperms.php:269
+#: ../../Zotlabs/Module/Defperms.php:264
+msgid "My Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Defperms.php:267 ../../Zotlabs/Module/Connedit.php:720
+msgid "Individual Permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Defperms.php:268
msgid ""
"Some individual permissions may have been preset or locked based on your "
"channel type and privacy settings."
@@ -13613,6 +13892,46 @@ msgstr ""
msgid "Authentication failed."
msgstr ""
+#: ../../Zotlabs/Module/Import_progress.php:36
+msgid "Item sync completed!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:51
+msgid "Item sync completed but no items were found!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:73
+msgid "File sync completed!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:90
+msgid "File sync completed but no files were found!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:105
+msgid "Channel clone status"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:106
+msgid "Item sync status"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:107
+msgid "File sync status"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:114
+msgid "Channel cloning completed!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:115
+msgid "Resume"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import_progress.php:116
+msgid "Only resume if sync stalled!"
+msgstr ""
+
#: ../../Zotlabs/Module/Pdledit.php:27
msgid "Layout updated."
msgstr ""
@@ -13657,6 +13976,10 @@ msgstr ""
msgid "Error downloading wiki: "
msgstr ""
+#: ../../Zotlabs/Module/Wiki.php:209 ../../Zotlabs/Storage/Browser.php:404
+msgid "Download"
+msgstr ""
+
#: ../../Zotlabs/Module/Wiki.php:213
msgid "Wiki name"
msgstr ""
@@ -13784,244 +14107,113 @@ msgid ""
"hours."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:121
-msgid "Could not locate selected profile."
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:262
+#: ../../Zotlabs/Module/Connedit.php:171
msgid "Connection updated."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:264
+#: ../../Zotlabs/Module/Connedit.php:173
msgid "Failed to update connection record."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:307
-msgid "is now connected to"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:432
+#: ../../Zotlabs/Module/Connedit.php:320
msgid "Could not access address book record."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:480
+#: ../../Zotlabs/Module/Connedit.php:368
msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:494 ../../Zotlabs/Module/Connedit.php:503
-#: ../../Zotlabs/Module/Connedit.php:512 ../../Zotlabs/Module/Connedit.php:521
-#: ../../Zotlabs/Module/Connedit.php:534
+#: ../../Zotlabs/Module/Connedit.php:382 ../../Zotlabs/Module/Connedit.php:391
+#: ../../Zotlabs/Module/Connedit.php:400 ../../Zotlabs/Module/Connedit.php:409
+#: ../../Zotlabs/Module/Connedit.php:422
msgid "Unable to set address book parameters."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:553
+#: ../../Zotlabs/Module/Connedit.php:441
msgid "Connection has been removed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:596
+#: ../../Zotlabs/Module/Connedit.php:483
#, php-format
msgid "View %s's profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:600
-msgid "Refresh Permissions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:603
-msgid "Fetch updated permissions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:607
-msgid "Refresh Photo"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Fetch updated photo"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:617
+#: ../../Zotlabs/Module/Connedit.php:504
msgid "View recent posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:624
-msgid "Block (or Unblock) all communications with this connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:625
-msgid "This connection is blocked!"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:629
-msgid "Unignore"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:632
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:633
-msgid "This connection is ignored!"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:637
-msgid "Unarchive"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:637
-msgid "Archive"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:640
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:641
-msgid "This connection is archived!"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:645
-msgid "Unhide"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:645
-msgid "Hide"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:648
-msgid "Hide or Unhide this connection from your other connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:649
-msgid "This connection is hidden!"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:656
-msgid "Delete this connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:664
+#: ../../Zotlabs/Module/Connedit.php:550
msgid "Fetch Vcard"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:667
+#: ../../Zotlabs/Module/Connedit.php:553
msgid "Fetch electronic calling card for this connection"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:678
-msgid "Open Individual Permissions section by default"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:701
+#: ../../Zotlabs/Module/Connedit.php:572
msgid "Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:704
+#: ../../Zotlabs/Module/Connedit.php:575
msgid "Open Set Affinity section by default"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:741
+#: ../../Zotlabs/Module/Connedit.php:612
msgid "Filter"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:744
+#: ../../Zotlabs/Module/Connedit.php:615
msgid "Open Custom Filter section by default"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Approve this connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Accept connection to allow communication"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:786
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Set Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:789
+#: ../../Zotlabs/Module/Connedit.php:629
msgid "Set Profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:792
+#: ../../Zotlabs/Module/Connedit.php:632
msgid "Set Affinity & Profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:840
-msgid "This connection is unreachable from this location."
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:841
-msgid "This connection may be unreachable from other channel locations."
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:843
-msgid "Location independence is not supported by their network."
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:849
-msgid ""
-"This connection is unreachable from this location. Location independence is "
-"not supported by their network."
+#: ../../Zotlabs/Module/Connedit.php:685
+#, php-format
+msgid "Contact: %s"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:853
-msgid "Connection requests will be approved without your interaction"
+#: ../../Zotlabs/Module/Connedit.php:687
+msgid "Manage contact roles"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:862
-msgid "This connection's primary address is"
+#: ../../Zotlabs/Module/Connedit.php:694
+msgid "This contacts's primary address is"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:863
+#: ../../Zotlabs/Module/Connedit.php:695
msgid "Available locations:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:869
-msgid "Connection Tools"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:871
-msgid "Slide to adjust your degree of friendship"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:873
-msgid "Slide to adjust your rating"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:874 ../../Zotlabs/Module/Connedit.php:879
-msgid "Optionally explain your rating"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:876
-msgid "Custom Filter"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:877
-msgid "Only import posts with this text"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:878
-msgid "Do not import posts with this text"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:880
-msgid "This information is public!"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:885
-msgid "Connection Pending Approval"
+#: ../../Zotlabs/Module/Connedit.php:710
+msgid "Contact Pending Approval"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:890
+#: ../../Zotlabs/Module/Connedit.php:715
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:897
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can <strong>not</strong> change those settings here."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:722
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -14029,26 +14221,26 @@ msgid ""
"any impact unless the inherited setting changes."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:898
+#: ../../Zotlabs/Module/Connedit.php:723
msgid "Last update:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:906
+#: ../../Zotlabs/Module/Connedit.php:731
msgid "Details"
msgstr ""
#: ../../Zotlabs/Module/Notifications.php:106
-#: ../../Zotlabs/Module/Notify.php:69
+#: ../../Zotlabs/Module/Notify.php:85
msgid "No more system notifications."
msgstr ""
#: ../../Zotlabs/Module/Notifications.php:110
-#: ../../Zotlabs/Module/Notify.php:73
+#: ../../Zotlabs/Module/Notify.php:89
msgid "System Notifications"
msgstr ""
#: ../../Zotlabs/Module/Notifications.php:111
-#: ../../Zotlabs/Lib/ThreadItem.php:484
+#: ../../Zotlabs/Lib/ThreadItem.php:508
msgid "Mark all seen"
msgstr ""
@@ -14086,25 +14278,25 @@ msgstr ""
msgid "No locations found."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:125
+#: ../../Zotlabs/Module/Locs.php:120
msgid "Manage Channel Locations"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:131
+#: ../../Zotlabs/Module/Locs.php:126
msgid "Sync Now"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:132
+#: ../../Zotlabs/Module/Locs.php:127
msgid "Please wait several minutes between consecutive operations."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:133
+#: ../../Zotlabs/Module/Locs.php:128
msgid ""
"When possible, drop a location by logging into that website/hub and removing "
"your channel."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:134
+#: ../../Zotlabs/Module/Locs.php:129
msgid "Use this form to drop the location if the hub is no longer operating."
msgstr ""
@@ -14124,7 +14316,7 @@ msgstr ""
msgid "*"
msgstr ""
-#: ../../Zotlabs/Module/Sources.php:105 ../../Zotlabs/Lib/Apps.php:371
+#: ../../Zotlabs/Module/Sources.php:105 ../../Zotlabs/Lib/Apps.php:372
msgid "Channel Sources"
msgstr ""
@@ -14204,79 +14396,49 @@ msgstr ""
msgid "Or enter new bookmark folder name"
msgstr ""
-#: ../../Zotlabs/Lib/AccessList.php:28
+#: ../../Zotlabs/Lib/AccessList.php:26
msgid ""
-"A deleted list with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this list and any future members. If this is "
-"not what you intended, please create another list with a different name."
-msgstr ""
-
-#: ../../Zotlabs/Lib/AccessList.php:286
-msgid "Add new connections to this access list"
+"A deleted privacy group with this name was revived. Existing item "
+"permissions <strong>may</strong> apply to this privacy group and any future "
+"members. If this is not what you intended, please create another privacy "
+"group with a different name."
msgstr ""
-#: ../../Zotlabs/Lib/AccessList.php:331
-msgid "Lists"
+#: ../../Zotlabs/Lib/AccessList.php:265
+msgid "Select a privacy group"
msgstr ""
-#: ../../Zotlabs/Lib/AccessList.php:332
-msgid "Edit list"
-msgstr ""
-
-#: ../../Zotlabs/Lib/AccessList.php:333
-msgid "Create new list"
-msgstr ""
-
-#: ../../Zotlabs/Lib/AccessList.php:334
-msgid "Channels not in any access list"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Permcat.php:82
+#: ../../Zotlabs/Lib/Permcat.php:84
msgctxt "permcat"
-msgid "default"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Permcat.php:133
-msgctxt "permcat"
-msgid "follower"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Permcat.php:137
-msgctxt "permcat"
-msgid "contributor"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Permcat.php:141
-msgctxt "permcat"
-msgid "publisher"
+msgid "Default"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2208
+#: ../../Zotlabs/Lib/Activity.php:2287
#, php-format
msgid "Likes %1$s's %2$s"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2211
+#: ../../Zotlabs/Lib/Activity.php:2290
#, php-format
msgid "Doesn't like %1$s's %2$s"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2217
+#: ../../Zotlabs/Lib/Activity.php:2296
#, php-format
msgid "Will attend %s's event"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2220
+#: ../../Zotlabs/Lib/Activity.php:2299
#, php-format
msgid "Will not attend %s's event"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2223
+#: ../../Zotlabs/Lib/Activity.php:2302
#, php-format
msgid "May attend %s's event"
msgstr ""
-#: ../../Zotlabs/Lib/Activity.php:2226
+#: ../../Zotlabs/Lib/Activity.php:2305
#, php-format
msgid "May not attend %s's event"
msgstr ""
@@ -14318,7 +14480,7 @@ msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:130
#, php-format
-msgid "%1$s sent you a new direct message at %2$s."
+msgid "%1$s sent you a new direct message at %2$s"
msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:131
@@ -14378,7 +14540,7 @@ msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:241
#, php-format
-msgid "%1$s commented on an item/conversation you have been following."
+msgid "%1$s commented on an item/conversation you have been following"
msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:244 ../../Zotlabs/Lib/Enotify.php:324
@@ -14405,7 +14567,7 @@ msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:321
#, php-format
-msgid "%1$s liked an item/conversation you created."
+msgid "%1$s liked an item/conversation you created"
msgstr ""
#: ../../Zotlabs/Lib/Enotify.php:332
@@ -14608,7 +14770,7 @@ msgstr ""
msgid "Cannot connect to yourself."
msgstr ""
-#: ../../Zotlabs/Lib/Connect.php:271
+#: ../../Zotlabs/Lib/Connect.php:272
msgid "error saving data"
msgstr ""
@@ -14640,119 +14802,115 @@ msgstr ""
msgid "Wiki files deleted successfully"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:327
+#: ../../Zotlabs/Lib/Apps.php:328
msgid "Affinity Tool"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:330
+#: ../../Zotlabs/Lib/Apps.php:331
msgid "Site Admin"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:334
+#: ../../Zotlabs/Lib/Apps.php:335
msgid "Content Filter"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:337
+#: ../../Zotlabs/Lib/Apps.php:338
msgid "Remote Diagnostics"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:338
+#: ../../Zotlabs/Lib/Apps.php:339
msgid "Suggest Channels"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:340
+#: ../../Zotlabs/Lib/Apps.php:341
msgid "Channel Manager"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:341
+#: ../../Zotlabs/Lib/Apps.php:342
msgid "Stream"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:352
+#: ../../Zotlabs/Lib/Apps.php:353
msgid "Mail"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:355
+#: ../../Zotlabs/Lib/Apps.php:356
msgid "Chat"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:357
+#: ../../Zotlabs/Lib/Apps.php:358
msgid "Probe"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Lib/Apps.php:359
msgid "Suggest"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:359
+#: ../../Zotlabs/Lib/Apps.php:360
msgid "Random Channel"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:360
+#: ../../Zotlabs/Lib/Apps.php:361
msgid "Invite"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:363 ../../Zotlabs/Storage/Browser.php:407
+#: ../../Zotlabs/Lib/Apps.php:364 ../../Zotlabs/Storage/Browser.php:407
msgid "Post"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:368
+#: ../../Zotlabs/Lib/Apps.php:369
msgid "Notifications"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:369
+#: ../../Zotlabs/Lib/Apps.php:370
msgid "Order Apps"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:370
+#: ../../Zotlabs/Lib/Apps.php:371
msgid "CardDAV"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:372
-msgid "Guest Access"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:374
+#: ../../Zotlabs/Lib/Apps.php:375
msgid "OAuth Apps Manager"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:375
+#: ../../Zotlabs/Lib/Apps.php:376
msgid "OAuth2 Apps Manager"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:376
+#: ../../Zotlabs/Lib/Apps.php:377
msgid "PDL Editor"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:379
+#: ../../Zotlabs/Lib/Apps.php:380
msgid "My Chatrooms"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:380
+#: ../../Zotlabs/Lib/Apps.php:381
msgid "Channel Export"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:569 ../../Zotlabs/Lib/Apps.php:591
+#: ../../Zotlabs/Lib/Apps.php:570 ../../Zotlabs/Lib/Apps.php:592
msgid "Purchase"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:596
+#: ../../Zotlabs/Lib/Apps.php:597
msgid "Undelete"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:604
+#: ../../Zotlabs/Lib/Apps.php:605
msgid "Add to app-tray"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:605
+#: ../../Zotlabs/Lib/Apps.php:606
msgid "Remove from app-tray"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:606
+#: ../../Zotlabs/Lib/Apps.php:607
msgid "Pin to navbar"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:607
+#: ../../Zotlabs/Lib/Apps.php:608
msgid "Unpin from navbar"
msgstr ""
@@ -14780,60 +14938,56 @@ msgstr ""
msgid "5. Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:42
-#: ../../Zotlabs/Lib/NativeWikiPage.php:94
+#: ../../Zotlabs/Lib/NativeWikiPage.php:43
+#: ../../Zotlabs/Lib/NativeWikiPage.php:111
msgid "(No Title)"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:109
+#: ../../Zotlabs/Lib/NativeWikiPage.php:125
msgid "Wiki page create failed."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:123
+#: ../../Zotlabs/Lib/NativeWikiPage.php:139
msgid "Wiki not found."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:134
+#: ../../Zotlabs/Lib/NativeWikiPage.php:150
msgid "Destination name already exists"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:167
-#: ../../Zotlabs/Lib/NativeWikiPage.php:368
+#: ../../Zotlabs/Lib/NativeWikiPage.php:183
+#: ../../Zotlabs/Lib/NativeWikiPage.php:378
msgid "Page not found"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:200
+#: ../../Zotlabs/Lib/NativeWikiPage.php:213
msgid "Error reading page content"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:359
-#: ../../Zotlabs/Lib/NativeWikiPage.php:409
-#: ../../Zotlabs/Lib/NativeWikiPage.php:480
-#: ../../Zotlabs/Lib/NativeWikiPage.php:522
+#: ../../Zotlabs/Lib/NativeWikiPage.php:369
+#: ../../Zotlabs/Lib/NativeWikiPage.php:419
+#: ../../Zotlabs/Lib/NativeWikiPage.php:487
+#: ../../Zotlabs/Lib/NativeWikiPage.php:528
msgid "Error reading wiki"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:396
+#: ../../Zotlabs/Lib/NativeWikiPage.php:406
msgid "Page update failed."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:431
+#: ../../Zotlabs/Lib/NativeWikiPage.php:441
msgid "Nothing deleted"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:501
+#: ../../Zotlabs/Lib/NativeWikiPage.php:508
msgid "Compare: object not found."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:508
+#: ../../Zotlabs/Lib/NativeWikiPage.php:515
msgid "Page updated"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:511
-msgid "Untitled"
-msgstr ""
-
-#: ../../Zotlabs/Lib/NativeWikiPage.php:517
+#: ../../Zotlabs/Lib/NativeWikiPage.php:523
msgid "Wiki resource_id required for git commit"
msgstr ""
@@ -14853,91 +15007,103 @@ msgstr ""
msgid "This Website Only"
msgstr ""
-#: ../../Zotlabs/Lib/Libzot.php:655
+#: ../../Zotlabs/Lib/Libzot.php:673
msgid "Unable to verify channel signature"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:131
+#: ../../Zotlabs/Lib/ThreadItem.php:109
+msgid "Restricted message"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:116
+msgid "Public Policy"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:154
msgid "Privacy conflict. Discretion advised."
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:175 ../../Zotlabs/Storage/Browser.php:369
+#: ../../Zotlabs/Lib/ThreadItem.php:198 ../../Zotlabs/Storage/Browser.php:369
msgid "Admin Delete"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:320
+#: ../../Zotlabs/Lib/ThreadItem.php:343
msgid "Reply on this comment"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:320
+#: ../../Zotlabs/Lib/ThreadItem.php:343
msgid "reply"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:320
+#: ../../Zotlabs/Lib/ThreadItem.php:343
msgid "Reply to"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:340
+#: ../../Zotlabs/Lib/ThreadItem.php:363
msgid "Delivery Report"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:359
+#: ../../Zotlabs/Lib/ThreadItem.php:382
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:383
#, php-format
msgid "%d unseen"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:413
+#: ../../Zotlabs/Lib/ThreadItem.php:427
+msgid "Forum"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:437
msgid "to"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:415
+#: ../../Zotlabs/Lib/ThreadItem.php:439
msgid "Wall-to-Wall"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:416
+#: ../../Zotlabs/Lib/ThreadItem.php:440
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:444
+#: ../../Zotlabs/Lib/ThreadItem.php:468
msgid "Attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:462
+#: ../../Zotlabs/Lib/ThreadItem.php:486
msgid "Go to previous comment"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:475
+#: ../../Zotlabs/Lib/ThreadItem.php:499
msgid "Add to Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:833
+#: ../../Zotlabs/Lib/ThreadItem.php:857
msgid "Image"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:835
+#: ../../Zotlabs/Lib/ThreadItem.php:859
msgid "Insert Link"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:836
+#: ../../Zotlabs/Lib/ThreadItem.php:860
msgid "Video"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:846
+#: ../../Zotlabs/Lib/ThreadItem.php:870
msgid "Your full name (required)"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:847
+#: ../../Zotlabs/Lib/ThreadItem.php:871
msgid "Your email address (required)"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:848
+#: ../../Zotlabs/Lib/ThreadItem.php:872
msgid "Your website URL (optional)"
msgstr ""
@@ -14956,6 +15122,7 @@ msgid "Update %s failed. See error logs."
msgstr ""
#: ../../Zotlabs/Lib/PermissionDescription.php:108
+#: ../../Zotlabs/Access/PermissionRoles.php:384
msgid "Public"
msgstr ""
@@ -15008,75 +15175,87 @@ msgstr ""
msgid "This is your default setting for the audience of your webpages"
msgstr ""
-#: ../../Zotlabs/Lib/Libsync.php:737
+#: ../../Zotlabs/Lib/Libsync.php:805
#, php-format
msgid "Unable to verify site signature for %s"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:287
+#: ../../Zotlabs/Access/PermissionRoles.php:337
msgid "Social Networking"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:288
+#: ../../Zotlabs/Access/PermissionRoles.php:338
msgid "Social - Federation"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:289
+#: ../../Zotlabs/Access/PermissionRoles.php:339
msgid "Social - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:290
+#: ../../Zotlabs/Access/PermissionRoles.php:340
msgid "Social - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:291
+#: ../../Zotlabs/Access/PermissionRoles.php:341
msgid "Social - Private"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:294
+#: ../../Zotlabs/Access/PermissionRoles.php:344
msgid "Community Forum"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:295
+#: ../../Zotlabs/Access/PermissionRoles.php:345
msgid "Forum - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:296
+#: ../../Zotlabs/Access/PermissionRoles.php:346
msgid "Forum - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:297
+#: ../../Zotlabs/Access/PermissionRoles.php:347
msgid "Forum - Private"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:300
+#: ../../Zotlabs/Access/PermissionRoles.php:350
msgid "Feed Republish"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:301
+#: ../../Zotlabs/Access/PermissionRoles.php:351
msgid "Feed - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:302
+#: ../../Zotlabs/Access/PermissionRoles.php:352
msgid "Feed - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:305
+#: ../../Zotlabs/Access/PermissionRoles.php:355
msgid "Special Purpose"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:306
+#: ../../Zotlabs/Access/PermissionRoles.php:356
msgid "Special - Celebrity/Soapbox"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:307
+#: ../../Zotlabs/Access/PermissionRoles.php:357
msgid "Special - Group Repository"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:311
+#: ../../Zotlabs/Access/PermissionRoles.php:361
msgid "Custom/Expert Mode"
msgstr ""
+#: ../../Zotlabs/Access/PermissionRoles.php:385
+msgid "Personal"
+msgstr ""
+
+#: ../../Zotlabs/Access/PermissionRoles.php:386
+msgid "Community forum"
+msgstr ""
+
+#: ../../Zotlabs/Access/PermissionRoles.php:387
+msgid "Custom"
+msgstr ""
+
#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my channel stream and posts"
msgstr ""
@@ -15134,15 +15313,11 @@ msgid "Can like/dislike profiles and profile things"
msgstr ""
#: ../../Zotlabs/Access/Permissions.php:70
-msgid "Can forward direct messages to all my channel connections (forum)"
-msgstr ""
-
-#: ../../Zotlabs/Access/Permissions.php:71
msgid "Can chat with me"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:72
-msgid "Can source my public posts in derived channels"
+#: ../../Zotlabs/Access/Permissions.php:71
+msgid "Can source/mirror my public posts in derived channels"
msgstr ""
#: ../../Zotlabs/Access/Permissions.php:73
@@ -15257,40 +15432,40 @@ msgid ""
"an existing folder."
msgstr ""
-#: ../../boot.php:1701
+#: ../../boot.php:1714
msgid "Create an account to access services and applications"
msgstr ""
-#: ../../boot.php:1719
+#: ../../boot.php:1732
msgid "Email or nickname"
msgstr ""
-#: ../../boot.php:1729
+#: ../../boot.php:1742
msgid "Password"
msgstr ""
-#: ../../boot.php:1730
+#: ../../boot.php:1743
msgid "Remember me"
msgstr ""
-#: ../../boot.php:1733
+#: ../../boot.php:1746
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:2612
+#: ../../boot.php:2624
#, php-format
msgid "[$Projectname] Website SSL error for %s"
msgstr ""
-#: ../../boot.php:2617
+#: ../../boot.php:2629
msgid "Website SSL certificate is not valid. Please correct."
msgstr ""
-#: ../../boot.php:2733
+#: ../../boot.php:2745
#, php-format
msgid "[$Projectname] Cron tasks not running on %s"
msgstr ""
-#: ../../boot.php:2738
+#: ../../boot.php:2750
msgid "Cron/Scheduled tasks not running."
msgstr ""
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 31c68cc86..06b693913 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -1083,6 +1083,7 @@ return array(
'Text_LanguageDetect_Exception' => $vendorDir . '/pear/text_languagedetect/Text/LanguageDetect/Exception.php',
'Text_LanguageDetect_ISO639' => $vendorDir . '/pear/text_languagedetect/Text/LanguageDetect/ISO639.php',
'Text_LanguageDetect_Parser' => $vendorDir . '/pear/text_languagedetect/Text/LanguageDetect/Parser.php',
+ 'URLify' => $vendorDir . '/jbroadway/urlify/URLify.php',
'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'UploadHandler' => $vendorDir . '/blueimp/jquery-file-upload/server/php/UploadHandler.php',
'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
@@ -1105,6 +1106,7 @@ return array(
'Zotlabs\\Daemon\\CurlAuth' => $baseDir . '/Zotlabs/Daemon/CurlAuth.php',
'Zotlabs\\Daemon\\Deliver' => $baseDir . '/Zotlabs/Daemon/Deliver.php',
'Zotlabs\\Daemon\\Deliver_hooks' => $baseDir . '/Zotlabs/Daemon/Deliver_hooks.php',
+ 'Zotlabs\\Daemon\\Delxitems' => $baseDir . '/Zotlabs/Daemon/Delxitems.php',
'Zotlabs\\Daemon\\Directory' => $baseDir . '/Zotlabs/Daemon/Directory.php',
'Zotlabs\\Daemon\\Expire' => $baseDir . '/Zotlabs/Daemon/Expire.php',
'Zotlabs\\Daemon\\Externals' => $baseDir . '/Zotlabs/Daemon/Externals.php',
@@ -1143,7 +1145,6 @@ return array(
'Zotlabs\\Lib\\DReport' => $baseDir . '/Zotlabs/Lib/DReport.php',
'Zotlabs\\Lib\\Enotify' => $baseDir . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => $baseDir . '/Zotlabs/Lib/ExtendedZip.php',
- 'Zotlabs\\Lib\\Group' => $baseDir . '/Zotlabs/Lib/Group.php',
'Zotlabs\\Lib\\Hashpath' => $baseDir . '/Zotlabs/Lib/Hashpath.php',
'Zotlabs\\Lib\\IConfig' => $baseDir . '/Zotlabs/Lib/IConfig.php',
'Zotlabs\\Lib\\Img_filesize' => $baseDir . '/Zotlabs/Lib/Img_filesize.php',
@@ -1192,6 +1193,7 @@ return array(
'Zotlabs\\Module\\Admin\\Site' => $baseDir . '/Zotlabs/Module/Admin/Site.php',
'Zotlabs\\Module\\Admin\\Themes' => $baseDir . '/Zotlabs/Module/Admin/Themes.php',
'Zotlabs\\Module\\Affinity' => $baseDir . '/Zotlabs/Module/Affinity.php',
+ 'Zotlabs\\Module\\Album' => $baseDir . '/Zotlabs/Module/Album.php',
'Zotlabs\\Module\\Api' => $baseDir . '/Zotlabs/Module/Api.php',
'Zotlabs\\Module\\Appman' => $baseDir . '/Zotlabs/Module/Appman.php',
'Zotlabs\\Module\\Apporder' => $baseDir . '/Zotlabs/Module/Apporder.php',
@@ -1223,6 +1225,7 @@ return array(
'Zotlabs\\Module\\Connect' => $baseDir . '/Zotlabs/Module/Connect.php',
'Zotlabs\\Module\\Connections' => $baseDir . '/Zotlabs/Module/Connections.php',
'Zotlabs\\Module\\Connedit' => $baseDir . '/Zotlabs/Module/Connedit.php',
+ 'Zotlabs\\Module\\Contactedit' => $baseDir . '/Zotlabs/Module/Contactedit.php',
'Zotlabs\\Module\\Contactgroup' => $baseDir . '/Zotlabs/Module/Contactgroup.php',
'Zotlabs\\Module\\Cover_photo' => $baseDir . '/Zotlabs/Module/Cover_photo.php',
'Zotlabs\\Module\\Dav' => $baseDir . '/Zotlabs/Module/Dav.php',
@@ -1348,6 +1351,7 @@ return array(
'Zotlabs\\Module\\Settings\\Manage' => $baseDir . '/Zotlabs/Module/Settings/Manage.php',
'Zotlabs\\Module\\Settings\\Network' => $baseDir . '/Zotlabs/Module/Settings/Network.php',
'Zotlabs\\Module\\Settings\\Photos' => $baseDir . '/Zotlabs/Module/Settings/Photos.php',
+ 'Zotlabs\\Module\\Settings\\Privacy' => $baseDir . '/Zotlabs/Module/Settings/Privacy.php',
'Zotlabs\\Module\\Settings\\Profiles' => $baseDir . '/Zotlabs/Module/Settings/Profiles.php',
'Zotlabs\\Module\\Setup' => $baseDir . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => $baseDir . '/Zotlabs/Module/Share.php',
@@ -1665,6 +1669,8 @@ return array(
'Zotlabs\\Update\\_1246' => $baseDir . '/Zotlabs/Update/_1246.php',
'Zotlabs\\Update\\_1247' => $baseDir . '/Zotlabs/Update/_1247.php',
'Zotlabs\\Update\\_1248' => $baseDir . '/Zotlabs/Update/_1248.php',
+ 'Zotlabs\\Update\\_1249' => $baseDir . '/Zotlabs/Update/_1249.php',
+ 'Zotlabs\\Update\\_1250' => $baseDir . '/Zotlabs/Update/_1250.php',
'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php',
'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HTTPSig' => $baseDir . '/Zotlabs/Web/HTTPSig.php',
@@ -1695,7 +1701,6 @@ return array(
'Zotlabs\\Widget\\Clock' => $baseDir . '/Zotlabs/Widget/Clock.php',
'Zotlabs\\Widget\\Collections' => $baseDir . '/Zotlabs/Widget/Collections.php',
'Zotlabs\\Widget\\Common_friends' => $baseDir . '/Zotlabs/Widget/Common_friends.php',
- 'Zotlabs\\Widget\\Conversations' => $baseDir . '/Zotlabs/Widget/Conversations.php',
'Zotlabs\\Widget\\Cover_photo' => $baseDir . '/Zotlabs/Widget/Cover_photo.php',
'Zotlabs\\Widget\\Design_tools' => $baseDir . '/Zotlabs/Widget/Design_tools.php',
'Zotlabs\\Widget\\Dirsort' => $baseDir . '/Zotlabs/Widget/Dirsort.php',
@@ -1709,17 +1714,18 @@ return array(
'Zotlabs\\Widget\\Helpindex' => $baseDir . '/Zotlabs/Widget/Helpindex.php',
'Zotlabs\\Widget\\Hq_controls' => $baseDir . '/Zotlabs/Widget/Hq_controls.php',
'Zotlabs\\Widget\\Item' => $baseDir . '/Zotlabs/Widget/Item.php',
- 'Zotlabs\\Widget\\Mailmenu' => $baseDir . '/Zotlabs/Widget/Mailmenu.php',
'Zotlabs\\Widget\\Menu_preview' => $baseDir . '/Zotlabs/Widget/Menu_preview.php',
'Zotlabs\\Widget\\Messages' => $baseDir . '/Zotlabs/Widget/Messages.php',
'Zotlabs\\Widget\\Newmember' => $baseDir . '/Zotlabs/Widget/Newmember.php',
'Zotlabs\\Widget\\Notes' => $baseDir . '/Zotlabs/Widget/Notes.php',
'Zotlabs\\Widget\\Notifications' => $baseDir . '/Zotlabs/Widget/Notifications.php',
+ 'Zotlabs\\Widget\\Permcats' => $baseDir . '/Zotlabs/Widget/Permcats.php',
'Zotlabs\\Widget\\Photo' => $baseDir . '/Zotlabs/Widget/Photo.php',
'Zotlabs\\Widget\\Photo_albums' => $baseDir . '/Zotlabs/Widget/Photo_albums.php',
'Zotlabs\\Widget\\Photo_rand' => $baseDir . '/Zotlabs/Widget/Photo_rand.php',
'Zotlabs\\Widget\\Pinned' => $baseDir . '/Zotlabs/Widget/Pinned.php',
'Zotlabs\\Widget\\Portfolio' => $baseDir . '/Zotlabs/Widget/Portfolio.php',
+ 'Zotlabs\\Widget\\Privacygroups' => $baseDir . '/Zotlabs/Widget/Privacygroups.php',
'Zotlabs\\Widget\\Profile' => $baseDir . '/Zotlabs/Widget/Profile.php',
'Zotlabs\\Widget\\Pubsites' => $baseDir . '/Zotlabs/Widget/Pubsites.php',
'Zotlabs\\Widget\\Pubtagcloud' => $baseDir . '/Zotlabs/Widget/Pubtagcloud.php',
@@ -1734,6 +1740,7 @@ return array(
'Zotlabs\\Widget\\Tagcloud' => $baseDir . '/Zotlabs/Widget/Tagcloud.php',
'Zotlabs\\Widget\\Tagcloud_wall' => $baseDir . '/Zotlabs/Widget/Tagcloud_wall.php',
'Zotlabs\\Widget\\Tasklist' => $baseDir . '/Zotlabs/Widget/Tasklist.php',
+ 'Zotlabs\\Widget\\Tokens' => $baseDir . '/Zotlabs/Widget/Tokens.php',
'Zotlabs\\Widget\\Vcard' => $baseDir . '/Zotlabs/Widget/Vcard.php',
'Zotlabs\\Widget\\Website_portation_tools' => $baseDir . '/Zotlabs/Widget/Website_portation_tools.php',
'Zotlabs\\Widget\\Wiki_list' => $baseDir . '/Zotlabs/Widget/Wiki_list.php',
@@ -1767,4 +1774,7 @@ return array(
'phpseclib\\Net\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php',
'phpseclib\\System\\SSH\\Agent' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php',
'phpseclib\\System\\SSH\\Agent\\Identity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php',
+ 'voku\\helper\\ASCII' => $vendorDir . '/voku/portable-ascii/src/voku/helper/ASCII.php',
+ 'voku\\helper\\StopWords' => $vendorDir . '/voku/stop-words/src/voku/helper/StopWords.php',
+ 'voku\\helper\\StopWordsLanguageNotExists' => $vendorDir . '/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php',
);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index 8a46cfcb7..d6d43282e 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'URLify' => array($vendorDir . '/jbroadway/urlify'),
'Text' => array($vendorDir . '/pear/text_languagedetect'),
'SimplePie' => array($vendorDir . '/simplepie/simplepie/library'),
'OAuth2' => array($vendorDir . '/bshaffer/oauth2-server-php/src'),
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 896fc9cfa..8339af74c 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku', $vendorDir . '/voku/stop-words/src/voku'),
'phpseclib\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
'Zotlabs\\' => array($baseDir . '/Zotlabs'),
'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 07782cb34..5d08c1a72 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -23,6 +23,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
);
public static $prefixLengthsPsr4 = array (
+ 'v' =>
+ array (
+ 'voku\\' => 5,
+ ),
'p' =>
array (
'phpseclib\\' => 10,
@@ -82,6 +86,11 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
);
public static $prefixDirsPsr4 = array (
+ 'voku\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku',
+ 1 => __DIR__ . '/..' . '/voku/stop-words/src/voku',
+ ),
'phpseclib\\' =>
array (
0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib',
@@ -177,6 +186,13 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
);
public static $prefixesPsr0 = array (
+ 'U' =>
+ array (
+ 'URLify' =>
+ array (
+ 0 => __DIR__ . '/..' . '/jbroadway/urlify',
+ ),
+ ),
'T' =>
array (
'Text' =>
@@ -1285,6 +1301,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Text_LanguageDetect_Exception' => __DIR__ . '/..' . '/pear/text_languagedetect/Text/LanguageDetect/Exception.php',
'Text_LanguageDetect_ISO639' => __DIR__ . '/..' . '/pear/text_languagedetect/Text/LanguageDetect/ISO639.php',
'Text_LanguageDetect_Parser' => __DIR__ . '/..' . '/pear/text_languagedetect/Text/LanguageDetect/Parser.php',
+ 'URLify' => __DIR__ . '/..' . '/jbroadway/urlify/URLify.php',
'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'UploadHandler' => __DIR__ . '/..' . '/blueimp/jquery-file-upload/server/php/UploadHandler.php',
'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
@@ -1307,6 +1324,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Daemon\\CurlAuth' => __DIR__ . '/../..' . '/Zotlabs/Daemon/CurlAuth.php',
'Zotlabs\\Daemon\\Deliver' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Deliver.php',
'Zotlabs\\Daemon\\Deliver_hooks' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Deliver_hooks.php',
+ 'Zotlabs\\Daemon\\Delxitems' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Delxitems.php',
'Zotlabs\\Daemon\\Directory' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Directory.php',
'Zotlabs\\Daemon\\Expire' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Expire.php',
'Zotlabs\\Daemon\\Externals' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Externals.php',
@@ -1345,7 +1363,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Lib\\DReport' => __DIR__ . '/../..' . '/Zotlabs/Lib/DReport.php',
'Zotlabs\\Lib\\Enotify' => __DIR__ . '/../..' . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => __DIR__ . '/../..' . '/Zotlabs/Lib/ExtendedZip.php',
- 'Zotlabs\\Lib\\Group' => __DIR__ . '/../..' . '/Zotlabs/Lib/Group.php',
'Zotlabs\\Lib\\Hashpath' => __DIR__ . '/../..' . '/Zotlabs/Lib/Hashpath.php',
'Zotlabs\\Lib\\IConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/IConfig.php',
'Zotlabs\\Lib\\Img_filesize' => __DIR__ . '/../..' . '/Zotlabs/Lib/Img_filesize.php',
@@ -1394,6 +1411,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Admin\\Site' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Site.php',
'Zotlabs\\Module\\Admin\\Themes' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Themes.php',
'Zotlabs\\Module\\Affinity' => __DIR__ . '/../..' . '/Zotlabs/Module/Affinity.php',
+ 'Zotlabs\\Module\\Album' => __DIR__ . '/../..' . '/Zotlabs/Module/Album.php',
'Zotlabs\\Module\\Api' => __DIR__ . '/../..' . '/Zotlabs/Module/Api.php',
'Zotlabs\\Module\\Appman' => __DIR__ . '/../..' . '/Zotlabs/Module/Appman.php',
'Zotlabs\\Module\\Apporder' => __DIR__ . '/../..' . '/Zotlabs/Module/Apporder.php',
@@ -1425,6 +1443,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Connect' => __DIR__ . '/../..' . '/Zotlabs/Module/Connect.php',
'Zotlabs\\Module\\Connections' => __DIR__ . '/../..' . '/Zotlabs/Module/Connections.php',
'Zotlabs\\Module\\Connedit' => __DIR__ . '/../..' . '/Zotlabs/Module/Connedit.php',
+ 'Zotlabs\\Module\\Contactedit' => __DIR__ . '/../..' . '/Zotlabs/Module/Contactedit.php',
'Zotlabs\\Module\\Contactgroup' => __DIR__ . '/../..' . '/Zotlabs/Module/Contactgroup.php',
'Zotlabs\\Module\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Cover_photo.php',
'Zotlabs\\Module\\Dav' => __DIR__ . '/../..' . '/Zotlabs/Module/Dav.php',
@@ -1550,6 +1569,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Settings\\Manage' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Manage.php',
'Zotlabs\\Module\\Settings\\Network' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Network.php',
'Zotlabs\\Module\\Settings\\Photos' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Photos.php',
+ 'Zotlabs\\Module\\Settings\\Privacy' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Privacy.php',
'Zotlabs\\Module\\Settings\\Profiles' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Profiles.php',
'Zotlabs\\Module\\Setup' => __DIR__ . '/../..' . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => __DIR__ . '/../..' . '/Zotlabs/Module/Share.php',
@@ -1867,6 +1887,8 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Update\\_1246' => __DIR__ . '/../..' . '/Zotlabs/Update/_1246.php',
'Zotlabs\\Update\\_1247' => __DIR__ . '/../..' . '/Zotlabs/Update/_1247.php',
'Zotlabs\\Update\\_1248' => __DIR__ . '/../..' . '/Zotlabs/Update/_1248.php',
+ 'Zotlabs\\Update\\_1249' => __DIR__ . '/../..' . '/Zotlabs/Update/_1249.php',
+ 'Zotlabs\\Update\\_1250' => __DIR__ . '/../..' . '/Zotlabs/Update/_1250.php',
'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HTTPSig' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPSig.php',
@@ -1897,7 +1919,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Widget\\Clock' => __DIR__ . '/../..' . '/Zotlabs/Widget/Clock.php',
'Zotlabs\\Widget\\Collections' => __DIR__ . '/../..' . '/Zotlabs/Widget/Collections.php',
'Zotlabs\\Widget\\Common_friends' => __DIR__ . '/../..' . '/Zotlabs/Widget/Common_friends.php',
- 'Zotlabs\\Widget\\Conversations' => __DIR__ . '/../..' . '/Zotlabs/Widget/Conversations.php',
'Zotlabs\\Widget\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Cover_photo.php',
'Zotlabs\\Widget\\Design_tools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Design_tools.php',
'Zotlabs\\Widget\\Dirsort' => __DIR__ . '/../..' . '/Zotlabs/Widget/Dirsort.php',
@@ -1911,17 +1932,18 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Widget\\Helpindex' => __DIR__ . '/../..' . '/Zotlabs/Widget/Helpindex.php',
'Zotlabs\\Widget\\Hq_controls' => __DIR__ . '/../..' . '/Zotlabs/Widget/Hq_controls.php',
'Zotlabs\\Widget\\Item' => __DIR__ . '/../..' . '/Zotlabs/Widget/Item.php',
- 'Zotlabs\\Widget\\Mailmenu' => __DIR__ . '/../..' . '/Zotlabs/Widget/Mailmenu.php',
'Zotlabs\\Widget\\Menu_preview' => __DIR__ . '/../..' . '/Zotlabs/Widget/Menu_preview.php',
'Zotlabs\\Widget\\Messages' => __DIR__ . '/../..' . '/Zotlabs/Widget/Messages.php',
'Zotlabs\\Widget\\Newmember' => __DIR__ . '/../..' . '/Zotlabs/Widget/Newmember.php',
'Zotlabs\\Widget\\Notes' => __DIR__ . '/../..' . '/Zotlabs/Widget/Notes.php',
'Zotlabs\\Widget\\Notifications' => __DIR__ . '/../..' . '/Zotlabs/Widget/Notifications.php',
+ 'Zotlabs\\Widget\\Permcats' => __DIR__ . '/../..' . '/Zotlabs/Widget/Permcats.php',
'Zotlabs\\Widget\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo.php',
'Zotlabs\\Widget\\Photo_albums' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_albums.php',
'Zotlabs\\Widget\\Photo_rand' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_rand.php',
'Zotlabs\\Widget\\Pinned' => __DIR__ . '/../..' . '/Zotlabs/Widget/Pinned.php',
'Zotlabs\\Widget\\Portfolio' => __DIR__ . '/../..' . '/Zotlabs/Widget/Portfolio.php',
+ 'Zotlabs\\Widget\\Privacygroups' => __DIR__ . '/../..' . '/Zotlabs/Widget/Privacygroups.php',
'Zotlabs\\Widget\\Profile' => __DIR__ . '/../..' . '/Zotlabs/Widget/Profile.php',
'Zotlabs\\Widget\\Pubsites' => __DIR__ . '/../..' . '/Zotlabs/Widget/Pubsites.php',
'Zotlabs\\Widget\\Pubtagcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Pubtagcloud.php',
@@ -1936,6 +1958,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Widget\\Tagcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tagcloud.php',
'Zotlabs\\Widget\\Tagcloud_wall' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tagcloud_wall.php',
'Zotlabs\\Widget\\Tasklist' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tasklist.php',
+ 'Zotlabs\\Widget\\Tokens' => __DIR__ . '/../..' . '/Zotlabs/Widget/Tokens.php',
'Zotlabs\\Widget\\Vcard' => __DIR__ . '/../..' . '/Zotlabs/Widget/Vcard.php',
'Zotlabs\\Widget\\Website_portation_tools' => __DIR__ . '/../..' . '/Zotlabs/Widget/Website_portation_tools.php',
'Zotlabs\\Widget\\Wiki_list' => __DIR__ . '/../..' . '/Zotlabs/Widget/Wiki_list.php',
@@ -1969,6 +1992,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'phpseclib\\Net\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php',
'phpseclib\\System\\SSH\\Agent' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php',
'phpseclib\\System\\SSH\\Agent\\Identity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php',
+ 'voku\\helper\\ASCII' => __DIR__ . '/..' . '/voku/portable-ascii/src/voku/helper/ASCII.php',
+ 'voku\\helper\\StopWords' => __DIR__ . '/..' . '/voku/stop-words/src/voku/helper/StopWords.php',
+ 'voku\\helper\\StopWordsLanguageNotExists' => __DIR__ . '/..' . '/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php',
);
public static function getInitializer(ClassLoader $loader)
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index de7eb1394..81f2cc6f5 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -339,6 +339,72 @@
"install-path": "../ezyang/htmlpurifier"
},
{
+ "name": "jbroadway/urlify",
+ "version": "1.2.2-stable",
+ "version_normalized": "1.2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jbroadway/urlify.git",
+ "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jbroadway/urlify/zipball/9b227e8548f16268cef55b5eb5d659a801fa824b",
+ "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0",
+ "voku/portable-ascii": "^1.4",
+ "voku/stop-words": "^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0"
+ },
+ "time": "2020-06-14T17:15:34+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "URLify": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause-Clear"
+ ],
+ "authors": [
+ {
+ "name": "Johnny Broadway",
+ "email": "johnny@johnnybroadway.com",
+ "homepage": "http://www.johnnybroadway.com/"
+ }
+ ],
+ "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.",
+ "homepage": "https://github.com/jbroadway/urlify",
+ "keywords": [
+ "encode",
+ "iconv",
+ "link",
+ "slug",
+ "translit",
+ "transliterate",
+ "transliteration",
+ "url",
+ "urlify"
+ ],
+ "support": {
+ "issues": "https://github.com/jbroadway/urlify/issues",
+ "source": "https://github.com/jbroadway/urlify/tree/master"
+ },
+ "install-path": "../jbroadway/urlify"
+ },
+ {
"name": "league/html-to-markdown",
"version": "5.0.1",
"version_normalized": "5.0.1.0",
@@ -1829,6 +1895,133 @@
"source": "https://github.com/twbs/bootstrap/tree/v5.1.3"
},
"install-path": "../twbs/bootstrap"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "1.5.6",
+ "version_normalized": "1.5.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "time": "2020-11-12T00:07:28+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/1.5.6"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../voku/portable-ascii"
+ },
+ {
+ "name": "voku/stop-words",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/stop-words.git",
+ "reference": "8e63c0af20f800b1600783764e0ce19e53969f71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71",
+ "reference": "8e63c0af20f800b1600783764e0ce19e53969f71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0"
+ },
+ "time": "2018-11-23T01:37:27+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Stop-Words via PHP",
+ "keywords": [
+ "stop words",
+ "stop-words"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/stop-words/issues",
+ "source": "https://github.com/voku/stop-words/tree/master"
+ },
+ "install-path": "../voku/stop-words"
}
],
"dev": false,
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 5b4f16d0e..1bf306fa8 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -5,7 +5,7 @@
'type' => 'application',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => 'f19acd9f50ec9b8c78f77af64d523d2295b46052',
+ 'reference' => '69ba4eb0558938845fdc96957850672940965e11',
'name' => 'zotlabs/hubzilla',
'dev' => false,
),
@@ -64,6 +64,15 @@
'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
'dev_requirement' => false,
),
+ 'jbroadway/urlify' => array(
+ 'pretty_version' => '1.2.2-stable',
+ 'version' => '1.2.2.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../jbroadway/urlify',
+ 'aliases' => array(),
+ 'reference' => '9b227e8548f16268cef55b5eb5d659a801fa824b',
+ 'dev_requirement' => false,
+ ),
'league/html-to-markdown' => array(
'pretty_version' => '5.0.1',
'version' => '5.0.1.0',
@@ -256,13 +265,31 @@
0 => 'v5.1.3',
),
),
+ 'voku/portable-ascii' => array(
+ 'pretty_version' => '1.5.6',
+ 'version' => '1.5.6.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../voku/portable-ascii',
+ 'aliases' => array(),
+ 'reference' => '80953678b19901e5165c56752d087fc11526017c',
+ 'dev_requirement' => false,
+ ),
+ 'voku/stop-words' => array(
+ 'pretty_version' => '2.0.1',
+ 'version' => '2.0.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../voku/stop-words',
+ 'aliases' => array(),
+ 'reference' => '8e63c0af20f800b1600783764e0ce19e53969f71',
+ 'dev_requirement' => false,
+ ),
'zotlabs/hubzilla' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'type' => 'application',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => 'f19acd9f50ec9b8c78f77af64d523d2295b46052',
+ 'reference' => '69ba4eb0558938845fdc96957850672940965e11',
'dev_requirement' => false,
),
),
diff --git a/vendor/jbroadway/urlify/INSTALL b/vendor/jbroadway/urlify/INSTALL
new file mode 100644
index 000000000..92e1bb013
--- /dev/null
+++ b/vendor/jbroadway/urlify/INSTALL
@@ -0,0 +1,13 @@
+To install URLify, you can add it as a dependency by downloading Composer, the PHP package manager.
+
+`$ curl -s http://getcomposer.org/installer | php`
+
+Then run this command to install Composer:
+
+`$ php composer.phar install`
+
+For more details, see https://getcomposer.org/
+
+Then run this command to install the URLify library:
+
+`$ composer require jbroadway/urlify`
diff --git a/vendor/jbroadway/urlify/LICENSE b/vendor/jbroadway/urlify/LICENSE
new file mode 100644
index 000000000..5f4f225dd
--- /dev/null
+++ b/vendor/jbroadway/urlify/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) Django Software Foundation and individual contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. 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.
+
+ 3. Neither the name of Django 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/jbroadway/urlify/README.md b/vendor/jbroadway/urlify/README.md
new file mode 100644
index 000000000..74780485f
--- /dev/null
+++ b/vendor/jbroadway/urlify/README.md
@@ -0,0 +1,102 @@
+# URLify for PHP [![Build Status](https://travis-ci.org/jbroadway/urlify.png)](https://travis-ci.org/jbroadway/urlify)
+
+A fast PHP slug generator and transliteration library, started as a PHP port of
+[URLify.js](https://github.com/django/django/blob/master/django/contrib/admin/static/admin/js/urlify.js)
+from the Django project.
+
+Handles symbols from latin languages, Arabic, Azerbaijani, Bulgarian, Burmese, Croatian, Czech, Danish, Esperanto,
+Estonian, Finnish, French, Switzerland (French), Austrian (French), Georgian, German, Switzerland (German),
+Austrian (German), Greek, Hindi, Kazakh, Latvian, Lithuanian, Norwegian, Persian, Polish, Romanian, Russian, Swedish,
+Serbian, Slovak, Turkish, Ukrainian and Vietnamese, and many other via `ASCII::to_transliterate()`.
+
+Symbols it cannot transliterate it can omit or replace with a specified character.
+
+## Installation
+
+Install the latest version with:
+
+```bash
+$ composer require jbroadway/urlify
+```
+
+## Usage
+
+First, include Composer's autoloader:
+
+```php
+require_once 'vendor/autoload.php';
+```
+
+To generate slugs for URLs:
+
+```php
+<?php
+
+echo URLify::slug (' J\'étudie le français ');
+// "jetudie-le-francais"
+
+echo URLify::slug ('Lo siento, no hablo español.');
+// "lo-siento-no-hablo-espanol"
+```
+
+To generate slugs for file names:
+
+```php
+<?php
+
+echo URLify::filter ('фото.jpg', 60, "", true);
+// "foto.jpg"
+```
+
+To simply transliterate characters:
+
+```php
+<?php
+
+echo URLify::downcode ('J\'étudie le français');
+// "J'etudie le francais"
+
+echo URLify::downcode ('Lo siento, no hablo español.');
+// "Lo siento, no hablo espanol."
+
+/* Or use transliterate() alias: */
+
+echo URLify::transliterate ('Lo siento, no hablo español.');
+// "Lo siento, no hablo espanol."
+```
+
+To extend the character list:
+
+```php
+<?php
+
+URLify::add_chars ([
+ '¿' => '?', '®' => '(r)', '¼' => '1/4',
+ '½' => '1/2', '¾' => '3/4', '¶' => 'P'
+]);
+
+echo URLify::downcode ('¿ ® ¼ ¼ ¾ ¶');
+// "? (r) 1/2 1/2 3/4 P"
+```
+
+To extend the list of words to remove:
+
+```php
+<?php
+
+URLify::remove_words (['remove', 'these', 'too']);
+```
+
+To prioritize a certain language map:
+
+```php
+<?php
+
+echo URLify::filter ('Ägypten und Österreich besitzen wie üblich ein Übermaß an ähnlich öligen Attachés', 60, 'de');
+// "aegypten-und-oesterreich-besitzen-wie-ueblich-ein-uebermass-aehnlich-oeligen-attaches"
+
+echo URLify::filter ('Cağaloğlu, çalıştığı, müjde, lazım, mahkûm', 60, 'tr');
+// "cagaloglu-calistigi-mujde-lazim-mahkum"
+```
+
+Please note that the "ü" is transliterated to "ue" in the first case, whereas it results in a simple "u" in the latter.
diff --git a/vendor/jbroadway/urlify/URLify.php b/vendor/jbroadway/urlify/URLify.php
new file mode 100644
index 000000000..be46bd83a
--- /dev/null
+++ b/vendor/jbroadway/urlify/URLify.php
@@ -0,0 +1,591 @@
+<?php
+
+/**
+ * A fast PHP slug generator and transliteration library, started as a PHP port of URLify.js
+ * from the Django project + fallback via "Portable ASCII".
+ *
+ * - https://github.com/django/django/blob/master/django/contrib/admin/static/admin/js/urlify.js
+ * - https://github.com/voku/portable-ascii
+ *
+ * Handles symbols from latin languages, Arabic, Azerbaijani, Bulgarian, Burmese, Croatian, Czech, Danish, Esperanto,
+ * Estonian, Finnish, French, Switzerland (French), Austrian (French), Georgian, German, Switzerland (German),
+ * Austrian (German), Greek, Hindi, Kazakh, Latvian, Lithuanian, Norwegian, Persian, Polish, Romanian, Russian, Swedish,
+ * Serbian, Slovak, Turkish, Ukrainian and Vietnamese ... and many other via "ASCII::to_transliterate()".
+ */
+class URLify
+{
+ /**
+ * The language-mapping array.
+ *
+ * ISO 639-1 codes: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+ *
+ * @var array[]
+ */
+ public static $maps = [];
+
+ /**
+ * List of words to remove from URLs.
+ *
+ * @var array[]
+ */
+ public static $remove_list = [];
+
+ /**
+ * An array of strings that will convert into the separator-char - used by "URLify::filter()".
+ *
+ * @var string[]
+ */
+ private static $arrayToSeparator = [];
+
+ /**
+ * Add new strings the will be replaced with the separator.
+ *
+ * @param array $array <p>An array of things that should replaced by the separator.</p>
+ * @param bool $merge <p>Keep the previous (default) array-to-separator array.</p>
+ *
+ * @return void
+ *
+ * @psalm-param string[] $array
+ */
+ public static function add_array_to_separator(array $array, bool $merge = true)
+ {
+ if ($merge === true) {
+ self::$arrayToSeparator = \array_unique(
+ \array_merge(
+ self::$arrayToSeparator,
+ $array
+ )
+ );
+ } else {
+ self::$arrayToSeparator = $array;
+ }
+ }
+
+ /**
+ * Add new characters to the list. `$map` should be a hash.
+ *
+ * @param array $map
+ * @param string|null $language
+ *
+ * @return void
+ *
+ * @psalm-param array<string, string> $map
+ */
+ public static function add_chars(array $map, string $language = null)
+ {
+ $language_key = $language ?? \uniqid('urlify', true);
+
+ if (isset(self::$maps[$language_key])) {
+ self::$maps[$language_key] = \array_merge($map, self::$maps[$language_key]);
+ } else {
+ self::$maps[$language_key] = $map;
+ }
+ }
+
+ /**
+ * @return void
+ */
+ public static function reset_chars()
+ {
+ self::$maps = [];
+ }
+
+ /**
+ * Transliterates characters to their ASCII equivalents.
+ * $language specifies a priority for a specific language.
+ * The latter is useful if languages have different rules for the same character.
+ *
+ * @param string $string <p>The input string.</p>
+ * @param string $language <p>Your primary language.</p>
+ * @param string $unknown <p>Character use if character unknown. (default is ?).</p>
+ *
+ * @return string
+ */
+ public static function downcode(
+ string $string,
+ string $language = 'en',
+ string $unknown = ''
+ ): string {
+ $string = self::expandString($string, $language);
+
+ foreach (self::$maps as $mapsInner) {
+ foreach ($mapsInner as $orig => $replace) {
+ $string = \str_replace($orig, $replace, $string);
+ }
+ }
+
+ $string = \voku\helper\ASCII::to_ascii(
+ $string,
+ $language,
+ false,
+ true
+ );
+
+ return \voku\helper\ASCII::to_transliterate(
+ $string,
+ $unknown,
+ false
+ );
+ }
+
+ /**
+ * Convert a String to URL slug. Wraps <strong>filter()</strong> with a simpler
+ * set of defaults for typical usage in generating blog post slugs.
+ *
+ * @param string $string <p>The text you want to convert.</p>
+ * @param int $maxLength <p>Max. length of the output string, set to "0" (zero) to
+ * disable it</p>
+ * @param string $separator <p>Define a new separator for the words.</p>
+ * @param string $language <p>The language you want to convert to.</p>
+ */
+ public static function slug(
+ string $string,
+ int $maxLength = 200,
+ string $separator = '-',
+ string $language = 'en'
+ ): string {
+ return self::filter ($string, $maxLength, $language, false, false, true, $separator);
+ }
+
+ /**
+ * Convert a String to URL.
+ *
+ * e.g.: "Petty<br>theft" to "Petty-theft"
+ *
+ * @param string $string <p>The text you want to convert.</p>
+ * @param int $maxLength <p>Max. length of the output string, set to "0" (zero) to
+ * disable it</p>
+ * @param string $language <p>The language you want to convert to.</p>
+ * @param bool $fileName <p>
+ * Keep the "." from the extension e.g.: "imaäe.jpg" =>
+ * "image.jpg"
+ * </p>
+ * @param bool $removeWords <p>
+ * Remove some "words" from the string.<br />
+ * Info: Set extra words via <strong>remove_words()</strong>.
+ * </p>
+ * @param bool $strToLower <p>Use <strong>strtolower()</strong> at the end.</p>
+ * @param bool|string $separator <p>Define a new separator for the words.</p>
+ *
+ * @return string
+ */
+ public static function filter(
+ string $string,
+ int $maxLength = 200,
+ string $language = 'en',
+ bool $fileName = false,
+ bool $removeWords = false,
+ bool $strToLower = true,
+ $separator = '-'
+ ): string {
+ if ($string === '') {
+ return '';
+ }
+
+ // fallback
+ if ($language === '') {
+ $language = 'en';
+ }
+
+ // separator-fallback
+ if ($separator === false) {
+ $separator = '_';
+ }
+ if ($separator === true || $separator === '') {
+ $separator = '-';
+ }
+
+ // escaped separator
+ $separatorEscaped = \preg_quote($separator, '/');
+
+ // use defaults, if there are no values
+ if (self::$arrayToSeparator === []) {
+ self::reset_array_to_separator();
+ }
+
+ // remove apostrophes which are not used as quotes around a string
+ if (\strpos($string, "'") !== false) {
+ $stringTmp = \preg_replace("/(\w)'(\w)/u", '${1}${2}', $string);
+ if ($stringTmp !== null) {
+ $string = (string) $stringTmp;
+ }
+ }
+
+ // replace with $separator
+ $string = (string) \preg_replace(
+ self::$arrayToSeparator,
+ $separator,
+ $string
+ );
+
+ // remove all other html-tags
+ if (
+ \strpos($string, '<') !== false
+ ||
+ \strpos($string, '>') !== false
+ ) {
+ $string = \strip_tags($string);
+ }
+
+ // use special language replacer
+ $string = self::downcode($string, $language);
+
+ // replace with $separator, again
+ $string = (string) \preg_replace(
+ self::$arrayToSeparator,
+ $separator,
+ $string
+ );
+
+ // remove all these words from the string before urlifying
+ $removeWordsSearch = '//';
+ if ($removeWords === true) {
+ $removeList = self::get_remove_list($language);
+ if ($removeList !== []) {
+ $removeWordsSearch = '/\b(?:' . \implode('|', $removeList) . ')\b/ui';
+ }
+ }
+
+ // keep the "." from e.g.: a file-extension?
+ if ($fileName) {
+ $removePatternAddOn = '.';
+ } else {
+ $removePatternAddOn = '';
+ }
+
+ $string = (string) \preg_replace(
+ [
+ // 1) remove un-needed chars
+ '/[^' . $separatorEscaped . $removePatternAddOn . '\-a-zA-Z0-9\s]/u',
+ // 2) convert spaces to $separator
+ '/[\s]+/u',
+ // 3) remove some extras words
+ $removeWordsSearch,
+ // 4) remove double $separator's
+ '/[' . ($separatorEscaped ?: ' ') . ']+/u',
+ // 5) remove $separator at the end
+ '/[' . ($separatorEscaped ?: ' ') . ']+$/u',
+ ],
+ [
+ '',
+ $separator,
+ '',
+ $separator,
+ '',
+ ],
+ $string
+ );
+
+ // "substr" only if "$length" is set
+ if (
+ $maxLength
+ &&
+ $maxLength > 0
+ &&
+ \strlen($string) > $maxLength
+ ) {
+ $string = (string) \substr(\trim($string, $separator), 0, $maxLength);
+ }
+
+ // convert to lowercase
+ if ($strToLower === true) {
+ $string = \strtolower($string);
+ }
+
+ // trim "$separator" from beginning and end of the string
+ return \trim($string, $separator);
+ }
+
+ /**
+ * Append words to the remove list. Accepts either single words or an array of words.
+ *
+ * @param string|string[] $words
+ * @param string $language
+ * @param bool $merge <p>Keep the previous (default) remove-words array.</p>
+ *
+ * @return void
+ */
+ public static function remove_words($words, string $language = 'en', bool $merge = true)
+ {
+ if (\is_array($words) === false) {
+ $words = [$words];
+ }
+
+ foreach ($words as $removeWordKey => $removeWord) {
+ $words[$removeWordKey] = \preg_quote($removeWord, '/');
+ }
+
+ if ($merge === true) {
+ self::$remove_list[$language] = \array_unique(
+ \array_merge(
+ self::get_remove_list($language),
+ $words
+ )
+ );
+ } else {
+ self::$remove_list[$language] = $words;
+ }
+ }
+
+ /**
+ * Reset the internal "self::$arrayToSeparator" to the default values.
+ *
+ * @return void
+ */
+ public static function reset_array_to_separator()
+ {
+ self::$arrayToSeparator = [
+ '/&quot;|&amp;|&lt;|&gt;|&ndash;|&mdash;/i', // ", &, <, >, –, —
+ '/⁻|-|—|_|"|`|´|\'/',
+ "#/\r\n|\r|\n|<br.*/?>#isU",
+ ];
+ }
+
+ /**
+ * reset the word-remove-array
+ *
+ * @param string $language
+ *
+ * @return void
+ */
+ public static function reset_remove_list(string $language = 'en')
+ {
+ if ($language === '') {
+ return;
+ }
+
+ $language_orig = $language;
+ $language = self::get_language_for_reset_remove_list($language);
+ if ($language === '') {
+ return;
+ }
+
+ $stopWords = new \voku\helper\StopWords();
+
+ try {
+ self::$remove_list[$language_orig] = $stopWords->getStopWordsFromLanguage($language);
+ } catch (\voku\helper\StopWordsLanguageNotExists $e) {
+ self::$remove_list[$language_orig] = [];
+ }
+ }
+
+ /**
+ * Alias of `URLify::downcode()`.
+ *
+ * @param string $string
+ * @param string $language
+ *
+ * @return string
+ */
+ public static function transliterate(string $string, string $language = 'en'): string
+ {
+ return self::downcode($string, $language);
+ }
+
+ /**
+ * Expands the given string replacing some special parts for words.
+ * e.g. "lorem@ipsum.com" is replaced by "lorem at ipsum dot com".
+ *
+ * Most of these transformations have been inspired by the pelle/slugger
+ * project, distributed under the Eclipse Public License.
+ * Copyright 2012 Pelle Braendgaard
+ *
+ * @param string $string The string to expand
+ * @param string $language
+ *
+ * @return string The result of expanding the string
+ */
+ protected static function expandString(string $string, string $language = 'en'): string
+ {
+ $string = self::expandCurrencies($string, $language);
+
+ return self::expandSymbols($string, $language);
+ }
+
+ /**
+ * @param string $language
+ *
+ * @return string
+ */
+ private static function get_language_for_reset_remove_list(string $language)
+ {
+ if ($language === '') {
+ return '';
+ }
+
+ if (
+ \strpos($language, '_') === false
+ &&
+ \strpos($language, '-') === false
+ ) {
+ $language = \strtolower($language);
+ } else {
+ $regex = '/(?<first>[a-z]{2}).*/i';
+ $language = \strtolower((string) \preg_replace($regex, '$1', $language));
+ }
+
+ return $language;
+ }
+
+ /**
+ * Expands the numeric currencies in euros, dollars, pounds
+ * and yens that the given string may include.
+ *
+ * @param string $string
+ * @param string $language
+ *
+ * @return string
+ */
+ private static function expandCurrencies(string $string, string $language = 'en')
+ {
+ if (
+ \strpos($string, '€') === false
+ &&
+ \strpos($string, '$') === false
+ &&
+ \strpos($string, '£') === false
+ &&
+ \strpos($string, '¥') === false
+ ) {
+ return $string;
+ }
+
+ if ($language === 'de') {
+ return (string) \preg_replace(
+ [
+ '/(?:\s|^)(\d+)(?: )*€(?:\s|$)/',
+ '/(?:\s|^)\$(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)£(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)¥(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)(\d+)[.|,](\d+)(?: )*€(?:\s|$)/',
+ '/(?:\s|^)\$(?: )*(\d+)[.|,](\d+)(?:\s|$)/',
+ '/(?:\s|^)£(?: )*(\d+)[.|,](\d+)(?:\s|$)/',
+ ],
+ [
+ ' \1 Euro ',
+ ' \1 Dollar ',
+ ' \1 Pound ',
+ ' \1 Yen ',
+ ' \1 Euro \2 Cent ',
+ ' \1 Dollar \2 Cent ',
+ ' \1 Pound \2 Pence ',
+ ],
+ $string
+ );
+ }
+
+ return (string) \preg_replace(
+ [
+ '/(?:\s|^)1(?: )*€(?:\s|$)/',
+ '/(?:\s|^)(\d+)(?: )*€(?:\s|$)/',
+ '/(?:\s|^)\$(?: )*1(?:\s|$)/',
+ '/(?:\s|^)\$(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)£(?: )*1(?:\s|$)/',
+ '/(?:\s|^)£(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)¥(?: )*(\d+)(?:\s|$)/',
+ '/(?:\s|^)1[.|,](\d+)(?: )*€(?:\s|$)/',
+ '/(?:\s|^)(\d+)[.|,](\d+)(?: )*€(?:\s|$)/',
+ '/(?:\s|^)1[.|,](\d+)(?: )*$(?:\s|$)/',
+ '/(?:\s|^)\$(?: )*(\d+)[.|,](\d+)(?:\s|$)/',
+ '/(?:\s|^)1[.|,](\d+)(?: )*£(?:\s|$)/',
+ '/(?:\s|^)£(?: )*(\d+)[.|,](\d+)(?:\s|$)/',
+ ],
+ [
+ ' 1 Euro ',
+ ' \1 Euros ',
+ ' 1 Dollar ',
+ ' \1 Dollars ',
+ ' 1 Pound ',
+ ' \1 Pounds ',
+ ' \1 Yen ',
+ ' 1 Euros \1 Cents ',
+ ' \1 Euros \2 Cents ',
+ ' 1 Dollars \1 Cents ',
+ ' \1 Dollars \2 Cents ',
+ ' 1 Pounds \1 Pence ',
+ ' \1 Pounds \2 Pence ',
+ ],
+ $string
+ );
+ }
+
+ /**
+ * Expands the special symbols that the given string may include, such as '@', '.', '#' and '%'.
+ *
+ * @param string $string
+ * @param string $language
+ *
+ * @return string
+ */
+ private static function expandSymbols(string $string, string $language = 'en')
+ {
+ if (
+ \strpos($string, '©') === false
+ &&
+ \strpos($string, '®') === false
+ &&
+ \strpos($string, '@') === false
+ &&
+ \strpos($string, '&') === false
+ &&
+ \strpos($string, '%') === false
+ &&
+ \strpos($string, '=') === false
+ ) {
+ return $string;
+ }
+
+ $maps = \voku\helper\ASCII::charsArray(true);
+
+ return (string) \preg_replace(
+ [
+ '/\s*©\s*/',
+ '/\s*®\s*/',
+ '/\s*@\s*/',
+ '/\s*&\s*/',
+ '/\s*%\s*/',
+ '/(\s*=\s*)/',
+ ],
+ [
+ $maps['latin_symbols']['©'],
+ $maps['latin_symbols']['®'],
+ $maps['latin_symbols']['@'],
+ $maps[$language]['&'] ?? '&',
+ $maps[$language]['%'] ?? '%',
+ $maps[$language]['='] ?? '=',
+ ],
+ $string
+ );
+ }
+
+ /**
+ * return the "self::$remove_list[$language]" array
+ *
+ * @param string $language
+ *
+ * @return array<mixed>
+ */
+ private static function get_remove_list(string $language = 'en')
+ {
+ // check for language
+ if ($language === '') {
+ return [];
+ }
+
+ // set remove-array
+ if (!isset(self::$remove_list[$language])) {
+ self::reset_remove_list($language);
+ }
+
+ // check for array
+ if (
+ !isset(self::$remove_list[$language])
+ ||
+ empty(self::$remove_list[$language])
+ ) {
+ return [];
+ }
+
+ return self::$remove_list[$language];
+ }
+}
diff --git a/library/urlify/composer.json b/vendor/jbroadway/urlify/composer.json
index 2d95f6aa6..a7731b0ea 100644
--- a/library/urlify/composer.json
+++ b/vendor/jbroadway/urlify/composer.json
@@ -4,7 +4,7 @@
"description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.",
"keywords": ["urlify","transliterate","translit","transliteration","url","encode","slug","link","iconv"],
"homepage": "https://github.com/jbroadway/urlify",
- "license": "MIT",
+ "license": "BSD-3-Clause-Clear",
"authors": [
{
"name": "Johnny Broadway",
@@ -13,9 +13,19 @@
}
],
"require": {
- "php": ">=5.3.0"
+ "php": ">=7.2.0",
+ "voku/portable-ascii": "^1.4",
+ "voku/stop-words": "^2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0"
},
"autoload": {
"psr-0": { "URLify": "" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
}
}
diff --git a/vendor/jbroadway/urlify/scripts/downcode.php b/vendor/jbroadway/urlify/scripts/downcode.php
new file mode 100644
index 000000000..018e7d4fa
--- /dev/null
+++ b/vendor/jbroadway/urlify/scripts/downcode.php
@@ -0,0 +1,25 @@
+<?php
+
+//
+// Downcode the provided argument or stdin if the argument was not present
+//
+
+require_once \dirname(__DIR__) . '/vendor/autoload.php';
+require_once \dirname(__DIR__) . '/URLify.php';
+
+// Print usage and exit if arguments are invalid
+if ($argc < 1 || $argc > 2) {
+ die('Usage (argument): php ' . \basename(__FILE__) . " \"<text to downcode>\"\nUsage (pipe): <Arbitrary command> | php " . \basename(__FILE__) . "\n");
+}
+
+// Process the provided argument
+$piped = false;
+if ($argc === 2) {
+ $s = $argv[1];
+// Or read from stdin if the argument wasn't present
+} else {
+ $piped = true;
+ $s = \file_get_contents('php://stdin');
+}
+
+echo URLify::downcode($s) . ($piped ? "\n" : '');
diff --git a/vendor/jbroadway/urlify/scripts/filter.php b/vendor/jbroadway/urlify/scripts/filter.php
new file mode 100644
index 000000000..d20c31594
--- /dev/null
+++ b/vendor/jbroadway/urlify/scripts/filter.php
@@ -0,0 +1,25 @@
+<?php
+
+//
+// Filter the provided argument or stdin if the argument was not present
+//
+
+require_once \dirname(__DIR__) . '/vendor/autoload.php';
+require_once \dirname(__DIR__) . '/URLify.php';
+
+// Print usage and exit if arguments are invalid
+if ($argc < 1 || $argc > 2) {
+ die('Usage (argument): php ' . \basename(__FILE__) . " \"<text to filter>\"\nUsage (pipe): <Arbitrary command> | php " . \basename(__FILE__) . "\n");
+}
+
+// Process the provided argument
+$piped = false;
+if ($argc === 2) {
+ $s = $argv[1];
+// Or read from stdin if the argument wasn't present
+} else {
+ $piped = true;
+ $s = \file_get_contents('php://stdin');
+}
+
+echo URLify::filter($s) . ($piped ? "\n" : '');
diff --git a/vendor/jbroadway/urlify/scripts/transliterate.php b/vendor/jbroadway/urlify/scripts/transliterate.php
new file mode 100644
index 000000000..1970b506c
--- /dev/null
+++ b/vendor/jbroadway/urlify/scripts/transliterate.php
@@ -0,0 +1,25 @@
+<?php
+
+//
+// Transliterate the provided argument or stdin if the argument was not present
+//
+
+require_once \dirname(__DIR__) . '/vendor/autoload.php';
+require_once \dirname(__DIR__) . '/URLify.php';
+
+// Print usage and exit if arguments are invalid
+if ($argc < 1 || $argc > 2) {
+ die('Usage (argument): php ' . \basename(__FILE__) . " \"<text to transliterate>\"\nUsage (pipe): <Arbitrary command> | php " . \basename(__FILE__) . "\n");
+}
+
+// Process the provided argument
+$piped = false;
+if ($argc === 2) {
+ $s = $argv[1];
+// Or read from stdin if the argument wasn't present
+} else {
+ $piped = true;
+ $s = \file_get_contents('php://stdin');
+}
+
+echo URLify::transliterate($s) . ($piped ? "\n" : '');
diff --git a/vendor/voku/portable-ascii/CHANGELOG.md b/vendor/voku/portable-ascii/CHANGELOG.md
new file mode 100644
index 000000000..6e5357d08
--- /dev/null
+++ b/vendor/voku/portable-ascii/CHANGELOG.md
@@ -0,0 +1,177 @@
+# Changelog
+
+### 1.5.6 (2020-11-12)
+
+- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2
+
+### 1.5.5 (2020-11-12)
+
+- fix "Greeklish" char-mapping (thanks @sebdesign)
+- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed
+
+### 1.5.4 (2020-11-08)
+
+- add some missing replacements in U+23xx page (thanks @marcoffee)
+- fix "Russian" char-mapping (thanks @ilyahoilik)
+- running test with PHP 8.0 rc3
+
+### 1.5.3 (2020-07-23)
+
+- fix "Georgian" char-mapping (thanks @waska14)
+
+### 1.5.2 (2020-06-16)
+
+- add "Bengali" (bn) language support (thanks @eliyas5044)
+- fix "Portuguese" char-mapping
+- reduce the file size (removed extra comments from "avian2/unidecode")
+
+### 1.5.1 (2020-05-26)
+
+- fix merge ASCII transliterations from "avian2/unidecode" (python)
+ -> https://github.com/avian2/unidecode/
+
+### 1.5.0 (2020-05-24)
+
+- merge ASCII transliterations from "avian2/unidecode" (python)
+ -> https://github.com/avian2/unidecode/
+
+### 1.4.11 (2020-05-23)
+
+- "composer.json" -> remove "autoload-dev" stuff from "autoload"
+- "voku/php-readme-helper" -> auto-generate the API documentation in the README
+
+### 1.4.10 (2020-03-13)
+
+- ASCII::to_ascii() -> fix extra symbol handling in the regex
+- ASCII::to_ascii() -> fix for languages with multi-length-special-char (e.g. Greek -> 'ει' => 'i')
+
+### 1.4.9 (2020-03-06)
+
+- ASCII::to_slugify() -> fix php warning from empty "separator"
+
+### 1.4.8 (2020-02-06)
+
+- small optimization for "ASCII::to_ascii()" performance
+
+### 1.4.7 (2020-01-27)
+
+- fix possible wrong type from "getDataIfExists()" -> e.g. a bug reported where "/data/" was modified
+- inline variables
+- do not use "=== true" for "bool"-types
+
+### 1.4.6 (2019-12-23)
+
+- optimize "ASCII::to_ascii()" performance
+- add "armenian" chars
+- add "ASCII:getAllLanguages()"
+
+### 1.4.5 (2019-12-19)
+
+- use "@psalm-pure" v2
+
+### 1.4.4 (2019-12-19)
+
+- use "@psalm-pure"
+
+### 1.4.3 (2019-12-19)
+
+- use "@psalm-immutable"
+
+### 1.4.2 (2019-12-13)
+
+- optimize the performance v2
+- more fixes for non-ascii regex
+
+### 1.4.1 (2019-12-13)
+
+- fix regex for non-ascii
+
+### 1.4.0 (2019-12-13)
+
+- optimize the performance, via single char replacements
+
+### 1.3.6 (2019-12-13)
+
+- "ascii_extras" -> convert the static content into ascii
+ -> e.g.: instead of replacing "+" with "più" we use "piu" (Italian), because we want to use ascii anyway
+
+### 1.3.5 (2019-11-11)
+
+- fix "ASCII::remove_invisible_characters()" -> do not remove invisible encoded url strings by default
+
+### 1.3.4 (2019-10-14)
+
+- fix static cache for "ASCII::charsArrayWithOneLanguage"
+
+### 1.3.3 (2019-10-14)
+
+- fix "Turkish" mapping -> 'ä' -> 'a'
+
+### 1.3.2 (2019-10-14)
+
+- fix language parameter usage with e.g. "de_DE"
+- re-add missing "extra"-mapping chars
+
+### 1.3.1 (2019-10-13)
+
+- fix "ASCII::to_slugify" -> remove unicode chars
+- add more test for ascii chars in the mapping
+- fix non ascii chars in the mapping
+
+### 1.3.0 (2019-10-12)
+
+- add transliteration "fr" (was supported before, but with chars from other languages)
+- add transliteration "ru" - Passport (2013), ICAO
+- add transliteration "ru" - GOST 7.79-2000(B)
+- add transliteration "el" - greeklish
+- add transliteration "zh"
+- add transliteration "nl"
+- add transliteration "it"
+- add transliteration "mk"
+- add transliteration "pt"
+- add constants -> ASCII::*LANGUAGE_CODES
+- add more special latin chars / (currency) symbols
+- add simple tests for all supported languages
+- optimize "Russian" to ASCII (via "translit.ru")
+- optimize performance of string replacement
+- optimize performance of array merging
+- optimize phpdoc comments
+- "ASCII::to_transliterate" -> use "transliterator_create" + static cache
+- "ASCII::to_ascii" -> fix "remove unsupported chars"
+- "ASCII::to_ascii" -> add some more special chars
+- run/fix static analyse via "pslam" + "phpstan"
+- auto fix code style via "php-cs-fixer"
+- fix transliteration for "german"
+- fix transliteration for "persian" (thanks @mardep)
+- fix transliteration for "polish" (thanks @dariusz.drobisz)
+- fix transliteration for "bulgarian" (thanks @mkosturkov)
+- fix transliteration for "croatian" (thanks @ludifonovac)
+- fix transliteration for "serbian" (thanks @ludifonovac)
+- fix transliteration for "swedish" (thanks @nicholasruunu)
+- fix transliteration for "france" (thanks @sharptsa)
+- fix transliteration for "serbian" (thanks @nikolaposa)
+- fix transliteration for "czech" (thanks @slepic)
+
+### 1.2.3 (2019-09-10)
+
+- fix language depending ASCII chars (the order matters)
+
+### 1.2.2 (2019-09-10)
+
+- fix bulgarian ASCII chars | thanks @bgphp
+
+### 1.2.1 (2019-09-07)
+
+- "charsArray()" -> add access to "ASCII::$ASCII_MAPS*""
+
+### 1.2.0 (2019-09-07)
+
+- "to_slugify()" -> use the extra ascii array
+
+### 1.1.0 (2019-09-07)
+
+- add + split extra ascii replacements
+
+### 1.0.0 (2019-09-05)
+
+- initial commit \ No newline at end of file
diff --git a/vendor/voku/portable-ascii/LICENSE.txt b/vendor/voku/portable-ascii/LICENSE.txt
new file mode 100644
index 000000000..b6ba47eae
--- /dev/null
+++ b/vendor/voku/portable-ascii/LICENSE.txt
@@ -0,0 +1,19 @@
+Copyright (C) 2019 Lars Moelleken
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/voku/portable-ascii/README.md b/vendor/voku/portable-ascii/README.md
new file mode 100644
index 000000000..9dd7cecef
--- /dev/null
+++ b/vendor/voku/portable-ascii/README.md
@@ -0,0 +1,428 @@
+[//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md)
+[![Build Status](https://travis-ci.com/voku/portable-ascii.svg?branch=master)](https://travis-ci.com/voku/portable-ascii)
+[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master)
+[![Coverage Status](https://coveralls.io/repos/voku/portable-ascii/badge.svg?branch=master&service=github)](https://coveralls.io/github/voku/portable-ascii?branch=master)
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii)
+[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii)
+[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii)
+[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii)
+[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken)
+[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku)
+
+# 🔡 Portable ASCII
+
+## Description
+
+It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server.
+
+The benefit of Portable ASCII is that it is easy to use, easy to bundle.
+
+The project based on ...
++ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode)
++ Tomaz Solc's work (https://pypi.org/project/Unidecode/)
++ Portable UTF-8 work (https://github.com/voku/portable-utf8)
++ Daniel St. Jules's work (https://github.com/danielstjules/Stringy)
++ Johnny Broadway's work (https://github.com/jbroadway/urlify)
++ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ...
+
+## Index
+
+* [Alternative](#alternative)
+* [Install](#install-portable-ascii-via-composer-require)
+* [Why Portable ASCII?](#why-portable-ascii)
+* [Requirements and Recommendations](#requirements-and-recommendations)
+* [Usage](#usage)
+* [Class methods](#class-methods)
+* [Unit Test](#unit-test)
+* [License and Copyright](#license-and-copyright)
+
+## Alternative
+
+If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods.
+
+```php
+// Portable ASCII
+use voku\helper\ASCII;
+ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii'
+
+// voku/Stringy
+use Stringy\Stringy as S;
+$stringy = S::create('déjà σσς iıii');
+$stringy->toTransliterate(); // 'deja sss iiii'
+```
+
+## Install "Portable ASCII" via "composer require"
+```shell
+composer require voku/portable-ascii
+```
+
+## Why Portable ASCII?[]()
+I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8",
+but this repo is more modular and portable, because it has no dependencies.
+
+## Requirements and Recommendations
+
+* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must.
+* PHP 7.0 is the minimum requirement
+* PHP 8.0 is also supported
+
+## Usage
+
+Example: ASCII::to_ascii()
+```php
+ echo ASCII::to_ascii('�Düsseldorf�', 'de');
+
+ // will output
+ // Duesseldorf
+
+ echo ASCII::to_ascii('�Düsseldorf�', 'en');
+
+ // will output
+ // Dusseldorf
+```
+
+# Portable ASCII | API
+
+The API from the "ASCII"-Class is written as small static methods.
+
+
+## Class methods
+
+<p id="voku-php-readme-class-methods"></p><table><tr><td><a href="#charsarraybool-replace_extra_symbols-array">charsArray</a>
+</td><td><a href="#charsarraywithmultilanguagevaluesbool-replace_extra_symbols-array">charsArrayWithMultiLanguageValues</a>
+</td><td><a href="#charsarraywithonelanguagestring-language-bool-replace_extra_symbols-bool-asorigreplacearray-array">charsArrayWithOneLanguage</a>
+</td><td><a href="#charsarraywithsinglelanguagevaluesbool-replace_extra_symbols-bool-asorigreplacearray-array">charsArrayWithSingleLanguageValues</a>
+</td></tr><tr><td><a href="#cleanstring-str-bool-normalize_whitespace-bool-keep_non_breaking_space-bool-normalize_msword-bool-remove_invisible_characters-string">clean</a>
+</td><td><a href="#getalllanguages-string">getAllLanguages</a>
+</td><td><a href="#is_asciistring-str-bool">is_ascii</a>
+</td><td><a href="#normalize_mswordstring-str-string">normalize_msword</a>
+</td></tr><tr><td><a href="#normalize_whitespacestring-str-bool-keepnonbreakingspace-bool-keepbidiunicodecontrols-bool-replaceseparatorswithnewline-string">normalize_whitespace</a>
+</td><td><a href="#remove_invisible_charactersstring-str-bool-url_encoded-string-replacement-bool-keep_control_characters-string">remove_invisible_characters</a>
+</td><td><a href="#to_asciistring-str-string-language-bool-remove_unsupported_chars-bool-replace_extra_symbols-bool-use_transliterate-boolnull-replace_single_chars_only-string">to_ascii</a>
+</td><td><a href="#to_filenamestring-str-bool-use_transliterate-string-fallback_char-string">to_filename</a>
+</td></tr><tr><td><a href="#to_slugifystring-str-string-separator-string-language-string-replacements-bool-replace_extra_symbols-bool-use_str_to_lower-bool-use_transliterate-string">to_slugify</a>
+</td><td><a href="#to_transliteratestring-str-stringnull-unknown-bool-strict-string">to_transliterate</a>
+</td></tr></table>
+
+#### charsArray(bool $replace_extra_symbols): array
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an replacement array for ASCII methods.
+
+EXAMPLE: <code>
+$array = ASCII::charsArray();
+var_dump($array['ru']['б']); // 'b'
+</code>
+
+**Parameters:**
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>`
+
+**Return:**
+- `array`
+
+--------
+
+#### charsArrayWithMultiLanguageValues(bool $replace_extra_symbols): array
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an replacement array for ASCII methods with a mix of multiple languages.
+
+EXAMPLE: <code>
+$array = ASCII::charsArrayWithMultiLanguageValues();
+var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب']
+</code>
+
+**Parameters:**
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>`
+
+**Return:**
+- `array <p>An array of replacements.</p>`
+
+--------
+
+#### charsArrayWithOneLanguage(string $language, bool $replace_extra_symbols, bool $asOrigReplaceArray): array
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an replacement array for ASCII methods with one language.
+
+For example, German will map 'ä' to 'ae', while other languages
+will simply return e.g. 'a'.
+
+EXAMPLE: <code>
+$array = ASCII::charsArrayWithOneLanguage('ru');
+$tmpKey = \array_search('yo', $array['replace']);
+echo $array['orig'][$tmpKey]; // 'ё'
+</code>
+
+**Parameters:**
+- `string $language [optional] <p>Language of the source string e.g.: en, de_at, or de-ch.
+(default is 'en') | ASCII::*_LANGUAGE_CODE</p>`
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>`
+- `bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]}
+array</p>`
+
+**Return:**
+- `array <p>An array of replacements.</p>`
+
+--------
+
+#### charsArrayWithSingleLanguageValues(bool $replace_extra_symbols, bool $asOrigReplaceArray): array
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an replacement array for ASCII methods with multiple languages.
+
+EXAMPLE: <code>
+$array = ASCII::charsArrayWithSingleLanguageValues();
+$tmpKey = \array_search('hnaik', $array['replace']);
+echo $array['orig'][$tmpKey]; // '၌'
+</code>
+
+**Parameters:**
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>`
+- `bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]}
+array</p>`
+
+**Return:**
+- `array <p>An array of replacements.</p>`
+
+--------
+
+#### clean(string $str, bool $normalize_whitespace, bool $keep_non_breaking_space, bool $normalize_msword, bool $remove_invisible_characters): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Accepts a string and removes all non-UTF-8 characters from it + extras if needed.
+
+**Parameters:**
+- `string $str <p>The string to be sanitized.</p>`
+- `bool $normalize_whitespace [optional] <p>Set to true, if you need to normalize the
+whitespace.</p>`
+- `bool $keep_non_breaking_space [optional] <p>Set to true, to keep non-breaking-spaces, in
+combination with
+$normalize_whitespace</p>`
+- `bool $normalize_msword [optional] <p>Set to true, if you need to normalize MS Word chars
+e.g.: "…"
+=> "..."</p>`
+- `bool $remove_invisible_characters [optional] <p>Set to false, if you not want to remove invisible
+characters e.g.: "\0"</p>`
+
+**Return:**
+- `string <p>A clean UTF-8 string.</p>`
+
+--------
+
+#### getAllLanguages(): string[]
+<a href="#voku-php-readme-class-methods">↑</a>
+Get all languages from the constants "ASCII::.*LANGUAGE_CODE".
+
+**Parameters:**
+__nothing__
+
+**Return:**
+- `string[]`
+
+--------
+
+#### is_ascii(string $str): bool
+<a href="#voku-php-readme-class-methods">↑</a>
+Checks if a string is 7 bit ASCII.
+
+EXAMPLE: <code>
+ASCII::is_ascii('白'); // false
+</code>
+
+**Parameters:**
+- `string $str <p>The string to check.</p>`
+
+**Return:**
+- `bool <p>
+<strong>true</strong> if it is ASCII<br>
+<strong>false</strong> otherwise
+</p>`
+
+--------
+
+#### normalize_msword(string $str): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns a string with smart quotes, ellipsis characters, and dashes from
+Windows-1252 (commonly used in Word documents) replaced by their ASCII
+equivalents.
+
+EXAMPLE: <code>
+ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."'
+</code>
+
+**Parameters:**
+- `string $str <p>The string to be normalized.</p>`
+
+**Return:**
+- `string <p>A string with normalized characters for commonly used chars in Word documents.</p>`
+
+--------
+
+#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $replaceSeparatorsWithNewline): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Normalize the whitespace.
+
+EXAMPLE: <code>
+ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -"
+</code>
+
+**Parameters:**
+- `string $str <p>The string to be normalized.</p>`
+- `bool $keepNonBreakingSpace [optional] <p>Set to true, to keep non-breaking-spaces.</p>`
+- `bool $keepBidiUnicodeControls [optional] <p>Set to true, to keep non-printable (for the web)
+bidirectional text chars.</p>`
+- `bool $replaceSeparatorsWithNewline [optional] <p>Set to true, to convert LINE and PARAGRAPH SEPARATOR with "\n".</p>`
+
+**Return:**
+- `string <p>A string with normalized whitespace.</p>`
+
+--------
+
+#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_control_characters): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Remove invisible characters from a string.
+
+e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script.
+
+copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php
+
+**Parameters:**
+- `string $str`
+- `bool $url_encoded`
+- `string $replacement`
+- `bool $keep_control_characters`
+
+**Return:**
+- `string`
+
+--------
+
+#### to_ascii(string $str, string $language, bool $remove_unsupported_chars, bool $replace_extra_symbols, bool $use_transliterate, bool|null $replace_single_chars_only): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an ASCII version of the string. A set of non-ASCII characters are
+replaced with their closest ASCII counterparts, and the rest are removed
+by default. The language or locale of the source string can be supplied
+for language-specific transliteration in any of the following formats:
+en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping
+to "aeoeue" rather than "aou" as in other languages.
+
+EXAMPLE: <code>
+ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf
+</code>
+
+**Parameters:**
+- `string $str <p>The input string.</p>`
+- `string $language [optional] <p>Language of the source string.
+(default is 'en') | ASCII::*_LANGUAGE_CODE</p>`
+- `bool $remove_unsupported_chars [optional] <p>Whether or not to remove the
+unsupported characters.</p>`
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound
+".</p>`
+- `bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown chars.</p>`
+- `bool|null $replace_single_chars_only [optional] <p>Single char replacement is better for the
+performance, but some languages need to replace more then one char
+at the same time. | NULL === auto-setting, depended on the
+language</p>`
+
+**Return:**
+- `string <p>A string that contains only ASCII characters.</p>`
+
+--------
+
+#### to_filename(string $str, bool $use_transliterate, string $fallback_char): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Convert given string to safe filename (and keep string case).
+
+EXAMPLE: <code>
+ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png'
+</code>
+
+**Parameters:**
+- `string $str`
+- `bool $use_transliterate <p>ASCII::to_transliterate() is used by default - unsafe characters are
+simply replaced with hyphen otherwise.</p>`
+- `string $fallback_char`
+
+**Return:**
+- `string <p>A string that contains only safe characters for a filename.</p>`
+
+--------
+
+#### to_slugify(string $str, string $separator, string $language, string[] $replacements, bool $replace_extra_symbols, bool $use_str_to_lower, bool $use_transliterate): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Converts the string into an URL slug. This includes replacing non-ASCII
+characters with their closest ASCII equivalents, removing remaining
+non-ASCII and non-alphanumeric characters, and replacing whitespace with
+$separator. The separator defaults to a single dash, and the string
+is also converted to lowercase. The language of the source string can
+also be supplied for language-specific transliteration.
+
+**Parameters:**
+- `string $str`
+- `string $separator [optional] <p>The string used to replace whitespace.</p>`
+- `string $language [optional] <p>Language of the source string.
+(default is 'en') | ASCII::*_LANGUAGE_CODE</p>`
+- `array<string, string> $replacements [optional] <p>A map of replaceable strings.</p>`
+- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with "
+pound ".</p>`
+- `bool $use_str_to_lower [optional] <p>Use "string to lower" for the input.</p>`
+- `bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown
+chars.</p>`
+
+**Return:**
+- `string <p>A string that has been converted to an URL slug.</p>`
+
+--------
+
+#### to_transliterate(string $str, string|null $unknown, bool $strict): string
+<a href="#voku-php-readme-class-methods">↑</a>
+Returns an ASCII version of the string. A set of non-ASCII characters are
+replaced with their closest ASCII counterparts, and the rest are removed
+unless instructed otherwise.
+
+EXAMPLE: <code>
+ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii'
+</code>
+
+**Parameters:**
+- `string $str <p>The input string.</p>`
+- `string|null $unknown [optional] <p>Character use if character unknown. (default is '?')
+But you can also use NULL to keep the unknown chars.</p>`
+- `bool $strict [optional] <p>Use "transliterator_transliterate()" from PHP-Intl`
+
+**Return:**
+- `string <p>A String that contains only ASCII characters.</p>`
+
+--------
+
+
+
+## Unit Test
+
+1) [Composer](https://getcomposer.org) is a prerequisite for running the tests.
+
+```
+composer install
+```
+
+2) The tests can be executed by running this command from the root directory:
+
+```bash
+./vendor/bin/phpunit
+```
+
+### Support
+
+For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku).
+
+For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts).
+
+For professional support please contact [me](https://about.me/voku).
+
+### Thanks
+
+- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc.
+- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm!
+- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there!
+- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check.
+- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code!
+
+### License and Copyright
+
+Released under the MIT License - see `LICENSE.txt` for details.
diff --git a/vendor/voku/portable-ascii/build/composer.json b/vendor/voku/portable-ascii/build/composer.json
new file mode 100644
index 000000000..30f30c3cc
--- /dev/null
+++ b/vendor/voku/portable-ascii/build/composer.json
@@ -0,0 +1,5 @@
+{
+ "require-dev": {
+ "voku/php-readme-helper": "~0.6"
+ }
+}
diff --git a/vendor/voku/portable-ascii/build/docs/base.md b/vendor/voku/portable-ascii/build/docs/base.md
new file mode 100644
index 000000000..e21e73137
--- /dev/null
+++ b/vendor/voku/portable-ascii/build/docs/base.md
@@ -0,0 +1,127 @@
+[![Build Status](https://travis-ci.com/voku/portable-ascii.svg?branch=master)](https://travis-ci.com/voku/portable-ascii)
+[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master)
+[![Coverage Status](https://coveralls.io/repos/voku/portable-ascii/badge.svg?branch=master&service=github)](https://coveralls.io/github/voku/portable-ascii?branch=master)
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii)
+[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii)
+[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii)
+[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii)
+[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken)
+[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku)
+
+# 🔡 Portable ASCII
+
+## Description
+
+It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server.
+
+The benefit of Portable ASCII is that it is easy to use, easy to bundle.
+
+The project based on ...
++ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode)
++ Tomaz Solc's work (https://pypi.org/project/Unidecode/)
++ Portable UTF-8 work (https://github.com/voku/portable-utf8)
++ Daniel St. Jules's work (https://github.com/danielstjules/Stringy)
++ Johnny Broadway's work (https://github.com/jbroadway/urlify)
++ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ...
+
+## Index
+
+* [Alternative](#alternative)
+* [Install](#install-portable-ascii-via-composer-require)
+* [Why Portable ASCII?](#why-portable-ascii)
+* [Requirements and Recommendations](#requirements-and-recommendations)
+* [Usage](#usage)
+* [Class methods](#class-methods)
+* [Unit Test](#unit-test)
+* [License and Copyright](#license-and-copyright)
+
+## Alternative
+
+If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods.
+
+```php
+// Portable ASCII
+use voku\helper\ASCII;
+ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii'
+
+// voku/Stringy
+use Stringy\Stringy as S;
+$stringy = S::create('déjà σσς iıii');
+$stringy->toTransliterate(); // 'deja sss iiii'
+```
+
+## Install "Portable ASCII" via "composer require"
+```shell
+composer require voku/portable-ascii
+```
+
+## Why Portable ASCII?[]()
+I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8",
+but this repo is more modular and portable, because it has no dependencies.
+
+## Requirements and Recommendations
+
+* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must.
+* PHP 7.0 is the minimum requirement
+* PHP 8.0 is also supported
+
+## Usage
+
+Example: ASCII::to_ascii()
+```php
+ echo ASCII::to_ascii('�Düsseldorf�', 'de');
+
+ // will output
+ // Duesseldorf
+
+ echo ASCII::to_ascii('�Düsseldorf�', 'en');
+
+ // will output
+ // Dusseldorf
+```
+
+# Portable ASCII | API
+
+The API from the "ASCII"-Class is written as small static methods.
+
+
+## Class methods
+
+%__functions_index__voku\helper\ASCII__%
+
+%__functions_list__voku\helper\ASCII__%
+
+
+## Unit Test
+
+1) [Composer](https://getcomposer.org) is a prerequisite for running the tests.
+
+```
+composer install
+```
+
+2) The tests can be executed by running this command from the root directory:
+
+```bash
+./vendor/bin/phpunit
+```
+
+### Support
+
+For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku).
+
+For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts).
+
+For professional support please contact [me](https://about.me/voku).
+
+### Thanks
+
+- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc.
+- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm!
+- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there!
+- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check.
+- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code!
+
+### License and Copyright
+
+Released under the MIT License - see `LICENSE.txt` for details.
diff --git a/vendor/voku/portable-ascii/build/generate_docs.php b/vendor/voku/portable-ascii/build/generate_docs.php
new file mode 100644
index 000000000..c86f1f195
--- /dev/null
+++ b/vendor/voku/portable-ascii/build/generate_docs.php
@@ -0,0 +1,26 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+require __DIR__ . '/vendor/autoload.php';
+
+$readmeGenerator = new \voku\PhpReadmeHelper\GenerateApi();
+$readmeGenerator->templateMethod = <<<RAW
+#### %name%
+<a href="#voku-php-readme-class-methods">↑</a>
+%description%
+
+**Parameters:**
+%params%
+
+**Return:**
+%return%
+
+--------
+
+RAW;
+$readmeText = ($readmeGenerator)->generate(
+ __DIR__ . '/../src/voku/helper/ASCII.php',
+ __DIR__ . '/docs/base.md'
+);
+
+file_put_contents(__DIR__ . '/../README.md', $readmeText);
diff --git a/vendor/voku/portable-ascii/build/generate_max_key_length.php b/vendor/voku/portable-ascii/build/generate_max_key_length.php
new file mode 100644
index 000000000..743d389f5
--- /dev/null
+++ b/vendor/voku/portable-ascii/build/generate_max_key_length.php
@@ -0,0 +1,20 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+$languages = \voku\helper\ASCII::getAllLanguages();
+
+$languagesKeyLengths = [];
+foreach ($languages as $language) {
+ $langSpecific = \voku\helper\ASCII::charsArrayWithOneLanguage($language, false, false);
+
+ $langSpecificKeyLength = \array_map('\mb_strlen', \array_keys($langSpecific));
+
+ if (count($langSpecificKeyLength) === 0) {
+ $languagesKeyLengths[$language] = 0;
+ } else {
+ $languagesKeyLengths[$language] = \max($langSpecificKeyLength);
+ }
+}
+
+//var_export($languagesKeyLengths);
diff --git a/vendor/voku/portable-ascii/composer.json b/vendor/voku/portable-ascii/composer.json
new file mode 100644
index 000000000..99dee4f80
--- /dev/null
+++ b/vendor/voku/portable-ascii/composer.json
@@ -0,0 +1,37 @@
+{
+ "name": "voku/portable-ascii",
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "type": "library",
+ "keywords": [
+ "clean",
+ "php",
+ "ascii"
+ ],
+ "homepage": "https://github.com/voku/portable-ascii",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "voku\\tests\\": "tests/"
+ }
+ }
+}
diff --git a/vendor/voku/portable-ascii/src/voku/helper/ASCII.php b/vendor/voku/portable-ascii/src/voku/helper/ASCII.php
new file mode 100644
index 000000000..d4ec32ab1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/ASCII.php
@@ -0,0 +1,1440 @@
+<?php
+
+declare(strict_types=1);
+
+namespace voku\helper;
+
+/**
+ * @psalm-immutable
+ */
+final class ASCII
+{
+ //
+ // INFO: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+ //
+
+ const UZBEK_LANGUAGE_CODE = 'uz';
+
+ const TURKMEN_LANGUAGE_CODE = 'tk';
+
+ const THAI_LANGUAGE_CODE = 'th';
+
+ const PASHTO_LANGUAGE_CODE = 'ps';
+
+ const ORIYA_LANGUAGE_CODE = 'or';
+
+ const MONGOLIAN_LANGUAGE_CODE = 'mn';
+
+ const KOREAN_LANGUAGE_CODE = 'ko';
+
+ const KIRGHIZ_LANGUAGE_CODE = 'ky';
+
+ const ARMENIAN_LANGUAGE_CODE = 'hy';
+
+ const BENGALI_LANGUAGE_CODE = 'bn';
+
+ const BELARUSIAN_LANGUAGE_CODE = 'be';
+
+ const AMHARIC_LANGUAGE_CODE = 'am';
+
+ const JAPANESE_LANGUAGE_CODE = 'ja';
+
+ const CHINESE_LANGUAGE_CODE = 'zh';
+
+ const DUTCH_LANGUAGE_CODE = 'nl';
+
+ const ITALIAN_LANGUAGE_CODE = 'it';
+
+ const MACEDONIAN_LANGUAGE_CODE = 'mk';
+
+ const PORTUGUESE_LANGUAGE_CODE = 'pt';
+
+ const GREEKLISH_LANGUAGE_CODE = 'el__greeklish';
+
+ const GREEK_LANGUAGE_CODE = 'el';
+
+ const HINDI_LANGUAGE_CODE = 'hi';
+
+ const SWEDISH_LANGUAGE_CODE = 'sv';
+
+ const TURKISH_LANGUAGE_CODE = 'tr';
+
+ const BULGARIAN_LANGUAGE_CODE = 'bg';
+
+ const HUNGARIAN_LANGUAGE_CODE = 'hu';
+
+ const MYANMAR_LANGUAGE_CODE = 'my';
+
+ const CROATIAN_LANGUAGE_CODE = 'hr';
+
+ const FINNISH_LANGUAGE_CODE = 'fi';
+
+ const GEORGIAN_LANGUAGE_CODE = 'ka';
+
+ const RUSSIAN_LANGUAGE_CODE = 'ru';
+
+ const RUSSIAN_PASSPORT_2013_LANGUAGE_CODE = 'ru__passport_2013';
+
+ const RUSSIAN_GOST_2000_B_LANGUAGE_CODE = 'ru__gost_2000_b';
+
+ const UKRAINIAN_LANGUAGE_CODE = 'uk';
+
+ const KAZAKH_LANGUAGE_CODE = 'kk';
+
+ const CZECH_LANGUAGE_CODE = 'cs';
+
+ const DANISH_LANGUAGE_CODE = 'da';
+
+ const POLISH_LANGUAGE_CODE = 'pl';
+
+ const ROMANIAN_LANGUAGE_CODE = 'ro';
+
+ const ESPERANTO_LANGUAGE_CODE = 'eo';
+
+ const ESTONIAN_LANGUAGE_CODE = 'et';
+
+ const LATVIAN_LANGUAGE_CODE = 'lv';
+
+ const LITHUANIAN_LANGUAGE_CODE = 'lt';
+
+ const NORWEGIAN_LANGUAGE_CODE = 'no';
+
+ const VIETNAMESE_LANGUAGE_CODE = 'vi';
+
+ const ARABIC_LANGUAGE_CODE = 'ar';
+
+ const PERSIAN_LANGUAGE_CODE = 'fa';
+
+ const SERBIAN_LANGUAGE_CODE = 'sr';
+
+ const SERBIAN_CYRILLIC_LANGUAGE_CODE = 'sr__cyr';
+
+ const SERBIAN_LATIN_LANGUAGE_CODE = 'sr__lat';
+
+ const AZERBAIJANI_LANGUAGE_CODE = 'az';
+
+ const SLOVAK_LANGUAGE_CODE = 'sk';
+
+ const FRENCH_LANGUAGE_CODE = 'fr';
+
+ const FRENCH_AUSTRIAN_LANGUAGE_CODE = 'fr_at';
+
+ const FRENCH_SWITZERLAND_LANGUAGE_CODE = 'fr_ch';
+
+ const GERMAN_LANGUAGE_CODE = 'de';
+
+ const GERMAN_AUSTRIAN_LANGUAGE_CODE = 'de_at';
+
+ const GERMAN_SWITZERLAND_LANGUAGE_CODE = 'de_ch';
+
+ const ENGLISH_LANGUAGE_CODE = 'en';
+
+ const EXTRA_LATIN_CHARS_LANGUAGE_CODE = 'latin';
+
+ const EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE = ' ';
+
+ const EXTRA_MSWORD_CHARS_LANGUAGE_CODE = 'msword';
+
+ /**
+ * @var array<string, array<string, string>>|null
+ */
+ private static $ASCII_MAPS;
+
+ /**
+ * @var array<string, array<string, string>>|null
+ */
+ private static $ASCII_MAPS_AND_EXTRAS;
+
+ /**
+ * @var array<string, array<string, string>>|null
+ */
+ private static $ASCII_EXTRAS;
+
+ /**
+ * @var array<string, int>|null
+ */
+ private static $ORD;
+
+ /**
+ * @var array<string, int>|null
+ */
+ private static $LANGUAGE_MAX_KEY;
+
+ /**
+ * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters
+ *
+ * @var string
+ */
+ private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]";
+
+ /**
+ * bidirectional text chars
+ *
+ * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls
+ *
+ * @var array<int, string>
+ */
+ private static $BIDI_UNI_CODE_CONTROLS_TABLE = [
+ // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr")
+ 8234 => "\xE2\x80\xAA",
+ // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl")
+ 8235 => "\xE2\x80\xAB",
+ // POP DIRECTIONAL FORMATTING // (use -> </bdo>)
+ 8236 => "\xE2\x80\xAC",
+ // LEFT-TO-RIGHT OVERRIDE // (use -> <bdo dir = "ltr">)
+ 8237 => "\xE2\x80\xAD",
+ // RIGHT-TO-LEFT OVERRIDE // (use -> <bdo dir = "rtl">)
+ 8238 => "\xE2\x80\xAE",
+ // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr")
+ 8294 => "\xE2\x81\xA6",
+ // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl")
+ 8295 => "\xE2\x81\xA7",
+ // FIRST STRONG ISOLATE // (use -> dir = "auto")
+ 8296 => "\xE2\x81\xA8",
+ // POP DIRECTIONAL ISOLATE
+ 8297 => "\xE2\x81\xA9",
+ ];
+
+ /**
+ * Get all languages from the constants "ASCII::.*LANGUAGE_CODE".
+ *
+ * @return string[]
+ *
+ * @psalm-return array<string, string>
+ */
+ public static function getAllLanguages(): array
+ {
+ // init
+ static $LANGUAGES = [];
+
+ if ($LANGUAGES !== []) {
+ return $LANGUAGES;
+ }
+
+ foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) {
+ if (\strpos($constant, 'EXTRA') !== false) {
+ $LANGUAGES[\strtolower($constant)] = $lang;
+ } else {
+ $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang;
+ }
+ }
+
+ return $LANGUAGES;
+ }
+
+ /**
+ * Returns an replacement array for ASCII methods.
+ *
+ * EXAMPLE: <code>
+ * $array = ASCII::charsArray();
+ * var_dump($array['ru']['б']); // 'b'
+ * </code>
+ *
+ * @psalm-suppress InvalidNullableReturnType - we use the prepare* methods here, so we don't get NULL here
+ *
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>
+ *
+ * @psalm-pure
+ *
+ * @return array
+ *
+ * @psalm-return array<string, array<string , string>>
+ */
+ public static function charsArray(bool $replace_extra_symbols = false): array
+ {
+ if ($replace_extra_symbols) {
+ self::prepareAsciiAndExtrasMaps();
+
+ return self::$ASCII_MAPS_AND_EXTRAS ?? [];
+ }
+
+ self::prepareAsciiMaps();
+
+ return self::$ASCII_MAPS ?? [];
+ }
+
+ /**
+ * Returns an replacement array for ASCII methods with a mix of multiple languages.
+ *
+ * EXAMPLE: <code>
+ * $array = ASCII::charsArrayWithMultiLanguageValues();
+ * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب']
+ * </code>
+ *
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>
+ *
+ * @psalm-pure
+ *
+ * @return array
+ * <p>An array of replacements.</p>
+ *
+ * @psalm-return array<string, array<int, string>>
+ */
+ public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array
+ {
+ /**
+ * @var array<string, array>
+ */
+ static $CHARS_ARRAY = [];
+ $cacheKey = '' . $replace_extra_symbols;
+
+ if (isset($CHARS_ARRAY[$cacheKey])) {
+ return $CHARS_ARRAY[$cacheKey];
+ }
+
+ // init
+ $return = [];
+ $language_all_chars = self::charsArrayWithSingleLanguageValues(
+ $replace_extra_symbols,
+ false
+ );
+
+ /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */
+ /** @var array<string, string> $language_all_chars */
+ $language_all_chars = $language_all_chars;
+
+ /** @noinspection AlterInForeachInspection */
+ foreach ($language_all_chars as $key => &$value) {
+ $return[$value][] = $key;
+ }
+
+ $CHARS_ARRAY[$cacheKey] = $return;
+
+ /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */
+ /** @var array<string, array<int, string>> $return */
+ $return = $return;
+
+ return $return;
+ }
+
+ /**
+ * Returns an replacement array for ASCII methods with one language.
+ *
+ * For example, German will map 'ä' to 'ae', while other languages
+ * will simply return e.g. 'a'.
+ *
+ * EXAMPLE: <code>
+ * $array = ASCII::charsArrayWithOneLanguage('ru');
+ * $tmpKey = \array_search('yo', $array['replace']);
+ * echo $array['orig'][$tmpKey]; // 'ё'
+ * </code>
+ *
+ * @psalm-suppress InvalidNullableReturnType - we use the prepare* methods here, so we don't get NULL here
+ *
+ * @param string $language [optional] <p>Language of the source string e.g.: en, de_at, or de-ch.
+ * (default is 'en') | ASCII::*_LANGUAGE_CODE</p>
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>
+ * @param bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]}
+ * array</p>
+ *
+ * @psalm-pure
+ *
+ * @return array
+ * <p>An array of replacements.</p>
+ *
+ * @psalm-return array{orig: string[], replace: string[]}|array<string, string>
+ */
+ public static function charsArrayWithOneLanguage(
+ string $language = self::ENGLISH_LANGUAGE_CODE,
+ bool $replace_extra_symbols = false,
+ bool $asOrigReplaceArray = true
+ ): array {
+ $language = self::get_language($language);
+
+ // init
+ /**
+ * @var array<string, array>
+ */
+ static $CHARS_ARRAY = [];
+ $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray;
+
+ // check static cache
+ if (isset($CHARS_ARRAY[$cacheKey][$language])) {
+ return $CHARS_ARRAY[$cacheKey][$language];
+ }
+
+ if ($replace_extra_symbols) {
+ self::prepareAsciiAndExtrasMaps();
+
+ /** @noinspection DuplicatedCode */
+ if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) {
+ $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language];
+
+ if ($asOrigReplaceArray) {
+ $CHARS_ARRAY[$cacheKey][$language] = [
+ 'orig' => \array_keys($tmpArray),
+ 'replace' => \array_values($tmpArray),
+ ];
+ } else {
+ $CHARS_ARRAY[$cacheKey][$language] = $tmpArray;
+ }
+ } else {
+ /** @noinspection NestedPositiveIfStatementsInspection */
+ if ($asOrigReplaceArray) {
+ $CHARS_ARRAY[$cacheKey][$language] = [
+ 'orig' => [],
+ 'replace' => [],
+ ];
+ } else {
+ $CHARS_ARRAY[$cacheKey][$language] = [];
+ }
+ }
+ } else {
+ self::prepareAsciiMaps();
+
+ /** @noinspection DuplicatedCode */
+ if (isset(self::$ASCII_MAPS[$language])) {
+ $tmpArray = self::$ASCII_MAPS[$language];
+
+ if ($asOrigReplaceArray) {
+ $CHARS_ARRAY[$cacheKey][$language] = [
+ 'orig' => \array_keys($tmpArray),
+ 'replace' => \array_values($tmpArray),
+ ];
+ } else {
+ $CHARS_ARRAY[$cacheKey][$language] = $tmpArray;
+ }
+ } else {
+ /** @noinspection NestedPositiveIfStatementsInspection */
+ if ($asOrigReplaceArray) {
+ $CHARS_ARRAY[$cacheKey][$language] = [
+ 'orig' => [],
+ 'replace' => [],
+ ];
+ } else {
+ $CHARS_ARRAY[$cacheKey][$language] = [];
+ }
+ }
+ }
+
+ return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []];
+ }
+
+ /**
+ * Returns an replacement array for ASCII methods with multiple languages.
+ *
+ * EXAMPLE: <code>
+ * $array = ASCII::charsArrayWithSingleLanguageValues();
+ * $tmpKey = \array_search('hnaik', $array['replace']);
+ * echo $array['orig'][$tmpKey]; // '၌'
+ * </code>
+ *
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>
+ * @param bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]}
+ * array</p>
+ *
+ * @psalm-pure
+ *
+ * @return array
+ * <p>An array of replacements.</p>
+ *
+ * @psalm-return array{orig: string[], replace: string[]}|array<string, string>
+ */
+ public static function charsArrayWithSingleLanguageValues(
+ bool $replace_extra_symbols = false,
+ bool $asOrigReplaceArray = true
+ ): array {
+ // init
+ /**
+ * @var array<string,array>
+ */
+ static $CHARS_ARRAY = [];
+ $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray;
+
+ if (isset($CHARS_ARRAY[$cacheKey])) {
+ return $CHARS_ARRAY[$cacheKey];
+ }
+
+ if ($replace_extra_symbols) {
+ self::prepareAsciiAndExtrasMaps();
+
+ /** @noinspection AlterInForeachInspection */
+ /** @psalm-suppress PossiblyNullIterator - we use the prepare* methods here, so we don't get NULL here */
+ foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) {
+ $CHARS_ARRAY[$cacheKey][] = $map;
+ }
+ } else {
+ self::prepareAsciiMaps();
+
+ /** @noinspection AlterInForeachInspection */
+ /** @psalm-suppress PossiblyNullIterator - we use the prepare* methods here, so we don't get NULL here */
+ foreach (self::$ASCII_MAPS ?? [] as &$map) {
+ $CHARS_ARRAY[$cacheKey][] = $map;
+ }
+ }
+
+ $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]);
+
+ if ($asOrigReplaceArray) {
+ $CHARS_ARRAY[$cacheKey] = [
+ 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]),
+ 'replace' => \array_values($CHARS_ARRAY[$cacheKey]),
+ ];
+ }
+
+ return $CHARS_ARRAY[$cacheKey];
+ }
+
+ /**
+ * Accepts a string and removes all non-UTF-8 characters from it + extras if needed.
+ *
+ * @param string $str <p>The string to be sanitized.</p>
+ * @param bool $normalize_whitespace [optional] <p>Set to true, if you need to normalize the
+ * whitespace.</p>
+ * @param bool $normalize_msword [optional] <p>Set to true, if you need to normalize MS Word chars
+ * e.g.: "…"
+ * => "..."</p>
+ * @param bool $keep_non_breaking_space [optional] <p>Set to true, to keep non-breaking-spaces, in
+ * combination with
+ * $normalize_whitespace</p>
+ * @param bool $remove_invisible_characters [optional] <p>Set to false, if you not want to remove invisible
+ * characters e.g.: "\0"</p>
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A clean UTF-8 string.</p>
+ */
+ public static function clean(
+ string $str,
+ bool $normalize_whitespace = true,
+ bool $keep_non_breaking_space = false,
+ bool $normalize_msword = true,
+ bool $remove_invisible_characters = true
+ ): string {
+ // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string
+ // caused connection reset problem on larger strings
+
+ $regex = '/
+ (
+ (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
+ | [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
+ | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2
+ | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3
+ ){1,100} # ...one or more times
+ )
+ | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111
+ | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111
+ /x';
+ $str = (string) \preg_replace($regex, '$1', $str);
+
+ if ($normalize_whitespace) {
+ $str = self::normalize_whitespace($str, $keep_non_breaking_space);
+ }
+
+ if ($normalize_msword) {
+ $str = self::normalize_msword($str);
+ }
+
+ if ($remove_invisible_characters) {
+ $str = self::remove_invisible_characters($str);
+ }
+
+ return $str;
+ }
+
+ /**
+ * Checks if a string is 7 bit ASCII.
+ *
+ * EXAMPLE: <code>
+ * ASCII::is_ascii('白'); // false
+ * </code>
+ *
+ * @param string $str <p>The string to check.</p>
+ *
+ * @psalm-pure
+ *
+ * @return bool
+ * <p>
+ * <strong>true</strong> if it is ASCII<br>
+ * <strong>false</strong> otherwise
+ * </p>
+ */
+ public static function is_ascii(string $str): bool
+ {
+ if ($str === '') {
+ return true;
+ }
+
+ return !\preg_match('/' . self::$REGEX_ASCII . '/', $str);
+ }
+
+ /**
+ * Returns a string with smart quotes, ellipsis characters, and dashes from
+ * Windows-1252 (commonly used in Word documents) replaced by their ASCII
+ * equivalents.
+ *
+ * EXAMPLE: <code>
+ * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."'
+ * </code>
+ *
+ * @param string $str <p>The string to be normalized.</p>
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A string with normalized characters for commonly used chars in Word documents.</p>
+ */
+ public static function normalize_msword(string $str): string
+ {
+ if ($str === '') {
+ return '';
+ }
+
+ /**
+ * @var array{orig: string[], replace: string[]}
+ */
+ static $MSWORD_CACHE = ['orig' => [], 'replace' => []];
+
+ if (empty($MSWORD_CACHE['orig'])) {
+ self::prepareAsciiMaps();
+
+ /**
+ * @psalm-suppress PossiblyNullArrayAccess - we use the prepare* methods here, so we don't get NULL here
+ *
+ * @var array<string, string>
+ */
+ $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? [];
+
+ $MSWORD_CACHE = [
+ 'orig' => \array_keys($map),
+ 'replace' => \array_values($map),
+ ];
+ }
+
+ return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str);
+ }
+
+ /**
+ * Normalize the whitespace.
+ *
+ * EXAMPLE: <code>
+ * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -"
+ * </code>
+ *
+ * @param string $str <p>The string to be normalized.</p>
+ * @param bool $keepNonBreakingSpace [optional] <p>Set to true, to keep non-breaking-spaces.</p>
+ * @param bool $keepBidiUnicodeControls [optional] <p>Set to true, to keep non-printable (for the web)
+ * bidirectional text chars.</p>
+ * @param bool $normalize_control_characters [optional] <p>Set to true, to convert LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".</p>
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A string with normalized whitespace.</p>
+ */
+ public static function normalize_whitespace(
+ string $str,
+ bool $keepNonBreakingSpace = false,
+ bool $keepBidiUnicodeControls = false,
+ bool $normalize_control_characters = false
+ ): string {
+ if ($str === '') {
+ return '';
+ }
+
+ /**
+ * @var array<int,array<string,string>>
+ */
+ static $WHITESPACE_CACHE = [];
+ $cacheKey = (int) $keepNonBreakingSpace;
+
+ if ($normalize_control_characters) {
+ $str = \str_replace(
+ [
+ "\x0d\x0c", // 'END OF LINE'
+ "\xe2\x80\xa8", // 'LINE SEPARATOR'
+ "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR'
+ "\x0c", // 'FORM FEED'
+ "\x0d", // 'CARRIAGE RETURN'
+ "\x0b", // 'VERTICAL TAB'
+ ],
+ [
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\t",
+ ],
+ $str
+ );
+ }
+
+ if (!isset($WHITESPACE_CACHE[$cacheKey])) {
+ self::prepareAsciiMaps();
+
+ $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? [];
+
+ if ($keepNonBreakingSpace) {
+ unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]);
+ }
+
+ $WHITESPACE_CACHE[$cacheKey] = \array_keys($WHITESPACE_CACHE[$cacheKey]);
+ }
+
+ if (!$keepBidiUnicodeControls) {
+ /**
+ * @var array<int,string>|null
+ */
+ static $BIDI_UNICODE_CONTROLS_CACHE = null;
+
+ if ($BIDI_UNICODE_CONTROLS_CACHE === null) {
+ $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE;
+ }
+
+ $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str);
+ }
+
+ return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str);
+ }
+
+ /**
+ * Remove invisible characters from a string.
+ *
+ * e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script.
+ *
+ * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php
+ *
+ * @param string $str
+ * @param bool $url_encoded
+ * @param string $replacement
+ * @param bool $keep_basic_control_characters
+ *
+ * @psalm-pure
+ *
+ * @return string
+ */
+ public static function remove_invisible_characters(
+ string $str,
+ bool $url_encoded = false,
+ string $replacement = '',
+ bool $keep_basic_control_characters = true
+ ): string {
+ // init
+ $non_displayables = [];
+
+ // every control character except:
+ // - newline (dec 10),
+ // - carriage return (dec 13),
+ // - horizontal tab (dec 09)
+ if ($url_encoded) {
+ $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15
+ $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31
+ }
+
+ if ($keep_basic_control_characters) {
+ $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
+ } else {
+ $str = self::normalize_whitespace($str, false, false, true);
+ $non_displayables[] = '/[^\P{C}\s]/u';
+ }
+
+ do {
+ $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count);
+ } while ($count !== 0);
+
+ return $str;
+ }
+
+ /**
+ * Returns an ASCII version of the string. A set of non-ASCII characters are
+ * replaced with their closest ASCII counterparts, and the rest are removed
+ * by default. The language or locale of the source string can be supplied
+ * for language-specific transliteration in any of the following formats:
+ * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping
+ * to "aeoeue" rather than "aou" as in other languages.
+ *
+ * EXAMPLE: <code>
+ * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf
+ * </code>
+ *
+ * @param string $str <p>The input string.</p>
+ * @param string $language [optional] <p>Language of the source string.
+ * (default is 'en') | ASCII::*_LANGUAGE_CODE</p>
+ * @param bool $remove_unsupported_chars [optional] <p>Whether or not to remove the
+ * unsupported characters.</p>
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound
+ * ".</p>
+ * @param bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown chars.</p>
+ * @param bool|null $replace_single_chars_only [optional] <p>Single char replacement is better for the
+ * performance, but some languages need to replace more then one char
+ * at the same time. | NULL === auto-setting, depended on the
+ * language</p>
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A string that contains only ASCII characters.</p>
+ */
+ public static function to_ascii(
+ string $str,
+ string $language = self::ENGLISH_LANGUAGE_CODE,
+ bool $remove_unsupported_chars = true,
+ bool $replace_extra_symbols = false,
+ bool $use_transliterate = false,
+ bool $replace_single_chars_only = null
+ ): string {
+ if ($str === '') {
+ return '';
+ }
+
+ $language = self::get_language($language);
+
+ static $EXTRA_SYMBOLS_CACHE = null;
+
+ /**
+ * @var array<string,array<string,string>>
+ */
+ static $REPLACE_HELPER_CACHE = [];
+ $cacheKey = $language . '-' . $replace_extra_symbols;
+
+ if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) {
+ $langAll = self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false);
+
+ $langSpecific = self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false);
+
+ if ($langSpecific === []) {
+ $REPLACE_HELPER_CACHE[$cacheKey] = $langAll;
+ } else {
+ $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific);
+ }
+ }
+
+ if (
+ $replace_extra_symbols
+ &&
+ $EXTRA_SYMBOLS_CACHE === null
+ ) {
+ $EXTRA_SYMBOLS_CACHE = [];
+ foreach (self::$ASCII_EXTRAS ?? [] as $extrasLanguageTmp => $extrasDataTmp) {
+ foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) {
+ $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp;
+ }
+ }
+ $EXTRA_SYMBOLS_CACHE = \implode('', $EXTRA_SYMBOLS_CACHE);
+ }
+
+ $charDone = [];
+ if (\preg_match_all('/' . self::$REGEX_ASCII . ($replace_extra_symbols ? '|[' . $EXTRA_SYMBOLS_CACHE . ']' : '') . '/u', $str, $matches)) {
+ if (!$replace_single_chars_only) {
+ if (self::$LANGUAGE_MAX_KEY === null) {
+ self::$LANGUAGE_MAX_KEY = self::getData('ascii_language_max_key');
+ }
+
+ $maxKeyLength = self::$LANGUAGE_MAX_KEY[$language] ?? 0;
+
+ if ($maxKeyLength >= 5) {
+ foreach ($matches[0] as $keyTmp => $char) {
+ if (isset($matches[0][$keyTmp + 4])) {
+ $fiveChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3] . $matches[0][$keyTmp + 4];
+ } else {
+ $fiveChars = null;
+ }
+ if (
+ $fiveChars
+ &&
+ !isset($charDone[$fiveChars])
+ &&
+ isset($REPLACE_HELPER_CACHE[$cacheKey][$fiveChars])
+ &&
+ \strpos($str, $fiveChars) !== false
+ ) {
+ // DEBUG
+ //\var_dump($str, $fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]);
+
+ $charDone[$fiveChars] = true;
+ $str = \str_replace($fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars], $str);
+
+ // DEBUG
+ //\var_dump($str, "\n");
+ }
+ }
+ }
+
+ if ($maxKeyLength >= 4) {
+ foreach ($matches[0] as $keyTmp => $char) {
+ if (isset($matches[0][$keyTmp + 3])) {
+ $fourChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3];
+ } else {
+ $fourChars = null;
+ }
+ if (
+ $fourChars
+ &&
+ !isset($charDone[$fourChars])
+ &&
+ isset($REPLACE_HELPER_CACHE[$cacheKey][$fourChars])
+ &&
+ \strpos($str, $fourChars) !== false
+ ) {
+ // DEBUG
+ //\var_dump($str, $fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars]);
+
+ $charDone[$fourChars] = true;
+ $str = \str_replace($fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars], $str);
+
+ // DEBUG
+ //\var_dump($str, "\n");
+ }
+ }
+ }
+
+ foreach ($matches[0] as $keyTmp => $char) {
+ if (isset($matches[0][$keyTmp + 2])) {
+ $threeChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2];
+ } else {
+ $threeChars = null;
+ }
+ if (
+ $threeChars
+ &&
+ !isset($charDone[$threeChars])
+ &&
+ isset($REPLACE_HELPER_CACHE[$cacheKey][$threeChars])
+ &&
+ \strpos($str, $threeChars) !== false
+ ) {
+ // DEBUG
+ //\var_dump($str, $threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars]);
+
+ $charDone[$threeChars] = true;
+ $str = \str_replace($threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars], $str);
+
+ // DEBUG
+ //\var_dump($str, "\n");
+ }
+ }
+
+ foreach ($matches[0] as $keyTmp => $char) {
+ if (isset($matches[0][$keyTmp + 1])) {
+ $twoChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1];
+ } else {
+ $twoChars = null;
+ }
+ if (
+ $twoChars
+ &&
+ !isset($charDone[$twoChars])
+ &&
+ isset($REPLACE_HELPER_CACHE[$cacheKey][$twoChars])
+ &&
+ \strpos($str, $twoChars) !== false
+ ) {
+ // DEBUG
+ //\var_dump($str, $twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars]);
+
+ $charDone[$twoChars] = true;
+ $str = \str_replace($twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars], $str);
+
+ // DEBUG
+ //\var_dump($str, "\n");
+ }
+ }
+ }
+
+ foreach ($matches[0] as $keyTmp => $char) {
+ if (
+ !isset($charDone[$char])
+ &&
+ isset($REPLACE_HELPER_CACHE[$cacheKey][$char])
+ &&
+ \strpos($str, $char) !== false
+ ) {
+ // DEBUG
+ //\var_dump($str, $char, $REPLACE_HELPER_CACHE[$cacheKey][$char]);
+
+ $charDone[$char] = true;
+ $str = \str_replace($char, $REPLACE_HELPER_CACHE[$cacheKey][$char], $str);
+
+ // DEBUG
+ //\var_dump($str, "\n");
+ }
+ }
+ }
+
+ /** @psalm-suppress PossiblyNullOperand - we use the prepare* methods here, so we don't get NULL here */
+ if (!isset(self::$ASCII_MAPS[$language])) {
+ $use_transliterate = true;
+ }
+
+ if ($use_transliterate) {
+ /** @noinspection ArgumentEqualsDefaultValueInspection */
+ $str = self::to_transliterate($str, null, false);
+ }
+
+ if ($remove_unsupported_chars) {
+ $str = (string) \str_replace(["\n\r", "\n", "\r", "\t"], ' ', $str);
+ $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str);
+ }
+
+ return $str;
+ }
+
+ /**
+ * Convert given string to safe filename (and keep string case).
+ *
+ * EXAMPLE: <code>
+ * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png'
+ * </code>
+ *
+ * @param string $str
+ * @param bool $use_transliterate <p>ASCII::to_transliterate() is used by default - unsafe characters are
+ * simply replaced with hyphen otherwise.</p>
+ * @param string $fallback_char
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A string that contains only safe characters for a filename.</p>
+ */
+ public static function to_filename(
+ string $str,
+ bool $use_transliterate = true,
+ string $fallback_char = '-'
+ ): string {
+ if ($use_transliterate) {
+ $str = self::to_transliterate($str, $fallback_char);
+ }
+
+ $fallback_char_escaped = \preg_quote($fallback_char, '/');
+
+ $str = (string) \preg_replace(
+ [
+ '/[^' . $fallback_char_escaped . '.\\-a-zA-Z0-9\\s]/', // 1) remove un-needed chars
+ '/[\\s]+/u', // 2) convert spaces to $fallback_char
+ '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's
+ ],
+ [
+ '',
+ $fallback_char,
+ $fallback_char,
+ ],
+ $str
+ );
+
+ return \trim($str, $fallback_char);
+ }
+
+ /**
+ * Converts the string into an URL slug. This includes replacing non-ASCII
+ * characters with their closest ASCII equivalents, removing remaining
+ * non-ASCII and non-alphanumeric characters, and replacing whitespace with
+ * $separator. The separator defaults to a single dash, and the string
+ * is also converted to lowercase. The language of the source string can
+ * also be supplied for language-specific transliteration.
+ *
+ * @param string $str
+ * @param string $separator [optional] <p>The string used to replace whitespace.</p>
+ * @param string $language [optional] <p>Language of the source string.
+ * (default is 'en') | ASCII::*_LANGUAGE_CODE</p>
+ * @param array<string, string> $replacements [optional] <p>A map of replaceable strings.</p>
+ * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with "
+ * pound ".</p>
+ * @param bool $use_str_to_lower [optional] <p>Use "string to lower" for the input.</p>
+ * @param bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown
+ * chars.</p>
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A string that has been converted to an URL slug.</p>
+ */
+ public static function to_slugify(
+ string $str,
+ string $separator = '-',
+ string $language = self::ENGLISH_LANGUAGE_CODE,
+ array $replacements = [],
+ bool $replace_extra_symbols = false,
+ bool $use_str_to_lower = true,
+ bool $use_transliterate = false
+ ): string {
+ if ($str === '') {
+ return '';
+ }
+
+ foreach ($replacements as $from => $to) {
+ $str = \str_replace($from, $to, $str);
+ }
+
+ $str = self::to_ascii(
+ $str,
+ $language,
+ false,
+ $replace_extra_symbols,
+ $use_transliterate
+ );
+
+ $str = \str_replace('@', $separator, $str);
+
+ $str = (string) \preg_replace(
+ '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/',
+ '',
+ $str
+ );
+
+ if ($use_str_to_lower) {
+ $str = \strtolower($str);
+ }
+
+ $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str);
+ $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str);
+ $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str);
+
+ $l = \strlen($separator);
+ if ($l && \strpos($str, $separator) === 0) {
+ $str = (string) \substr($str, $l);
+ }
+
+ if (\substr($str, -$l) === $separator) {
+ $str = (string) \substr($str, 0, \strlen($str) - $l);
+ }
+
+ return $str;
+ }
+
+ /**
+ * Returns an ASCII version of the string. A set of non-ASCII characters are
+ * replaced with their closest ASCII counterparts, and the rest are removed
+ * unless instructed otherwise.
+ *
+ * EXAMPLE: <code>
+ * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii'
+ * </code>
+ *
+ * @param string $str <p>The input string.</p>
+ * @param string|null $unknown [optional] <p>Character use if character unknown. (default is '?')
+ * But you can also use NULL to keep the unknown chars.</p>
+ * @param bool $strict [optional] <p>Use "transliterator_transliterate()" from PHP-Intl
+ *
+ * @psalm-pure
+ *
+ * @return string
+ * <p>A String that contains only ASCII characters.</p>
+ *
+ * @noinspection ParameterDefaultValueIsNotNullInspection
+ */
+ public static function to_transliterate(
+ string $str,
+ $unknown = '?',
+ bool $strict = false
+ ): string {
+ /**
+ * @var array<int,string>|null
+ */
+ static $UTF8_TO_TRANSLIT = null;
+
+ /**
+ * null|\Transliterator
+ */
+ static $TRANSLITERATOR = null;
+
+ /**
+ * @var bool|null
+ */
+ static $SUPPORT_INTL = null;
+
+ if ($str === '') {
+ return '';
+ }
+
+ if ($SUPPORT_INTL === null) {
+ $SUPPORT_INTL = \extension_loaded('intl');
+ }
+
+ // check if we only have ASCII, first (better performance)
+ $str_tmp = $str;
+ if (self::is_ascii($str)) {
+ return $str;
+ }
+
+ $str = self::clean($str);
+
+ // check again, if we only have ASCII, now ...
+ if (
+ $str_tmp !== $str
+ &&
+ self::is_ascii($str)
+ ) {
+ return $str;
+ }
+
+ if (
+ $strict
+ &&
+ $SUPPORT_INTL === true
+ ) {
+ if (!isset($TRANSLITERATOR)) {
+ // INFO: see "*-Latin" rules via "transliterator_list_ids()"
+ /**
+ * @var \Transliterator
+ */
+ $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;');
+ }
+
+ // INFO: https://unicode.org/cldr/utility/character.jsp
+ $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str);
+
+ if ($str_tmp !== false) {
+
+ // check again, if we only have ASCII, now ...
+ if (
+ $str_tmp !== $str
+ &&
+ self::is_ascii($str_tmp)
+ ) {
+ return $str_tmp;
+ }
+
+ $str = $str_tmp;
+ }
+ }
+
+ if (self::$ORD === null) {
+ self::$ORD = self::getData('ascii_ord');
+ }
+
+ \preg_match_all('/.|[^\x00]$/us', $str, $array_tmp);
+ $chars = $array_tmp[0];
+ $ord = null;
+ $str_tmp = '';
+ foreach ($chars as &$c) {
+ $ordC0 = self::$ORD[$c[0]];
+
+ if ($ordC0 >= 0 && $ordC0 <= 127) {
+ $str_tmp .= $c;
+
+ continue;
+ }
+
+ $ordC1 = self::$ORD[$c[1]];
+
+ // ASCII - next please
+ if ($ordC0 >= 192 && $ordC0 <= 223) {
+ $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128);
+ }
+
+ if ($ordC0 >= 224) {
+ $ordC2 = self::$ORD[$c[2]];
+
+ if ($ordC0 <= 239) {
+ $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordC2 - 128);
+ }
+
+ if ($ordC0 >= 240) {
+ $ordC3 = self::$ORD[$c[3]];
+
+ if ($ordC0 <= 247) {
+ $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordC2 - 128) * 64 + ($ordC3 - 128);
+ }
+
+ // We only process valid UTF-8 chars (<= 4 byte), so we don't need this code here ...
+ /*
+ if ($ordC0 >= 248) {
+ $ordC4 = self::$ORD[$c[4]];
+
+ if ($ordC0 <= 251) {
+ $ord = ($ordC0 - 248) * 16777216 + ($ordC1 - 128) * 262144 + ($ordC2 - 128) * 4096 + ($ordC3 - 128) * 64 + ($ordC4 - 128);
+ }
+
+ if ($ordC0 >= 252) {
+ $ordC5 = self::$ORD[$c[5]];
+
+ if ($ordC0 <= 253) {
+ $ord = ($ordC0 - 252) * 1073741824 + ($ordC1 - 128) * 16777216 + ($ordC2 - 128) * 262144 + ($ordC3 - 128) * 4096 + ($ordC4 - 128) * 64 + ($ordC5 - 128);
+ }
+ }
+ }
+ */
+ }
+ }
+
+ if (
+ $ordC0 === 254
+ ||
+ $ordC0 === 255
+ ||
+ $ord === null
+ ) {
+ $str_tmp .= $unknown ?? $c;
+
+ continue;
+ }
+
+ $bank = $ord >> 8;
+ if (!isset($UTF8_TO_TRANSLIT[$bank])) {
+ $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank));
+ }
+
+ $new_char = $ord & 255;
+
+ if (isset($UTF8_TO_TRANSLIT[$bank][$new_char])) {
+
+ // keep for debugging
+ /*
+ echo "file: " . sprintf('x%02x', $bank) . "\n";
+ echo "char: " . $c . "\n";
+ echo "ord: " . $ord . "\n";
+ echo "new_char: " . $new_char . "\n";
+ echo "new_char: " . mb_chr($new_char) . "\n";
+ echo "ascii: " . $UTF8_TO_TRANSLIT[$bank][$new_char] . "\n";
+ echo "bank:" . $bank . "\n\n";
+ */
+
+ $new_char = $UTF8_TO_TRANSLIT[$bank][$new_char];
+
+ /** @noinspection MissingOrEmptyGroupStatementInspection */
+ /** @noinspection PhpStatementHasEmptyBodyInspection */
+ if ($unknown === null && $new_char === '') {
+ // nothing
+ } elseif (
+ $new_char === '[?]'
+ ||
+ $new_char === '[?] '
+ ) {
+ $c = $unknown ?? $c;
+ } else {
+ $c = $new_char;
+ }
+ } else {
+
+ // keep for debugging missing chars
+ /*
+ echo "file: " . sprintf('x%02x', $bank) . "\n";
+ echo "char: " . $c . "\n";
+ echo "ord: " . $ord . "\n";
+ echo "new_char: " . $new_char . "\n";
+ echo "new_char: " . mb_chr($new_char) . "\n";
+ echo "bank:" . $bank . "\n\n";
+ */
+
+ $c = $unknown ?? $c;
+ }
+
+ $str_tmp .= $c;
+ }
+
+ return $str_tmp;
+ }
+
+ /**
+ * Get the language from a string.
+ *
+ * e.g.: de_at -> de_at
+ * de_DE -> de
+ * DE_DE -> de
+ * de-de -> de
+ *
+ * @noinspection ReturnTypeCanBeDeclaredInspection
+ *
+ * @param string $language
+ *
+ * @psalm-pure
+ *
+ * @return string
+ */
+ private static function get_language(string $language)
+ {
+ if ($language === '') {
+ return '';
+ }
+
+ if (
+ \strpos($language, '_') === false
+ &&
+ \strpos($language, '-') === false
+ ) {
+ return \strtolower($language);
+ }
+
+ $language = \str_replace('-', '_', \strtolower($language));
+
+ $regex = '/(?<first>[a-z]+)_\g{first}/';
+
+ return (string) \preg_replace($regex, '$1', $language);
+ }
+
+ /**
+ * Get data from "/data/*.php".
+ *
+ * @noinspection ReturnTypeCanBeDeclaredInspection
+ *
+ * @param string $file
+ *
+ * @psalm-pure
+ *
+ * @return array<mixed>
+ */
+ private static function getData(string $file)
+ {
+ /** @noinspection PhpIncludeInspection */
+ /** @noinspection UsingInclusionReturnValueInspection */
+ /** @psalm-suppress UnresolvableInclude */
+ return include __DIR__ . '/data/' . $file . '.php';
+ }
+
+ /**
+ * Get data from "/data/*.php".
+ *
+ * @param string $file
+ *
+ * @psalm-pure
+ *
+ * @return array<mixed>
+ */
+ private static function getDataIfExists(string $file): array
+ {
+ $file = __DIR__ . '/data/' . $file . '.php';
+ /** @psalm-suppress ImpureFunctionCall */
+ if (\is_file($file)) {
+ /** @noinspection PhpIncludeInspection */
+ /** @noinspection UsingInclusionReturnValueInspection */
+ /** @psalm-suppress UnresolvableInclude */
+ return include $file;
+ }
+
+ return [];
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @return void
+ */
+ private static function prepareAsciiAndExtrasMaps()
+ {
+ if (self::$ASCII_MAPS_AND_EXTRAS === null) {
+ self::prepareAsciiMaps();
+ self::prepareAsciiExtras();
+
+ /** @psalm-suppress PossiblyNullArgument - we use the prepare* methods here, so we don't get NULL here */
+ self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive(
+ self::$ASCII_MAPS ?? [],
+ self::$ASCII_EXTRAS ?? []
+ );
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @return void
+ */
+ private static function prepareAsciiMaps()
+ {
+ if (self::$ASCII_MAPS === null) {
+ self::$ASCII_MAPS = self::getData('ascii_by_languages');
+ }
+ }
+
+ /**
+ * @psalm-pure
+ *
+ * @return void
+ */
+ private static function prepareAsciiExtras()
+ {
+ if (self::$ASCII_EXTRAS === null) {
+ self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages');
+ }
+ }
+}
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php
new file mode 100644
index 000000000..d51f557a1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php
@@ -0,0 +1,2929 @@
+<?php
+
+// https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+
+return [
+ // Dutch (Flemish)
+ 'nl' => [
+ 'Á' => 'A',
+ 'á' => 'a',
+ 'Ä' => 'A',
+ 'ä' => 'a',
+ 'À' => 'A',
+ 'à' => 'a',
+ 'Â' => 'A',
+ 'â' => 'a',
+ 'É' => 'E',
+ 'é' => 'e',
+ 'Ë' => 'E',
+ 'ë' => 'e',
+ 'È' => 'E',
+ 'è' => 'e',
+ 'Ê' => 'E',
+ 'ê' => 'e',
+ 'Í' => 'I',
+ 'í' => 'i',
+ 'Ï' => 'I',
+ 'ï' => 'i',
+ 'Ì' => 'I',
+ 'ì' => 'i',
+ 'Î' => 'I',
+ 'î' => 'i',
+ 'Ó' => 'O',
+ 'ó' => 'o',
+ 'Ö' => 'O',
+ 'ö' => 'o',
+ 'Ò' => 'O',
+ 'ò' => 'o',
+ 'Ô' => 'O',
+ 'ô' => 'o',
+ 'Ú' => 'U',
+ 'ú' => 'u',
+ 'Ü' => 'U',
+ 'ü' => 'u',
+ 'Ù' => 'U',
+ 'ù' => 'u',
+ 'Û' => 'U',
+ 'û' => 'u',
+ 'Ý' => 'Y',
+ 'ý' => 'y',
+ 'Ÿ' => 'Y',
+ ],
+ // Italian
+ 'it' => [
+ 'à' => 'a',
+ 'À' => 'A',
+ 'é' => 'e',
+ 'É' => 'E',
+ 'è' => 'e',
+ 'È' => 'E',
+ 'ì' => 'i',
+ 'Ì' => 'I',
+ 'Ò' => 'O',
+ 'ò' => 'o',
+ 'ù' => 'u',
+ 'Ù' => 'U',
+ ],
+ // Macedonian
+ 'mk' => [
+ 'А' => 'A',
+ 'Б' => 'B',
+ 'В' => 'V',
+ 'Г' => 'G',
+ 'Д' => 'D',
+ 'Ѓ' => 'Gj',
+ 'Е' => 'E',
+ 'Ж' => 'Zh',
+ 'З' => 'Z',
+ 'Ѕ' => 'Dz',
+ 'И' => 'I',
+ 'Ј' => 'J',
+ 'К' => 'K',
+ 'Л' => 'L',
+ 'Љ' => 'Lj',
+ 'М' => 'M',
+ 'Н' => 'N',
+ 'Њ' => 'Nj',
+ 'О' => 'O',
+ 'П' => 'P',
+ 'Р' => 'R',
+ 'С' => 'S',
+ 'Т' => 'T',
+ 'Ќ' => 'Kj',
+ 'У' => 'U',
+ 'Ф' => 'F',
+ 'Х' => 'H',
+ 'Ц' => 'C',
+ 'Ч' => 'Ch',
+ 'Џ' => 'Dj',
+ 'Ш' => 'Sh',
+ 'а' => 'a',
+ 'б' => 'b',
+ 'в' => 'v',
+ 'г' => 'g',
+ 'д' => 'd',
+ 'ѓ' => 'gj',
+ 'е' => 'e',
+ 'ж' => 'zh',
+ 'з' => 'z',
+ 'ѕ' => 'dz',
+ 'и' => 'i',
+ 'ј' => 'j',
+ 'к' => 'k',
+ 'л' => 'l',
+ 'љ' => 'lj',
+ 'м' => 'm',
+ 'н' => 'n',
+ 'њ' => 'nj',
+ 'о' => 'o',
+ 'п' => 'p',
+ 'р' => 'r',
+ 'с' => 's',
+ 'т' => 't',
+ 'ќ' => 'kj',
+ 'у' => 'u',
+ 'ф' => 'f',
+ 'х' => 'h',
+ 'ц' => 'c',
+ 'ч' => 'ch',
+ 'џ' => 'dj',
+ 'ш' => 'sh',
+ ],
+ // Portuguese (Brazil)
+ 'pt' => [
+ 'æ' => 'ae',
+ 'ǽ' => 'ae',
+ 'À' => 'A',
+ 'Á' => 'A',
+ 'Â' => 'A',
+ 'Ã' => 'A',
+ 'Å' => 'AA',
+ 'Ǻ' => 'A',
+ 'Ă' => 'A',
+ 'Ǎ' => 'A',
+ 'Æ' => 'AE',
+ 'Ǽ' => 'AE',
+ 'à' => 'a',
+ 'á' => 'a',
+ 'â' => 'a',
+ 'ã' => 'a',
+ 'å' => 'aa',
+ 'ǻ' => 'a',
+ 'ă' => 'a',
+ 'ǎ' => 'a',
+ 'ª' => 'a',
+ 'Ĉ' => 'C',
+ 'Ċ' => 'C',
+ 'Ç' => 'C',
+ 'ç' => 'c',
+ 'ĉ' => 'c',
+ 'ċ' => 'c',
+ 'Ð' => 'Dj',
+ 'Đ' => 'D',
+ 'ð' => 'dj',
+ 'đ' => 'd',
+ 'È' => 'E',
+ 'É' => 'E',
+ 'Ê' => 'E',
+ 'Ë' => 'E',
+ 'Ĕ' => 'E',
+ 'Ė' => 'E',
+ 'è' => 'e',
+ 'é' => 'e',
+ 'ê' => 'e',
+ 'ë' => 'e',
+ 'ĕ' => 'e',
+ 'ė' => 'e',
+ 'ƒ' => 'f',
+ 'Ĝ' => 'G',
+ 'Ġ' => 'G',
+ 'ĝ' => 'g',
+ 'ġ' => 'g',
+ 'Ĥ' => 'H',
+ 'Ħ' => 'H',
+ 'ĥ' => 'h',
+ 'ħ' => 'h',
+ 'Ì' => 'I',
+ 'Í' => 'I',
+ 'Î' => 'I',
+ 'Ï' => 'I',
+ 'Ĩ' => 'I',
+ 'Ĭ' => 'I',
+ 'Ǐ' => 'I',
+ 'Į' => 'I',
+ 'IJ' => 'IJ',
+ 'ì' => 'i',
+ 'í' => 'i',
+ 'î' => 'i',
+ 'ï' => 'i',
+ 'ĩ' => 'i',
+ 'ĭ' => 'i',
+ 'ǐ' => 'i',
+ 'į' => 'i',
+ 'ij' => 'ij',
+ 'Ĵ' => 'J',
+ 'ĵ' => 'j',
+ 'Ĺ' => 'L',
+ 'Ľ' => 'L',
+ 'Ŀ' => 'L',
+ 'ĺ' => 'l',
+ 'ľ' => 'l',
+ 'ŀ' => 'l',
+ 'Ñ' => 'N',
+ 'ñ' => 'n',
+ 'ʼn' => 'n',
+ 'Ò' => 'O',
+ 'Ó' => 'O',
+ 'Ô' => 'O',
+ 'Õ' => 'O',
+ 'Ō' => 'O',
+ 'Ŏ' => 'O',
+ 'Ǒ' => 'O',
+ 'Ő' => 'O',
+ 'Ơ' => 'O',
+ 'Ø' => 'OE',
+ 'Ǿ' => 'O',
+ 'Œ' => 'OE',
+ 'ò' => 'o',
+ 'ó' => 'o',
+ 'ô' => 'o',
+ 'õ' => 'o',
+ 'ō' => 'o',
+ 'ŏ' => 'o',
+ 'ǒ' => 'o',
+ 'ő' => 'o',
+ 'ơ' => 'o',
+ 'ø' => 'oe',
+ 'ǿ' => 'o',
+ 'º' => 'o',
+ 'œ' => 'oe',
+ 'Ŕ' => 'R',
+ 'Ŗ' => 'R',
+ 'ŕ' => 'r',
+ 'ŗ' => 'r',
+ 'Ŝ' => 'S',
+ 'Ș' => 'S',
+ 'ŝ' => 's',
+ 'ș' => 's',
+ 'ſ' => 's',
+ 'Ţ' => 'T',
+ 'Ț' => 'T',
+ 'Ŧ' => 'T',
+ 'Þ' => 'TH',
+ 'ţ' => 't',
+ 'ț' => 't',
+ 'ŧ' => 't',
+ 'þ' => 'th',
+ 'Ù' => 'U',
+ 'Ú' => 'U',
+ 'Û' => 'U',
+ 'Ü' => 'U',
+ 'Ũ' => 'U',
+ 'Ŭ' => 'U',
+ 'Ű' => 'U',
+ 'Ų' => 'U',
+ 'Ư' => 'U',
+ 'Ǔ' => 'U',
+ 'Ǖ' => 'U',
+ 'Ǘ' => 'U',
+ 'Ǚ' => 'U',
+ 'Ǜ' => 'U',
+ 'ù' => 'u',
+ 'ú' => 'u',
+ 'û' => 'u',
+ 'ü' => 'u',
+ 'ũ' => 'u',
+ 'ŭ' => 'u',
+ 'ű' => 'u',
+ 'ų' => 'u',
+ 'ư' => 'u',
+ 'ǔ' => 'u',
+ 'ǖ' => 'u',
+ 'ǘ' => 'u',
+ 'ǚ' => 'u',
+ 'ǜ' => 'u',
+ 'Ŵ' => 'W',
+ 'ŵ' => 'w',
+ 'Ý' => 'Y',
+ 'Ÿ' => 'Y',
+ 'Ŷ' => 'Y',
+ 'ý' => 'y',
+ 'ÿ' => 'y',
+ 'ŷ' => 'y',
+ ],
+ // Greek(lish) (Elláda)
+ 'el__greeklish' => [
+ 'ΑΥ' => 'AU',
+ 'ΑΎ' => 'AU',
+ 'Αυ' => 'Au',
+ 'Αύ' => 'Au',
+ 'ΕΊ' => 'EI',
+ 'ΕΙ' => 'EI',
+ 'Ει' => 'EI',
+ 'ΕΥ' => 'EU',
+ 'ΕΎ' => 'EU',
+ 'Εί' => 'Ei',
+ 'Ευ' => 'Eu',
+ 'Εύ' => 'Eu',
+ 'ΟΙ' => 'OI',
+ 'ΟΊ' => 'OI',
+ 'ΟΥ' => 'OU',
+ 'ΟΎ' => 'OU',
+ 'Οι' => 'Oi',
+ 'Οί' => 'Oi',
+ 'Ου' => 'Ou',
+ 'Ού' => 'Ou',
+ 'ΥΙ' => 'YI',
+ 'ΎΙ' => 'YI',
+ 'Υι' => 'Yi',
+ 'Ύι' => 'Yi',
+ 'ΥΊ' => 'Yi',
+ 'Υί' => 'Yi',
+ 'αυ' => 'au',
+ 'αύ' => 'au',
+ 'εί' => 'ei',
+ 'ει' => 'ei',
+ 'ευ' => 'eu',
+ 'εύ' => 'eu',
+ 'οι' => 'oi',
+ 'οί' => 'oi',
+ 'ου' => 'ou',
+ 'ού' => 'ou',
+ 'υι' => 'yi',
+ 'ύι' => 'yi',
+ 'υί' => 'yi',
+ 'Α' => 'A',
+ 'Ά' => 'A',
+ 'Β' => 'B',
+ 'Δ' => 'D',
+ 'Ε' => 'E',
+ 'Έ' => 'E',
+ 'Φ' => 'F',
+ 'Γ' => 'G',
+ 'Η' => 'H',
+ 'Ή' => 'H',
+ 'Ι' => 'I',
+ 'Ί' => 'I',
+ 'Ϊ' => 'I',
+ 'Κ' => 'K',
+ 'Ξ' => 'Ks',
+ 'Λ' => 'L',
+ 'Μ' => 'M',
+ 'Ν' => 'N',
+ 'Π' => 'N',
+ 'Ο' => 'O',
+ 'Ό' => 'O',
+ 'Ψ' => 'Ps',
+ 'Ρ' => 'R',
+ 'Σ' => 'S',
+ 'Τ' => 'T',
+ 'Θ' => 'Th',
+ 'Ω' => 'W',
+ 'Ώ' => 'W',
+ 'Χ' => 'X',
+ 'ϒ' => 'Y',
+ 'Υ' => 'Y',
+ 'Ύ' => 'Y',
+ 'Ϋ' => 'Y',
+ 'Ζ' => 'Z',
+ 'α' => 'a',
+ 'ά' => 'a',
+ 'β' => 'b',
+ 'δ' => 'd',
+ 'ε' => 'e',
+ 'έ' => 'e',
+ 'φ' => 'f',
+ 'γ' => 'g',
+ 'η' => 'h',
+ 'ή' => 'h',
+ 'ι' => 'i',
+ 'ί' => 'i',
+ 'ϊ' => 'i',
+ 'ΐ' => 'i',
+ 'κ' => 'k',
+ 'ξ' => 'ks',
+ 'λ' => 'l',
+ 'μ' => 'm',
+ 'ν' => 'n',
+ 'ο' => 'o',
+ 'ό' => 'o',
+ 'π' => 'p',
+ 'ψ' => 'ps',
+ 'ρ' => 'r',
+ 'σ' => 's',
+ 'ς' => 's',
+ 'τ' => 't',
+ 'ϑ' => 'th',
+ 'θ' => 'th',
+ 'ϐ' => 'v',
+ 'ω' => 'w',
+ 'ώ' => 'w',
+ 'χ' => 'x',
+ 'υ' => 'y',
+ 'ύ' => 'y',
+ 'ΰ' => 'y',
+ 'ϋ' => 'y',
+ 'ζ' => 'z',
+ ],
+ // Greek (Elláda)
+ 'el' => [
+ 'ΑΥ' => 'AU',
+ 'Αυ' => 'Au',
+ 'ΟΥ' => 'U',
+ 'Ου' => 'u',
+ 'ΕΥ' => 'EF',
+ 'Ευ' => 'Ef',
+ 'ΕΙ' => 'I',
+ 'Ει' => 'I',
+ 'ΟΙ' => 'I',
+ 'Οι' => 'I',
+ 'ΥΙ' => 'I',
+ 'Υι' => 'I',
+ 'ΑΎ' => 'AU',
+ 'Αύ' => 'Au',
+ 'ΟΎ' => 'OU',
+ 'Ού' => 'Ou',
+ 'ΕΎ' => 'EU',
+ 'Εύ' => 'Eu',
+ 'ΕΊ' => 'I',
+ 'Εί' => 'I',
+ 'ΟΊ' => 'I',
+ 'Οί' => 'I',
+ 'ΎΙ' => 'I',
+ 'Ύι' => 'I',
+ 'ΥΊ' => 'I',
+ 'Υί' => 'I',
+ 'αυ' => 'au',
+ 'ου' => 'u',
+ 'ευ' => 'ef',
+ 'ει' => 'i',
+ 'οι' => 'i',
+ 'υι' => 'i',
+ 'αύ' => 'au',
+ 'ού' => 'ou',
+ 'εύ' => 'eu',
+ 'εί' => 'i',
+ 'οί' => 'i',
+ 'ύι' => 'i',
+ 'υί' => 'i',
+ 'α' => 'a',
+ 'β' => 'v',
+ 'γ' => 'gh',
+ 'δ' => 'd',
+ 'ε' => 'e',
+ 'ζ' => 'z',
+ 'η' => 'i',
+ 'θ' => 'th',
+ 'ι' => 'i',
+ 'κ' => 'k',
+ 'λ' => 'l',
+ 'μ' => 'm',
+ 'ν' => 'n',
+ 'ξ' => 'ks',
+ 'ο' => 'o',
+ 'π' => 'p',
+ 'ρ' => 'r',
+ 'σ' => 's',
+ 'τ' => 't',
+ 'υ' => 'i',
+ 'φ' => 'f',
+ 'χ' => 'kh',
+ 'ψ' => 'ps',
+ 'ω' => 'o',
+ 'ά' => 'a',
+ 'έ' => 'e',
+ 'ί' => 'i',
+ 'ό' => 'o',
+ 'ϒ' => 'Y',
+ 'ύ' => 'y',
+ 'ή' => 'i',
+ 'ώ' => 'w',
+ 'ς' => 's',
+ 'ϊ' => 'i',
+ 'ΰ' => 'y',
+ 'ϋ' => 'y',
+ 'ΐ' => 'i',
+ 'Α' => 'A',
+ 'Β' => 'B',
+ 'Γ' => 'G',
+ 'Δ' => 'D',
+ 'Ε' => 'E',
+ 'Ζ' => 'Z',
+ 'Η' => 'H',
+ 'Θ' => 'Th',
+ 'Ι' => 'I',
+ 'Κ' => 'K',
+ 'Λ' => 'L',
+ 'Μ' => 'M',
+ 'Ν' => 'N',
+ 'Ξ' => 'Ks',
+ 'Ο' => 'O',
+ 'Π' => 'P',
+ 'Ρ' => 'R',
+ 'Σ' => 'S',
+ 'Τ' => 'T',
+ 'Υ' => 'Y',
+ 'Φ' => 'F',
+ 'Χ' => 'X',
+ 'Ψ' => 'Ps',
+ 'Ω' => 'O',
+ 'Ά' => 'A',
+ 'Έ' => 'E',
+ 'Ί' => 'I',
+ 'Ό' => 'O',
+ 'Ύ' => 'Y',
+ 'Ή' => 'I',
+ 'Ώ' => 'W',
+ 'Ϊ' => 'I',
+ 'Ϋ' => 'Y',
+ 'ϐ' => 'v',
+ 'ϑ' => 'th',
+ ],
+ // Hindi
+ 'hi' => [
+ 'अ' => 'a',
+ 'आ' => 'aa',
+ 'ए' => 'e',
+ 'ई' => 'ii',
+ 'ऍ' => 'ei',
+ 'ऎ' => 'ae',
+ 'ऐ' => 'ai',
+ 'इ' => 'i',
+ 'ओ' => 'o',
+ 'ऑ' => 'oi',
+ 'ऒ' => 'oii',
+ 'ऊ' => 'uu',
+ 'औ' => 'ou',
+ 'उ' => 'u',
+ 'ब' => 'B',
+ 'भ' => 'Bha',
+ 'च' => 'Ca',
+ 'छ' => 'Chha',
+ 'ड' => 'Da',
+ 'ढ' => 'Dha',
+ 'फ' => 'Fa',
+ 'फ़' => 'Fi',
+ 'ग' => 'Ga',
+ 'घ' => 'Gha',
+ 'ग़' => 'Ghi',
+ 'ह' => 'Ha',
+ 'ज' => 'Ja',
+ 'झ' => 'Jha',
+ 'क' => 'Ka',
+ 'ख' => 'Kha',
+ 'ख़' => 'Khi',
+ 'ल' => 'L',
+ 'ळ' => 'Li',
+ 'ऌ' => 'Li',
+ 'ऴ' => 'Lii',
+ 'ॡ' => 'Lii',
+ 'म' => 'Ma',
+ 'न' => 'Na',
+ 'ङ' => 'Na',
+ 'ञ' => 'Nia',
+ 'ण' => 'Nae',
+ 'ऩ' => 'Ni',
+ 'ॐ' => 'oms',
+ 'प' => 'Pa',
+ 'क़' => 'Qi',
+ 'र' => 'Ra',
+ 'ऋ' => 'Ri',
+ 'ॠ' => 'Ri',
+ 'ऱ' => 'Ri',
+ 'स' => 'Sa',
+ 'श' => 'Sha',
+ 'ष' => 'Shha',
+ 'ट' => 'Ta',
+ 'त' => 'Ta',
+ 'ठ' => 'Tha',
+ 'द' => 'Tha',
+ 'थ' => 'Tha',
+ 'ध' => 'Thha',
+ 'ड़' => 'ugDha',
+ 'ढ़' => 'ugDhha',
+ 'व' => 'Va',
+ 'य' => 'Ya',
+ 'य़' => 'Yi',
+ 'ज़' => 'Za',
+ ],
+ // Armenian
+ 'hy' => [
+ 'Ա' => 'A',
+ 'Բ' => 'B',
+ 'Գ' => 'G',
+ 'Դ' => 'D',
+ 'Ե' => 'E',
+ 'Զ' => 'Z',
+ 'Է' => 'E',
+ 'Ը' => 'Y',
+ 'Թ' => 'Th',
+ 'Ժ' => 'Zh',
+ 'Ի' => 'I',
+ 'Լ' => 'L',
+ 'Խ' => 'Kh',
+ 'Ծ' => 'Ts',
+ 'Կ' => 'K',
+ 'Հ' => 'H',
+ 'Ձ' => 'Dz',
+ 'Ղ' => 'Gh',
+ 'Ճ' => 'Tch',
+ 'Մ' => 'M',
+ 'Յ' => 'Y',
+ 'Ն' => 'N',
+ 'Շ' => 'Sh',
+ 'Ո' => 'Vo',
+ 'Չ' => 'Ch',
+ 'Պ' => 'P',
+ 'Ջ' => 'J',
+ 'Ռ' => 'R',
+ 'Ս' => 'S',
+ 'Վ' => 'V',
+ 'Տ' => 'T',
+ 'Ր' => 'R',
+ 'Ց' => 'C',
+ 'Ւ' => 'u',
+ 'Փ' => 'Ph',
+ 'Ք' => 'Q',
+ 'և' => 'ev',
+ 'Օ' => 'O',
+ 'Ֆ' => 'F',
+ 'ա' => 'a',
+ 'բ' => 'b',
+ 'գ' => 'g',
+ 'դ' => 'd',
+ 'ե' => 'e',
+ 'զ' => 'z',
+ 'է' => 'e',
+ 'ը' => 'y',
+ 'թ' => 'th',
+ 'ժ' => 'zh',
+ 'ի' => 'i',
+ 'լ' => 'l',
+ 'խ' => 'kh',
+ 'ծ' => 'ts',
+ 'կ' => 'k',
+ 'հ' => 'h',
+ 'ձ' => 'dz',
+ 'ղ' => 'gh',
+ 'ճ' => 'tch',
+ 'մ' => 'm',
+ 'յ' => 'y',
+ 'ն' => 'n',
+ 'շ' => 'sh',
+ 'ո' => 'vo',
+ 'չ' => 'ch',
+ 'պ' => 'p',
+ 'ջ' => 'j',
+ 'ռ' => 'r',
+ 'ս' => 's',
+ 'վ' => 'v',
+ 'տ' => 't',
+ 'ր' => 'r',
+ 'ց' => 'c',
+ 'ւ' => 'u',
+ 'փ' => 'ph',
+ 'ք' => 'q',
+ 'օ' => 'o',
+ 'ֆ' => 'f',
+ ],
+ // Swedish
+ 'sv' => [
+ 'Ä' => 'A',
+ 'ä' => 'a',
+ 'Å' => 'A',
+ 'å' => 'a',
+ 'Ö' => 'O',
+ 'ö' => 'o',
+ ],
+ // Turkmen
+ 'tk' => [
+ 'Ç' => 'C',
+ 'Ä' => 'A',
+ 'Ž' => 'Z',
+ 'Ň' => 'N',
+ 'Ö' => 'O',
+ 'Ş' => 'S',
+ 'Ü' => 'U',
+ 'Ý' => 'Y',
+ 'ç' => 'c',
+ 'ä' => 'a',
+ 'ž' => 'z',
+ 'ň' => 'n',
+ 'ö' => 'o',
+ 'ş' => 's',
+ 'ü' => 'u',
+ 'ý' => 'y',
+ ],
+ // Turkish
+ 'tr' => [
+ 'ň' => 'n',
+ 'Ň' => 'N',
+ 'ş' => 's',
+ 'Ş' => 'S',
+ 'ı' => 'i',
+ 'İ' => 'I',
+ 'ç' => 'c',
+ 'Ç' => 'C',
+ 'ä' => 'a',
+ 'Ä' => 'A',
+ 'ü' => 'u',
+ 'Ü' => 'U',
+ 'ö' => 'o',
+ 'Ö' => 'O',
+ 'ğ' => 'g',
+ 'Ğ' => 'G',
+ 'ý' => 'y',
+ 'Ý' => 'Y',
+ 'ž' => 'z',
+ 'Ž' => 'Z',
+ ],
+ // Bulgarian
+ 'bg' => [
+ 'ьо' => 'yo',
+ 'А' => 'A',
+ 'Б' => 'B',
+ 'В' => 'V',
+ 'Г' => 'G',
+ 'Д' => 'D',
+ 'Е' => 'E',
+ 'Ж' => 'Zh',
+ 'З' => 'Z',
+ 'И' => 'I',
+ 'Й' => 'Y',
+ 'К' => 'K',
+ 'Л' => 'L',
+ 'М' => 'M',
+ 'Н' => 'N',
+ 'О' => 'O',
+ 'П' => 'P',
+ 'Р' => 'R',
+ 'С' => 'S',
+ 'Т' => 'T',
+ 'У' => 'U',
+ 'Ф' => 'F',
+ 'Х' => 'H',
+ 'Ц' => 'C',
+ 'Ч' => 'Ch',
+ 'Ш' => 'Sh',
+ 'Щ' => 'Sht',
+ 'Ъ' => 'A',
+ 'Ь' => '',
+ 'Ю' => 'Yu',
+ 'Я' => 'Ya',
+ 'а' => 'a',
+ 'б' => 'b',
+ 'в' => 'v',
+ 'г' => 'g',
+ 'д' => 'd',
+ 'е' => 'e',
+ 'ж' => 'zh',
+ 'з' => 'z',
+ 'и' => 'i',
+ 'й' => 'y',
+ 'к' => 'k',
+ 'л' => 'l',
+ 'м' => 'm',
+ 'н' => 'n',
+ 'о' => 'o',
+ 'п' => 'p',
+ 'р' => 'r',
+ 'с' => 's',
+ 'т' => 't',
+ 'у' => 'u',
+ 'ф' => 'f',
+ 'х' => 'h',
+ 'ц' => 'c',
+ 'ч' => 'ch',
+ 'ш' => 'sh',
+ 'щ' => 'sht',
+ 'ъ' => 'a',
+ 'ь' => '',
+ 'ю' => 'yu',
+ 'я' => 'ya',
+ ],
+ // Hungarian
+ 'hu' => [
+ 'Á' => 'A',
+ 'Ē' => 'E',
+ 'É' => 'E',
+ 'Í' => 'I',
+ 'Ó' => 'O',
+ 'Ö' => 'O',
+ 'Ő' => 'O',
+ 'Ú' => 'U',
+ 'Ü' => 'U',
+ 'Ű' => 'U',
+ 'á' => 'a',
+ 'ē' => 'e',
+ 'é' => 'e',
+ 'í' => 'i',
+ 'ó' => 'o',
+ 'ö' => 'o',
+ 'ő' => 'o',
+ 'ú' => 'u',
+ 'ü' => 'u',
+ 'ű' => 'u',
+ ],
+ // Myanmar (Burmese)
+ 'my' => [
+ 'န်ုပ်' => 'nub',
+ 'ောင်' => 'aung',
+ 'ိုက်' => 'aik',
+ 'ိုဒ်' => 'ok',
+ 'ိုင်' => 'aing',
+ 'ိုလ်' => 'ol',
+ 'ေါင်' => 'aung',
+ 'သြော' => 'aw',
+ 'ောက်' => 'auk',
+ 'ိတ်' => 'eik',
+ 'ုတ်' => 'ok',
+ 'ုန်' => 'on',
+ 'ေတ်' => 'it',
+ 'ုဒ်' => 'ait',
+ 'ာန်' => 'an',
+ 'ိန်' => 'ein',
+ 'ွတ်' => 'ut',
+ 'ေါ်' => 'aw',
+ 'ွန်' => 'un',
+ 'ိပ်' => 'eik',
+ 'ုပ်' => 'ok',
+ 'ွပ်' => 'ut',
+ 'ိမ်' => 'ein',
+ 'ုမ်' => 'on',
+ 'ော်' => 'aw',
+ 'ွမ်' => 'un',
+ 'က်' => 'et',
+ 'ေါ' => 'aw',
+ 'ော' => 'aw',
+ 'ျွ' => 'ywa',
+ 'ြွ' => 'yw',
+ 'ို' => 'o',
+ 'ုံ' => 'on',
+ 'တ်' => 'at',
+ 'င်' => 'in',
+ 'ည်' => 'i',
+ 'ဒ်' => 'd',
+ 'န်' => 'an',
+ 'ပ်' => 'at',
+ 'မ်' => 'an',
+ 'စျ' => 'za',
+ 'ယ်' => 'e',
+ 'ဉ်' => 'in',
+ 'စ်' => 'it',
+ 'ိံ' => 'ein',
+ 'ဲ' => 'e',
+ 'း' => '',
+ 'ာ' => 'a',
+ 'ါ' => 'a',
+ 'ေ' => 'e',
+ 'ံ' => 'an',
+ 'ိ' => 'i',
+ 'ီ' => 'i',
+ 'ု' => 'u',
+ 'ူ' => 'u',
+ '်' => 'at',
+ '္' => '',
+ '့' => '',
+ 'က' => 'k',
+ '၉' => '9',
+ 'တ' => 't',
+ 'ရ' => 'ya',
+ 'ယ' => 'y',
+ 'မ' => 'm',
+ 'ဘ' => 'ba',
+ 'ဗ' => 'b',
+ 'ဖ' => 'pa',
+ 'ပ' => 'p',
+ 'န' => 'n',
+ 'ဓ' => 'da',
+ 'ဒ' => 'd',
+ 'ထ' => 'ta',
+ 'ဏ' => 'na',
+ 'ဝ' => 'w',
+ 'ဎ' => 'da',
+ 'ဍ' => 'd',
+ 'ဌ' => 'ta',
+ 'ဋ' => 't',
+ 'ည' => 'ny',
+ 'ဇ' => 'z',
+ 'ဆ' => 'sa',
+ 'စ' => 's',
+ 'င' => 'ng',
+ 'ဃ' => 'ga',
+ 'ဂ' => 'g',
+ 'လ' => 'l',
+ 'သ' => 'th',
+ '၈' => '8',
+ 'ဩ' => 'aw',
+ 'ခ' => 'kh',
+ '၆' => '6',
+ '၅' => '5',
+ '၄' => '4',
+ '၃' => '3',
+ '၂' => '2',
+ '၁' => '1',
+ '၀' => '0',
+ '၌' => 'hnaik',
+ '၍' => 'ywae',
+ 'ဪ' => 'aw',
+ 'ဦ' => '-u',
+ 'ဟ' => 'h',
+ 'ဉ' => 'u',
+ 'ဤ' => '-i',
+ 'ဣ' => 'i',
+ '၏' => '-e',
+ 'ဧ' => 'e',
+ 'ှ' => 'h',
+ 'ွ' => 'w',
+ 'ျ' => 'ya',
+ 'ြ' => 'y',
+ 'အ' => 'a',
+ 'ဠ' => 'la',
+ '၇' => '7',
+ ],
+ // Croatian (Hrvatska)
+ 'hr' => [
+ 'DŽ' => 'DZ',
+ 'Dž' => 'Dz',
+ 'dž' => 'dz',
+ 'DZ' => 'DZ',
+ 'Dz' => 'Dz',
+ 'dz' => 'dz',
+ 'IJ' => 'IJ',
+ 'ij' => 'ij',
+ 'LJ' => 'LJ',
+ 'Lj' => 'Lj',
+ 'lj' => 'lj',
+ 'NJ' => 'NJ',
+ 'Nj' => 'Nj',
+ 'nj' => 'nj',
+ 'ž' => 'z',
+ 'Ž' => 'Z',
+ 'đ' => 'dj',
+ 'Đ' => 'Dj',
+ 'č' => 'c',
+ 'Č' => 'C',
+ 'ć' => 'c',
+ 'Ć' => 'C',
+ 'š' => 's',
+ 'Š' => 'S',
+ ],
+ // Finnish
+ 'fi' => [
+ 'Ä' => 'A',
+ 'Ö' => 'O',
+ 'ä' => 'a',
+ 'ö' => 'o',
+ ],
+ // Georgian (Kartvelian)
+ 'ka' => [
+ 'ა' => 'a',
+ 'ბ' => 'b',
+ 'გ' => 'g',
+ 'დ' => 'd',
+ 'ე' => 'e',
+ 'ვ' => 'v',
+ 'ზ' => 'z',
+ 'თ' => 't',
+ 'ი' => 'i',
+ 'კ' => 'k',
+ 'ლ' => 'l',
+ 'მ' => 'm',
+ 'ნ' => 'n',
+ 'ო' => 'o',
+ 'პ' => 'p',
+ 'ჟ' => 'zh',
+ 'რ' => 'r',
+ 'ს' => 's',
+ 'ტ' => 't',
+ 'უ' => 'u',
+ 'ფ' => 'f',
+ 'ქ' => 'q',
+ 'ღ' => 'gh',
+ 'ყ' => 'y',
+ 'შ' => 'sh',
+ 'ჩ' => 'ch',
+ 'ც' => 'ts',
+ 'ძ' => 'dz',
+ 'წ' => 'ts',
+ 'ჭ' => 'ch',
+ 'ხ' => 'kh',
+ 'ჯ' => 'j',
+ 'ჰ' => 'h',
+ ],
+ // Russian
+ 'ru' => [
+ 'А' => 'A',
+ 'а' => 'a',
+ 'Б' => 'B',
+ 'б' => 'b',
+ 'В' => 'V',
+ 'в' => 'v',
+ 'Г' => 'G',
+ 'г' => 'g',
+ 'Д' => 'D',
+ 'д' => 'd',
+ 'Е' => 'E',
+ 'е' => 'e',
+ 'Ё' => 'Yo',
+ 'ё' => 'yo',
+ 'Ж' => 'Zh',
+ 'ж' => 'zh',
+ 'З' => 'Z',
+ 'з' => 'z',
+ 'И' => 'I',
+ 'и' => 'i',
+ 'Й' => 'Y',
+ 'й' => 'y',
+ 'К' => 'K',
+ 'к' => 'k',
+ 'Л' => 'L',
+ 'л' => 'l',
+ 'М' => 'M',
+ 'м' => 'm',
+ 'Н' => 'N',
+ 'н' => 'n',
+ 'О' => 'O',
+ 'о' => 'o',
+ 'П' => 'P',
+ 'п' => 'p',
+ 'Р' => 'R',
+ 'р' => 'r',
+ 'С' => 'S',
+ 'с' => 's',
+ 'Т' => 'T',
+ 'т' => 't',
+ 'У' => 'U',
+ 'у' => 'u',
+ 'Ф' => 'F',
+ 'ф' => 'f',
+ 'Х' => 'H',
+ 'х' => 'h',
+ 'Ц' => 'Ts',
+ 'ц' => 'ts',
+ 'Ч' => 'Ch',
+ 'ч' => 'ch',
+ 'ш' => 'sh',
+ 'Ш' => 'Sh',
+ 'Щ' => 'Sch',
+ 'щ' => 'sch',
+ 'Ъ' => '',
+ 'ъ' => '',
+ 'Ы' => 'Y',
+ 'ы' => 'y',
+ 'Ь' => '',
+ 'ь' => '',
+ 'Э' => 'E',
+ 'э' => 'e',
+ 'Ю' => 'Yu',
+ 'ю' => 'yu',
+ 'Я' => 'Ya',
+ 'я' => 'ya',
+ ],
+ // Russian - Passport (2013), ICAO
+ // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1
+ 'ru__passport_2013' => [
+ 'А' => 'A',
+ 'а' => 'a',
+ 'Б' => 'B',
+ 'б' => 'b',
+ 'В' => 'V',
+ 'в' => 'v',
+ 'Г' => 'G',
+ 'г' => 'g',
+ 'Д' => 'D',
+ 'д' => 'd',
+ 'Е' => 'E',
+ 'е' => 'e',
+ 'Ё' => 'E',
+ 'ё' => 'e',
+ 'Ж' => 'Zh',
+ 'ж' => 'zh',
+ 'З' => 'Z',
+ 'з' => 'z',
+ 'И' => 'i',
+ 'и' => 'i',
+ 'Й' => 'i',
+ 'й' => 'i',
+ 'К' => 'K',
+ 'к' => 'k',
+ 'Л' => 'L',
+ 'л' => 'l',
+ 'М' => 'M',
+ 'м' => 'm',
+ 'Н' => 'N',
+ 'н' => 'n',
+ 'О' => 'O',
+ 'о' => 'o',
+ 'П' => 'P',
+ 'п' => 'p',
+ 'Р' => 'R',
+ 'р' => 'r',
+ 'С' => 'S',
+ 'с' => 's',
+ 'Т' => 'T',
+ 'т' => 't',
+ 'У' => 'U',
+ 'у' => 'u',
+ 'Ф' => 'F',
+ 'ф' => 'f',
+ 'Х' => 'Kh',
+ 'х' => 'kh',
+ 'Ц' => 'Ts',
+ 'ц' => 'ts',
+ 'Ч' => 'Ch',
+ 'ч' => 'ch',
+ 'ш' => 'sh',
+ 'Ш' => 'Sh',
+ 'Щ' => 'Shch',
+ 'щ' => 'shch',
+ 'Ъ' => 'Ie',
+ 'ъ' => 'ie',
+ 'Ы' => 'Y',
+ 'ы' => 'y',
+ 'Ь' => '',
+ 'ь' => '',
+ 'Э' => 'E',
+ 'э' => 'e',
+ 'Ю' => 'Iu',
+ 'ю' => 'iu',
+ 'Я' => 'Ia',
+ 'я' => 'ia',
+ 'І' => '',
+ 'і' => '',
+ 'Ѳ' => '',
+ 'ѳ' => '',
+ 'Ѣ' => '',
+ 'ѣ' => '',
+ 'Ѵ' => '',
+ 'ѵ' => '',
+ 'Є' => '',
+ 'є' => '',
+ 'Ѥ' => '',
+ 'ѥ' => '',
+ 'Ѕ' => '',
+ 'ѕ' => '',
+ 'Ꙋ' => '',
+ 'ꙋ' => '',
+ 'Ѡ' => '',
+ 'ѡ' => '',
+ 'Ѿ' => '',
+ 'ѿ' => '',
+ 'Ѫ' => '',
+ 'ѫ' => '',
+ 'Ѧ' => '',
+ 'ѧ' => '',
+ 'Ѭ' => '',
+ 'ѭ' => '',
+ 'Ѩ' => '',
+ 'ѩ' => '',
+ 'Ѯ' => '',
+ 'ѯ' => '',
+ 'Ѱ' => '',
+ 'ѱ' => '',
+ ],
+ // Russian - GOST 7.79-2000(B)
+ // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1
+ 'ru__gost_2000_b' => [
+ 'А' => 'A',
+ 'а' => 'a',
+ 'Б' => 'B',
+ 'б' => 'b',
+ 'В' => 'V',
+ 'в' => 'v',
+ 'Г' => 'G',
+ 'г' => 'g',
+ 'Д' => 'D',
+ 'д' => 'd',
+ 'Е' => 'E',
+ 'е' => 'e',
+ 'Ё' => 'Yo',
+ 'ё' => 'yo',
+ 'Ж' => 'Zh',
+ 'ж' => 'zh',
+ 'З' => 'Z',
+ 'з' => 'z',
+ 'И' => 'i',
+ 'и' => 'i',
+ 'Й' => 'i',
+ 'й' => 'i',
+ 'К' => 'K',
+ 'к' => 'k',
+ 'Л' => 'L',
+ 'л' => 'l',
+ 'М' => 'M',
+ 'м' => 'm',
+ 'Н' => 'N',
+ 'н' => 'n',
+ 'О' => 'O',
+ 'о' => 'o',
+ 'П' => 'P',
+ 'п' => 'p',
+ 'Р' => 'R',
+ 'р' => 'r',
+ 'С' => 'S',
+ 'с' => 's',
+ 'Т' => 'T',
+ 'т' => 't',
+ 'У' => 'U',
+ 'у' => 'u',
+ 'Ф' => 'F',
+ 'ф' => 'f',
+ 'Х' => 'X',
+ 'х' => 'x',
+ 'Ц' => 'Cz',
+ 'ц' => 'cz',
+ 'Ч' => 'Ch',
+ 'ч' => 'ch',
+ 'ш' => 'sh',
+ 'Ш' => 'Sh',
+ 'Щ' => 'Shh',
+ 'щ' => 'shh',
+ 'Ъ' => '',
+ 'ъ' => '',
+ 'Ы' => 'Y\'',
+ 'ы' => 'y\'',
+ 'Ь' => '',
+ 'ь' => '',
+ 'Э' => 'E\'',
+ 'э' => 'e\'',
+ 'Ю' => 'Yu',
+ 'ю' => 'yu',
+ 'Я' => 'Ya',
+ 'я' => 'ya',
+ 'І' => 'I',
+ 'і' => 'i',
+ 'Ѳ' => 'Fh',
+ 'ѳ' => 'fh',
+ 'Ѣ' => 'Ye',
+ 'ѣ' => 'ye',
+ 'Ѵ' => 'Yh',
+ 'ѵ' => 'yh',
+ 'Є' => '',
+ 'є' => '',
+ 'Ѥ' => '',
+ 'ѥ' => '',
+ 'Ѕ' => 'Js',
+ 'ѕ' => 'js',
+ 'Ꙋ' => '',
+ 'ꙋ' => '',
+ 'Ѡ' => '',
+ 'ѡ' => '',
+ 'Ѿ' => '',
+ 'ѿ' => '',
+ 'Ѫ' => '',
+ 'ѫ' => '',
+ 'Ѧ' => '',
+ 'ѧ' => '',
+ 'Ѭ' => '',
+ 'ѭ' => '',
+ 'Ѩ' => '',
+ 'ѩ' => '',
+ 'Ѯ' => '',
+ 'ѯ' => '',
+ 'Ѱ' => '',
+ 'ѱ' => '',
+ ],
+ // Ukrainian
+ 'uk' => [
+ 'Є' => 'Ye',
+ 'є' => 'ye',
+ 'І' => 'I',
+ 'і' => 'i',
+ 'Ї' => 'Yi',
+ 'ї' => 'yi',
+ 'Ґ' => 'G',
+ 'ґ' => 'g',
+ ],
+ // Kazakh
+ 'kk' => [
+ 'Ә' => 'A',
+ 'Ғ' => 'G',
+ 'Қ' => 'Q',
+ 'Ң' => 'N',
+ 'Ө' => 'O',
+ 'Ұ' => 'U',
+ 'Ү' => 'U',
+ 'Һ' => 'H',
+ 'ә' => 'a',
+ 'ғ' => 'g',
+ 'қ' => 'q',
+ 'ң' => 'n',
+ 'ө' => 'o',
+ 'ұ' => 'u',
+ 'ү' => 'u',
+ 'һ' => 'h',
+ ],
+ // Czech
+ 'cs' => [
+ 'á' => 'a',
+ 'Á' => 'A',
+ 'č' => 'c',
+ 'Č' => 'C',
+ 'ď' => 'd',
+ 'Ď' => 'D',
+ 'é' => 'e',
+ 'É' => 'E',
+ 'ě' => 'e',
+ 'Ě' => 'E',
+ 'í' => 'i',
+ 'Í' => 'I',
+ 'ň' => 'n',
+ 'Ň' => 'N',
+ 'ó' => 'o',
+ 'Ó' => 'O',
+ 'ř' => 'r',
+ 'Ř' => 'R',
+ 'š' => 's',
+ 'Š' => 'S',
+ 'ť' => 't',
+ 'Ť' => 'T',
+ 'ú' => 'u',
+ 'Ú' => 'U',
+ 'ů' => 'u',
+ 'Ů' => 'U',
+ 'ý' => 'y',
+ 'Ý' => 'Y',
+ 'ž' => 'z',
+ 'Ž' => 'Z',
+ ],
+ // Danish
+ 'da' => [
+ 'Æ' => 'Ae',
+ 'æ' => 'ae',
+ 'Ø' => 'Oe',
+ 'ø' => 'oe',
+ 'Å' => 'Aa',
+ 'å' => 'aa',
+ 'É' => 'E',
+ 'é' => 'e',
+ ],
+ // Polish
+ 'pl' => [
+ 'ą' => 'a',
+ 'ć' => 'c',
+ 'ę' => 'e',
+ 'ł' => 'l',
+ 'ń' => 'n',
+ 'ó' => 'o',
+ 'ś' => 's',
+ 'ź' => 'z',
+ 'ż' => 'z',
+ 'Ą' => 'A',
+ 'Ć' => 'C',
+ 'Ę' => 'E',
+ 'Ł' => 'L',
+ 'Ń' => 'N',
+ 'Ó' => 'O',
+ 'Ś' => 'S',
+ 'Ź' => 'Z',
+ 'Ż' => 'Z',
+ ],
+ // Romanian
+ 'ro' => [
+ 'ă' => 'a',
+ 'â' => 'a',
+ 'Ă' => 'A',
+ 'Â' => 'A',
+ 'î' => 'i',
+ 'Î' => 'I',
+ 'ș' => 's',
+ 'ş' => 's',
+ 'Ş' => 'S',
+ 'Ș' => 'S',
+ 'ț' => 't',
+ 'ţ' => 't',
+ 'Ţ' => 'T',
+ 'Ț' => 'T',
+ ],
+ // Esperanto
+ 'eo' => [
+ 'ĉ' => 'cx',
+ 'ĝ' => 'gx',
+ 'ĥ' => 'hx',
+ 'ĵ' => 'jx',
+ 'ŝ' => 'sx',
+ 'ŭ' => 'ux',
+ 'Ĉ' => 'CX',
+ 'Ĝ' => 'GX',
+ 'Ĥ' => 'HX',
+ 'Ĵ' => 'JX',
+ 'Ŝ' => 'SX',
+ 'Ŭ' => 'UX',
+ ],
+ // Estonian
+ 'et' => [
+ 'Š' => 'S',
+ 'Ž' => 'Z',
+ 'Õ' => 'O',
+ 'Ä' => 'A',
+ 'Ö' => 'O',
+ 'Ü' => 'U',
+ 'š' => 's',
+ 'ž' => 'z',
+ 'õ' => 'o',
+ 'ä' => 'a',
+ 'ö' => 'o',
+ 'ü' => 'u',
+ ],
+ // Latvian
+ 'lv' => [
+ 'ā' => 'a',
+ 'č' => 'c',
+ 'ē' => 'e',
+ 'ģ' => 'g',
+ 'ī' => 'i',
+ 'ķ' => 'k',
+ 'ļ' => 'l',
+ 'ņ' => 'n',
+ 'š' => 's',
+ 'ū' => 'u',
+ 'ž' => 'z',
+ 'Ā' => 'A',
+ 'Č' => 'C',
+ 'Ē' => 'E',
+ 'Ģ' => 'G',
+ 'Ī' => 'i',
+ 'Ķ' => 'k',
+ 'Ļ' => 'L',
+ 'Ņ' => 'N',
+ 'Š' => 'S',
+ 'Ū' => 'u',
+ 'Ž' => 'Z',
+ ],
+ // Lithuanian
+ 'lt' => [
+ 'ą' => 'a',
+ 'č' => 'c',
+ 'ę' => 'e',
+ 'ė' => 'e',
+ 'į' => 'i',
+ 'š' => 's',
+ 'ų' => 'u',
+ 'ū' => 'u',
+ 'ž' => 'z',
+ 'Ą' => 'A',
+ 'Č' => 'C',
+ 'Ę' => 'E',
+ 'Ė' => 'E',
+ 'Į' => 'I',
+ 'Š' => 'S',
+ 'Ų' => 'U',
+ 'Ū' => 'U',
+ 'Ž' => 'Z',
+ ],
+ // Norwegian
+ 'no' => [
+ 'Æ' => 'AE',
+ 'æ' => 'ae',
+ 'Ø' => 'OE',
+ 'ø' => 'oe',
+ 'Å' => 'AA',
+ 'å' => 'aa',
+ ],
+ // Vietnamese
+ 'vi' => [
+ 'Á' => 'A',
+ 'À' => 'A',
+ 'Ả' => 'A',
+ 'Ã' => 'A',
+ 'Ạ' => 'A',
+ 'Ă' => 'A',
+ 'Ắ' => 'A',
+ 'Ằ' => 'A',
+ 'Ẳ' => 'A',
+ 'Ẵ' => 'A',
+ 'Ặ' => 'A',
+ 'Â' => 'A',
+ 'Ấ' => 'A',
+ 'Ầ' => 'A',
+ 'Ẩ' => 'A',
+ 'Ẫ' => 'A',
+ 'Ậ' => 'A',
+ 'á' => 'a',
+ 'à' => 'a',
+ 'ả' => 'a',
+ 'ã' => 'a',
+ 'ạ' => 'a',
+ 'ă' => 'a',
+ 'ắ' => 'a',
+ 'ằ' => 'a',
+ 'ẳ' => 'a',
+ 'ẵ' => 'a',
+ 'ặ' => 'a',
+ 'â' => 'a',
+ 'ấ' => 'a',
+ 'ầ' => 'a',
+ 'ẩ' => 'a',
+ 'ẫ' => 'a',
+ 'ậ' => 'a',
+ 'É' => 'E',
+ 'È' => 'E',
+ 'Ẻ' => 'E',
+ 'Ẽ' => 'E',
+ 'Ẹ' => 'E',
+ 'Ê' => 'E',
+ 'Ế' => 'E',
+ 'Ề' => 'E',
+ 'Ể' => 'E',
+ 'Ễ' => 'E',
+ 'Ệ' => 'E',
+ 'é' => 'e',
+ 'è' => 'e',
+ 'ẻ' => 'e',
+ 'ẽ' => 'e',
+ 'ẹ' => 'e',
+ 'ê' => 'e',
+ 'ế' => 'e',
+ 'ề' => 'e',
+ 'ể' => 'e',
+ 'ễ' => 'e',
+ 'ệ' => 'e',
+ 'Í' => 'I',
+ 'Ì' => 'I',
+ 'Ỉ' => 'I',
+ 'Ĩ' => 'I',
+ 'Ị' => 'I',
+ 'í' => 'i',
+ 'ì' => 'i',
+ 'ỉ' => 'i',
+ 'ĩ' => 'i',
+ 'ị' => 'i',
+ 'Ó' => 'O',
+ 'Ò' => 'O',
+ 'Ỏ' => 'O',
+ 'Õ' => 'O',
+ 'Ọ' => 'O',
+ 'Ô' => 'O',
+ 'Ố' => 'O',
+ 'Ồ' => 'O',
+ 'Ổ' => 'O',
+ 'Ỗ' => 'O',
+ 'Ộ' => 'O',
+ 'Ơ' => 'O',
+ 'Ớ' => 'O',
+ 'Ờ' => 'O',
+ 'Ở' => 'O',
+ 'Ỡ' => 'O',
+ 'Ợ' => 'O',
+ 'ó' => 'o',
+ 'ò' => 'o',
+ 'ỏ' => 'o',
+ 'õ' => 'o',
+ 'ọ' => 'o',
+ 'ô' => 'o',
+ 'ố' => 'o',
+ 'ồ' => 'o',
+ 'ổ' => 'o',
+ 'ỗ' => 'o',
+ 'ộ' => 'o',
+ 'ơ' => 'o',
+ 'ớ' => 'o',
+ 'ờ' => 'o',
+ 'ở' => 'o',
+ 'ỡ' => 'o',
+ 'ợ' => 'o',
+ 'Ú' => 'U',
+ 'Ù' => 'U',
+ 'Ủ' => 'U',
+ 'Ũ' => 'U',
+ 'Ụ' => 'U',
+ 'Ư' => 'U',
+ 'Ứ' => 'U',
+ 'Ừ' => 'U',
+ 'Ử' => 'U',
+ 'Ữ' => 'U',
+ 'Ự' => 'U',
+ 'ú' => 'u',
+ 'ù' => 'u',
+ 'ủ' => 'u',
+ 'ũ' => 'u',
+ 'ụ' => 'u',
+ 'ư' => 'u',
+ 'ứ' => 'u',
+ 'ừ' => 'u',
+ 'ử' => 'u',
+ 'ữ' => 'u',
+ 'ự' => 'u',
+ 'Ý' => 'Y',
+ 'Ỳ' => 'Y',
+ 'Ỷ' => 'Y',
+ 'Ỹ' => 'Y',
+ 'Ỵ' => 'Y',
+ 'ý' => 'y',
+ 'ỳ' => 'y',
+ 'ỷ' => 'y',
+ 'ỹ' => 'y',
+ 'ỵ' => 'y',
+ 'Đ' => 'D',
+ 'đ' => 'd',
+ ],
+ // Persian (Farsi)
+ 'fa' => [
+ 'ا' => 'a',
+ 'ب' => 'b',
+ 'پ' => 'b',
+ 'ت' => 't',
+ 'ث' => 's',
+ 'ج' => 'g',
+ 'چ' => 'ch',
+ 'ح' => 'h',
+ 'خ' => 'kh',
+ 'د' => 'd',
+ 'ذ' => 'z',
+ 'ر' => 'r',
+ 'ز' => 'z',
+ 'س' => 's',
+ 'ش' => 'sh',
+ 'ص' => 's',
+ 'ض' => 'z',
+ 'ط' => 't',
+ 'ظ' => 'z',
+ 'ع' => 'a',
+ 'غ' => 'gh',
+ 'ف' => 'f',
+ 'ق' => 'gh',
+ 'ک' => 'k',
+ 'گ' => 'g',
+ 'ل' => 'l',
+ 'ژ' => 'zh',
+ 'ك' => 'k',
+ 'م' => 'm',
+ 'ن' => 'n',
+ 'ه' => 'h',
+ 'و' => 'o',
+ 'ی' => 'y',
+ 'آ' => 'a',
+ '٠' => '0',
+ '١' => '1',
+ '٢' => '2',
+ '٣' => '3',
+ '٤' => '4',
+ '٥' => '5',
+ '٦' => '6',
+ '٧' => '7',
+ '٨' => '8',
+ '٩' => '9',
+ ],
+ // Arabic
+ 'ar' => [
+ 'أ' => 'a',
+ 'ب' => 'b',
+ 'ت' => 't',
+ 'ث' => 'th',
+ 'ج' => 'g',
+ 'ح' => 'h',
+ 'خ' => 'kh',
+ 'د' => 'd',
+ 'ذ' => 'th',
+ 'ر' => 'r',
+ 'ز' => 'z',
+ 'س' => 's',
+ 'ش' => 'sh',
+ 'ص' => 's',
+ 'ض' => 'd',
+ 'ط' => 't',
+ 'ظ' => 'th',
+ 'ع' => 'aa',
+ 'غ' => 'gh',
+ 'ف' => 'f',
+ 'ق' => 'k',
+ 'ك' => 'k',
+ 'ل' => 'l',
+ 'م' => 'm',
+ 'ن' => 'n',
+ 'ه' => 'h',
+ 'و' => 'o',
+ 'ي' => 'y',
+ 'ا' => 'a',
+ 'إ' => 'a',
+ 'آ' => 'a',
+ 'ؤ' => 'o',
+ 'ئ' => 'y',
+ 'ء' => 'aa',
+ '٠' => '0',
+ '١' => '1',
+ '٢' => '2',
+ '٣' => '3',
+ '٤' => '4',
+ '٥' => '5',
+ '٦' => '6',
+ '٧' => '7',
+ '٨' => '8',
+ '٩' => '9',
+ ],
+ // Serbian
+ 'sr' => [
+ 'đ' => 'dj',
+ 'ž' => 'z',
+ 'ć' => 'c',
+ 'č' => 'c',
+ 'š' => 's',
+ 'Đ' => 'Dj',
+ 'Ž' => 'Z',
+ 'Ć' => 'C',
+ 'Č' => 'C',
+ 'Š' => 'S',
+ 'а' => 'a',
+ 'б' => 'b',
+ 'в' => 'v',
+ 'г' => 'g',
+ 'д' => 'd',
+ 'ђ' => 'dj',
+ 'е' => 'e',
+ 'ж' => 'z',
+ 'з' => 'z',
+ 'и' => 'i',
+ 'ј' => 'j',
+ 'к' => 'k',
+ 'л' => 'l',
+ 'љ' => 'lj',
+ 'м' => 'm',
+ 'н' => 'n',
+ 'њ' => 'nj',
+ 'о' => 'o',
+ 'п' => 'p',
+ 'р' => 'r',
+ 'с' => 's',
+ 'т' => 't',
+ 'ћ' => 'c',
+ 'у' => 'u',
+ 'ф' => 'f',
+ 'х' => 'h',
+ 'ц' => 'c',
+ 'ч' => 'c',
+ 'џ' => 'dz',
+ 'ш' => 's',
+ 'А' => 'A',
+ 'Б' => 'B',
+ 'В' => 'V',
+ 'Г' => 'G',
+ 'Д' => 'D',
+ 'Ђ' => 'Dj',
+ 'Е' => 'E',
+ 'Ж' => 'Z',
+ 'З' => 'Z',
+ 'И' => 'I',
+ 'Ј' => 'j',
+ 'К' => 'K',
+ 'Л' => 'L',
+ 'Љ' => 'Lj',
+ 'М' => 'M',
+ 'Н' => 'N',
+ 'Њ' => 'Nj',
+ 'О' => 'O',
+ 'П' => 'P',
+ 'Р' => 'R',
+ 'С' => 'S',
+ 'Т' => 'T',
+ 'Ћ' => 'C',
+ 'У' => 'U',
+ 'Ф' => 'F',
+ 'Х' => 'H',
+ 'Ц' => 'C',
+ 'Ч' => 'C',
+ 'Џ' => 'Dz',
+ 'Ш' => 'S',
+ ],
+ // Serbian - Cyrillic
+ 'sr__cyr' => [
+ 'а' => 'a',
+ 'б' => 'b',
+ 'в' => 'v',
+ 'г' => 'g',
+ 'д' => 'd',
+ 'ђ' => 'dj',
+ 'е' => 'e',
+ 'ж' => 'z',
+ 'з' => 'z',
+ 'и' => 'i',
+ 'ј' => 'j',
+ 'к' => 'k',
+ 'л' => 'l',
+ 'љ' => 'lj',
+ 'м' => 'm',
+ 'н' => 'n',
+ 'њ' => 'nj',
+ 'о' => 'o',
+ 'п' => 'p',
+ 'р' => 'r',
+ 'с' => 's',
+ 'т' => 't',
+ 'ћ' => 'c',
+ 'у' => 'u',
+ 'ф' => 'f',
+ 'х' => 'h',
+ 'ц' => 'c',
+ 'ч' => 'c',
+ 'џ' => 'dz',
+ 'ш' => 's',
+ 'А' => 'A',
+ 'Б' => 'B',
+ 'В' => 'V',
+ 'Г' => 'G',
+ 'Д' => 'D',
+ 'Ђ' => 'Dj',
+ 'Е' => 'E',
+ 'Ж' => 'Z',
+ 'З' => 'Z',
+ 'И' => 'I',
+ 'Ј' => 'j',
+ 'К' => 'K',
+ 'Л' => 'L',
+ 'Љ' => 'Lj',
+ 'М' => 'M',
+ 'Н' => 'N',
+ 'Њ' => 'Nj',
+ 'О' => 'O',
+ 'П' => 'P',
+ 'Р' => 'R',
+ 'С' => 'S',
+ 'Т' => 'T',
+ 'Ћ' => 'C',
+ 'У' => 'U',
+ 'Ф' => 'F',
+ 'Х' => 'H',
+ 'Ц' => 'C',
+ 'Ч' => 'C',
+ 'Џ' => 'Dz',
+ 'Ш' => 'S',
+ ],
+ // Serbian - Latin
+ 'sr__lat' => [
+ 'đ' => 'dj',
+ 'ž' => 'z',
+ 'ć' => 'c',
+ 'č' => 'c',
+ 'š' => 's',
+ 'Đ' => 'Dj',
+ 'Ž' => 'Z',
+ 'Ć' => 'C',
+ 'Č' => 'C',
+ 'Š' => 'S',
+ ],
+ // Azerbaijani
+ 'az' => [
+ 'ç' => 'c',
+ 'ə' => 'e',
+ 'ğ' => 'g',
+ 'ı' => 'i',
+ 'ö' => 'o',
+ 'ş' => 's',
+ 'ü' => 'u',
+ 'Ç' => 'C',
+ 'Ə' => 'E',
+ 'Ğ' => 'G',
+ 'İ' => 'I',
+ 'Ö' => 'O',
+ 'Ş' => 'S',
+ 'Ü' => 'U',
+ ],
+ // Slovak
+ 'sk' => [
+ 'á' => 'a',
+ 'ä' => 'a',
+ 'č' => 'c',
+ 'ď' => 'd',
+ 'é' => 'e',
+ 'í' => 'i',
+ 'ľ' => 'l',
+ 'ĺ' => 'l',
+ 'ň' => 'n',
+ 'ó' => 'o',
+ 'ô' => 'o',
+ 'ŕ' => 'r',
+ 'š' => 's',
+ 'ť' => 't',
+ 'ú' => 'u',
+ 'ý' => 'y',
+ 'ž' => 'z',
+ 'Á' => 'A',
+ 'Ä' => 'A',
+ 'Č' => 'C',
+ 'Ď' => 'D',
+ 'É' => 'E',
+ 'Í' => 'I',
+ 'Ľ' => 'L',
+ 'Ĺ' => 'L',
+ 'Ň' => 'N',
+ 'Ó' => 'O',
+ 'Ô' => 'O',
+ 'Ŕ' => 'R',
+ 'Š' => 'S',
+ 'Ť' => 'T',
+ 'Ú' => 'U',
+ 'Ý' => 'Y',
+ 'Ž' => 'Z',
+ ],
+ // French
+ 'fr' => [
+ 'Æ' => 'AE',
+ 'æ' => 'ae',
+ 'Œ' => 'OE',
+ 'œ' => 'oe',
+ 'â' => 'a',
+ 'Â' => 'A',
+ 'à' => 'a',
+ 'À' => 'A',
+ 'ä' => 'a',
+ 'Ä' => 'A',
+ 'ç' => 'c',
+ 'Ç' => 'C',
+ 'é' => 'e',
+ 'É' => 'E',
+ 'ê' => 'e',
+ 'Ê' => 'E',
+ 'ë' => 'e',
+ 'Ë' => 'E',
+ 'è' => 'e',
+ 'È' => 'E',
+ 'ï' => 'i',
+ 'î' => 'i',
+ 'Ï' => 'I',
+ 'Î' => 'I',
+ 'ÿ' => 'y',
+ 'Ÿ' => 'Y',
+ 'ô' => 'o',
+ 'Ô' => 'O',
+ 'ö' => 'o',
+ 'Ö' => 'O',
+ 'û' => 'u',
+ 'Û' => 'U',
+ 'ù' => 'u',
+ 'Ù' => 'U',
+ 'ü' => 'u',
+ 'Ü' => 'U',
+ ],
+ // Austrian (French)
+ 'fr_at' => [
+ 'ß' => 'sz',
+ 'ẞ' => 'SZ',
+ 'Æ' => 'AE',
+ 'æ' => 'ae',
+ 'Œ' => 'OE',
+ 'œ' => 'oe',
+ 'â' => 'a',
+ 'Â' => 'A',
+ 'à' => 'a',
+ 'À' => 'A',
+ 'ä' => 'a',
+ 'Ä' => 'A',
+ 'ç' => 'c',
+ 'Ç' => 'C',
+ 'é' => 'e',
+ 'É' => 'E',
+ 'ê' => 'e',
+ 'Ê' => 'E',
+ 'ë' => 'e',
+ 'Ë' => 'E',
+ 'è' => 'e',
+ 'È' => 'E',
+ 'ï' => 'i',
+ 'î' => 'i',
+ 'Ï' => 'I',
+ 'Î' => 'I',
+ 'ÿ' => 'y',
+ 'Ÿ' => 'Y',
+ 'ô' => 'o',
+ 'Ô' => 'O',
+ 'ö' => 'o',
+ 'Ö' => 'O',
+ 'û' => 'u',
+ 'Û' => 'U',
+ 'ù' => 'u',
+ 'Ù' => 'U',
+ 'ü' => 'u',
+ 'Ü' => 'U',
+ ],
+ // Switzerland (French)
+ 'fr_ch' => [
+ 'ß' => 'ss',
+ 'ẞ' => 'SS',
+ 'Æ' => 'AE',
+ 'æ' => 'ae',
+ 'Œ' => 'OE',
+ 'œ' => 'oe',
+ 'â' => 'a',
+ 'Â' => 'A',
+ 'à' => 'a',
+ 'À' => 'A',
+ 'ä' => 'a',
+ 'Ä' => 'A',
+ 'ç' => 'c',
+ 'Ç' => 'C',
+ 'é' => 'e',
+ 'É' => 'E',
+ 'ê' => 'e',
+ 'Ê' => 'E',
+ 'ë' => 'e',
+ 'Ë' => 'E',
+ 'è' => 'e',
+ 'È' => 'E',
+ 'ï' => 'i',
+ 'î' => 'i',
+ 'Ï' => 'I',
+ 'Î' => 'I',
+ 'ÿ' => 'y',
+ 'Ÿ' => 'Y',
+ 'ô' => 'o',
+ 'Ô' => 'O',
+ 'ö' => 'o',
+ 'Ö' => 'O',
+ 'û' => 'u',
+ 'Û' => 'U',
+ 'ù' => 'u',
+ 'Ù' => 'U',
+ 'ü' => 'u',
+ 'Ü' => 'U',
+ ],
+ // German
+ 'de' => [
+ 'Ä' => 'Ae',
+ 'Ö' => 'Oe',
+ 'Ü' => 'Ue',
+ 'ä' => 'ae',
+ 'ö' => 'oe',
+ 'ü' => 'ue',
+ 'ß' => 'ss',
+ 'ẞ' => 'SS',
+ ],
+ // Austrian (German)
+ 'de_at' => [
+ 'Ä' => 'Ae',
+ 'Ö' => 'Oe',
+ 'Ü' => 'Ue',
+ 'ä' => 'ae',
+ 'ö' => 'oe',
+ 'ü' => 'ue',
+ 'ß' => 'sz',
+ 'ẞ' => 'SZ',
+ ],
+ // Switzerland (German)
+ 'de_ch' => [
+ 'Ä' => 'Ae',
+ 'Ö' => 'Oe',
+ 'Ü' => 'Ue',
+ 'ä' => 'ae',
+ 'ö' => 'oe',
+ 'ü' => 'ue',
+ 'ß' => 'ss',
+ 'ẞ' => 'SS',
+ ],
+ // Bengali (Bangla)
+ 'bn' => [
+ 'ভ্ল' => 'vl',
+ 'পশ' => 'psh',
+ 'ব্ধ' => 'bdh',
+ 'ব্জ' => 'bj',
+ 'ব্দ' => 'bd',
+ 'ব্ব' => 'bb',
+ 'ব্ল' => 'bl',
+ 'ভ' => 'v',
+ 'ব' => 'b',
+ 'চ্ঞ' => 'cNG',
+ 'চ্ছ' => 'cch',
+ 'চ্চ' => 'cc',
+ 'ছ' => 'ch',
+ 'চ' => 'c',
+ 'ধ্ন' => 'dhn',
+ 'ধ্ম' => 'dhm',
+ 'দ্ঘ' => 'dgh',
+ 'দ্ধ' => 'ddh',
+ 'দ্ভ' => 'dv',
+ 'দ্ম' => 'dm',
+ 'ড্ড' => 'DD',
+ 'ঢ' => 'Dh',
+ 'ধ' => 'dh',
+ 'দ্গ' => 'dg',
+ 'দ্দ' => 'dd',
+ 'ড' => 'D',
+ 'দ' => 'd',
+ '।' => '.',
+ 'ঘ্ন' => 'Ghn',
+ 'গ্ধ' => 'Gdh',
+ 'গ্ণ' => 'GN',
+ 'গ্ন' => 'Gn',
+ 'গ্ম' => 'Gm',
+ 'গ্ল' => 'Gl',
+ 'জ্ঞ' => 'jNG',
+ 'ঘ' => 'Gh',
+ 'গ' => 'g',
+ 'হ্ণ' => 'hN',
+ 'হ্ন' => 'hn',
+ 'হ্ম' => 'hm',
+ 'হ্ল' => 'hl',
+ 'হ' => 'h',
+ 'জ্ঝ' => 'jjh',
+ 'ঝ' => 'jh',
+ 'জ্জ' => 'jj',
+ 'জ' => 'j',
+ 'ক্ষ্ণ' => 'kxN',
+ 'ক্ষ্ম' => 'kxm',
+ 'ক্ষ' => 'ksh',
+ 'কশ' => 'ksh',
+ 'ক্ক' => 'kk',
+ 'ক্ট' => 'kT',
+ 'ক্ত' => 'kt',
+ 'ক্ল' => 'kl',
+ 'ক্স' => 'ks',
+ 'খ' => 'kh',
+ 'ক' => 'k',
+ 'ল্ভ' => 'lv',
+ 'ল্ধ' => 'ldh',
+ 'লখ' => 'lkh',
+ 'লঘ' => 'lgh',
+ 'লফ' => 'lph',
+ 'ল্ক' => 'lk',
+ 'ল্গ' => 'lg',
+ 'ল্ট' => 'lT',
+ 'ল্ড' => 'lD',
+ 'ল্প' => 'lp',
+ 'ল্ম' => 'lm',
+ 'ল্ল' => 'll',
+ 'ল্ব' => 'lb',
+ 'ল' => 'l',
+ 'ম্থ' => 'mth',
+ 'ম্ফ' => 'mf',
+ 'ম্ভ' => 'mv',
+ 'মপ্ল' => 'mpl',
+ 'ম্ন' => 'mn',
+ 'ম্প' => 'mp',
+ 'ম্ম' => 'mm',
+ 'ম্ল' => 'ml',
+ 'ম্ব' => 'mb',
+ 'ম' => 'm',
+ '০' => '0',
+ '১' => '1',
+ '২' => '2',
+ '৩' => '3',
+ '৪' => '4',
+ '৫' => '5',
+ '৬' => '6',
+ '৭' => '7',
+ '৮' => '8',
+ '৯' => '9',
+ 'ঙ্ক্ষ' => 'Ngkx',
+ 'ঞ্ছ' => 'nch',
+ 'ঙ্ঘ' => 'ngh',
+ 'ঙ্খ' => 'nkh',
+ 'ঞ্ঝ' => 'njh',
+ 'ঙ্গৌ' => 'ngOU',
+ 'ঙ্গৈ' => 'ngOI',
+ 'ঞ্চ' => 'nc',
+ 'ঙ্ক' => 'nk',
+ 'ঙ্ষ' => 'Ngx',
+ 'ঙ্গ' => 'ngo',
+ 'ঙ্ম' => 'Ngm',
+ 'ঞ্জ' => 'nj',
+ 'ন্ধ' => 'ndh',
+ 'ন্ঠ' => 'nTh',
+ 'ণ্ঠ' => 'NTh',
+ 'ন্থ' => 'nth',
+ 'ঙ্গা' => 'nga',
+ 'ঙ্গি' => 'ngi',
+ 'ঙ্গী' => 'ngI',
+ 'ঙ্গু' => 'ngu',
+ 'ঙ্গূ' => 'ngU',
+ 'ঙ্গে' => 'nge',
+ 'ঙ্গো' => 'ngO',
+ 'ণ্ঢ' => 'NDh',
+ 'নশ' => 'nsh',
+ 'ঙর' => 'Ngr',
+ 'ঞর' => 'NGr',
+ 'ংর' => 'ngr',
+ 'ঙ' => 'Ng',
+ 'ঞ' => 'NG',
+ 'ং' => 'ng',
+ 'ন্ন' => 'nn',
+ 'ণ্ণ' => 'NN',
+ 'ণ্ন' => 'Nn',
+ 'ন্ম' => 'nm',
+ 'ণ্ম' => 'Nm',
+ 'ন্দ' => 'nd',
+ 'ন্ট' => 'nT',
+ 'ণ্ট' => 'NT',
+ 'ন্ড' => 'nD',
+ 'ণ্ড' => 'ND',
+ 'ন্ত' => 'nt',
+ 'ন্স' => 'ns',
+ 'ন' => 'n',
+ 'ণ' => 'N',
+ 'ৈ' => 'OI',
+ 'ৌ' => 'OU',
+ 'ো' => 'O',
+ 'ঐ' => 'OI',
+ 'ঔ' => 'OU',
+ 'অ' => 'o',
+ 'ও' => 'oo',
+ 'ফ্ল' => 'fl',
+ 'প্ট' => 'pT',
+ 'প্ত' => 'pt',
+ 'প্ন' => 'pn',
+ 'প্প' => 'pp',
+ 'প্ল' => 'pl',
+ 'প্স' => 'ps',
+ 'ফ' => 'f',
+ 'প' => 'p',
+ 'ৃ' => 'rri',
+ 'ঋ' => 'rri',
+ 'রর‍্য' => 'rry',
+ '্র্য' => 'ry',
+ '্রর' => 'rr',
+ 'ড়্গ' => 'Rg',
+ 'ঢ়' => 'Rh',
+ 'ড়' => 'R',
+ 'র' => 'r',
+ '্র' => 'r',
+ 'শ্ছ' => 'Sch',
+ 'ষ্ঠ' => 'ShTh',
+ 'ষ্ফ' => 'Shf',
+ 'স্ক্ল' => 'skl',
+ 'স্খ' => 'skh',
+ 'স্থ' => 'sth',
+ 'স্ফ' => 'sf',
+ 'শ্চ' => 'Sc',
+ 'শ্ত' => 'St',
+ 'শ্ন' => 'Sn',
+ 'শ্ম' => 'Sm',
+ 'শ্ল' => 'Sl',
+ 'ষ্ক' => 'Shk',
+ 'ষ্ট' => 'ShT',
+ 'ষ্ণ' => 'ShN',
+ 'ষ্প' => 'Shp',
+ 'ষ্ম' => 'Shm',
+ 'স্প্ল' => 'spl',
+ 'স্ক' => 'sk',
+ 'স্ট' => 'sT',
+ 'স্ত' => 'st',
+ 'স্ন' => 'sn',
+ 'স্প' => 'sp',
+ 'স্ম' => 'sm',
+ 'স্ল' => 'sl',
+ 'শ' => 'S',
+ 'ষ' => 'Sh',
+ 'স' => 's',
+ 'ু' => 'u',
+ 'উ' => 'u',
+ 'অ্য' => 'oZ',
+ 'ত্থ' => 'tth',
+ 'ৎ' => 'tt',
+ 'ট্ট' => 'TT',
+ 'ট্ম' => 'Tm',
+ 'ঠ' => 'Th',
+ 'ত্ন' => 'tn',
+ 'ত্ম' => 'tm',
+ 'থ' => 'th',
+ 'ত্ত' => 'tt',
+ 'ট' => 'T',
+ 'ত' => 't',
+ 'অ্যা' => 'AZ',
+ 'া' => 'a',
+ 'আ' => 'a',
+ 'য়া' => 'ya',
+ 'য়' => 'y',
+ 'ি' => 'i',
+ 'ই' => 'i',
+ 'ী' => 'ee',
+ 'ঈ' => 'ee',
+ 'ূ' => 'uu',
+ 'ঊ' => 'uu',
+ 'ে' => 'e',
+ 'এ' => 'e',
+ 'য' => 'z',
+ '্য' => 'Z',
+ 'ইয়' => 'y',
+ 'ওয়' => 'w',
+ '্ব' => 'w',
+ 'এক্স' => 'x',
+ 'ঃ' => ':',
+ 'ঁ' => 'nn',
+ '্‌' => '',
+ ],
+ // English
+ 'en' => [
+ ],
+ // Latin (+ Cyrillic ?) chars
+ //
+ // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior.
+ 'latin' => [
+ '˚' => '0',
+ '¹' => '1',
+ '²' => '2',
+ '³' => '3',
+ '⁴' => '4',
+ '⁵' => '5',
+ '⁶' => '6',
+ '⁷' => '7',
+ '⁸' => '8',
+ '⁹' => '9',
+ '₀' => '0',
+ '₁' => '1',
+ '₂' => '2',
+ '₃' => '3',
+ '₄' => '4',
+ '₅' => '5',
+ '₆' => '6',
+ '₇' => '7',
+ '₈' => '8',
+ '₉' => '9',
+ '௦' => '0',
+ '௧' => '1',
+ '௨' => '2',
+ '௩' => '3',
+ '௪' => '4',
+ '௫' => '5',
+ '௬' => '6',
+ '௭' => '7',
+ '௮' => '8',
+ '௯' => '9',
+ '௰' => '10',
+ '௱' => '100',
+ '௲' => '1000',
+ 'Ꜳ' => 'AA',
+ 'ꜳ' => 'aa',
+ 'Æ' => 'AE',
+ 'æ' => 'ae',
+ 'Ǽ' => 'AE',
+ 'ǽ' => 'ae',
+ 'Ꜵ' => 'AO',
+ 'ꜵ' => 'ao',
+ 'Ꜷ' => 'AU',
+ 'ꜷ' => 'au',
+ 'Ꜹ' => 'AV',
+ 'ꜹ' => 'av',
+ 'Ꜻ' => 'av',
+ 'ꜻ' => 'av',
+ 'Ꜽ' => 'AY',
+ 'ꜽ' => 'ay',
+ 'ȸ' => 'db',
+ 'ʣ' => 'dz',
+ 'ʥ' => 'dz',
+ 'ʤ' => 'dezh',
+ '🙰' => 'et',
+ 'ff' => 'ff',
+ 'ffi' => 'ffi',
+ 'ffl' => 'ffl',
+ 'fi' => 'fi',
+ 'fl' => 'fl',
+ 'ʩ' => 'feng',
+ 'IJ' => 'IJ',
+ 'ij' => 'ij',
+ 'ʪ' => 'ls',
+ 'ʫ' => 'lz',
+ 'ɮ' => 'lezh',
+ 'ȹ' => 'qp',
+ 'ʨ' => 'tc',
+ 'ʦ' => 'ts',
+ 'ʧ' => 'tesh',
+ 'Œ' => 'OE',
+ 'œ' => 'oe',
+ 'Ꝏ' => 'OO',
+ 'ꝏ' => 'oo',
+ 'ẞ' => 'SS',
+ 'ß' => 'ss',
+ 'st' => 'st',
+ 'ſt' => 'st',
+ 'Ꜩ' => 'TZ',
+ 'ꜩ' => 'tz',
+ 'ᵫ' => 'ue',
+ 'Aι' => 'Ai',
+ 'αι' => 'ai',
+ 'Ει' => 'Ei',
+ 'ει' => 'ei',
+ 'Οι' => 'Oi',
+ 'οι' => 'oi',
+ 'Ου' => 'Oy',
+ 'ου' => 'oy',
+ 'Υι' => 'Yi',
+ 'υι' => 'yi',
+ 'ἀ' => 'a',
+ 'ἁ' => 'a',
+ 'ἂ' => 'a',
+ 'ἃ' => 'a',
+ 'ἄ' => 'a',
+ 'ἅ' => 'a',
+ 'ἆ' => 'a',
+ 'ἇ' => 'a',
+ 'Ἀ' => 'A',
+ 'Ἁ' => 'A',
+ 'Ἂ' => 'A',
+ 'Ἃ' => 'A',
+ 'Ἄ' => 'A',
+ 'Ἅ' => 'A',
+ 'Ἆ' => 'A',
+ 'Ἇ' => 'A',
+ 'ᾰ' => 'a',
+ 'ᾱ' => 'a',
+ 'ᾲ' => 'a',
+ 'ᾳ' => 'a',
+ 'ᾴ' => 'a',
+ 'ᾶ' => 'a',
+ 'ᾷ' => 'a',
+ 'Ᾰ' => 'A',
+ 'Ᾱ' => 'A',
+ 'Ὰ' => 'A',
+ 'Ά' => 'A',
+ 'ᾼ' => 'A',
+ 'Ä' => 'A',
+ 'ä' => 'a',
+ 'À' => 'A',
+ 'à' => 'a',
+ 'Á' => 'A',
+ 'á' => 'a',
+ 'Â' => 'A',
+ 'â' => 'a',
+ 'Ã' => 'A',
+ 'ã' => 'a',
+ 'A̧' => 'A',
+ 'a̧' => 'a',
+ 'Ą' => 'A',
+ 'ą' => 'a',
+ 'Ⱥ' => 'A',
+ 'ⱥ' => 'a',
+ 'Å' => 'A',
+ 'å' => 'a',
+ 'Ǻ' => 'A',
+ 'ǻ' => 'a',
+ 'Ă' => 'A',
+ 'ă' => 'a',
+ 'Ǎ' => 'A',
+ 'ǎ' => 'a',
+ 'Ȧ' => 'A',
+ 'ȧ' => 'a',
+ 'Ạ' => 'A',
+ 'ạ' => 'a',
+ 'Ā' => 'A',
+ 'ā' => 'a',
+ 'ª' => 'a',
+ 'Ɓ' => 'B',
+ 'Ѣ' => 'E',
+ 'ѣ' => 'e',
+ 'Ç' => 'C',
+ 'ç' => 'c',
+ 'Ĉ' => 'C',
+ 'ĉ' => 'c',
+ 'C̈' => 'C',
+ 'c̈' => 'c',
+ 'C̨' => 'C',
+ 'c̨' => 'c',
+ 'Ȼ' => 'C',
+ 'ȼ' => 'c',
+ 'Č' => 'C',
+ 'č' => 'c',
+ 'Ć' => 'C',
+ 'ć' => 'c',
+ 'C̀' => 'C',
+ 'c̀' => 'c',
+ 'Ċ' => 'C',
+ 'ċ' => 'c',
+ 'C̣' => 'C',
+ 'c̣' => 'c',
+ 'C̄' => 'C',
+ 'c̄' => 'c',
+ 'C̃' => 'C',
+ 'c̃' => 'c',
+ 'Ð' => 'D',
+ 'Đ' => 'D',
+ 'ð' => 'd',
+ 'đ' => 'd',
+ 'È' => 'E',
+ 'É' => 'E',
+ 'Ê' => 'E',
+ 'Ë' => 'E',
+ 'Ĕ' => 'E',
+ 'Ė' => 'E',
+ 'Ȩ' => 'E',
+ 'ȩ' => 'e',
+ 'Ę' => 'E',
+ 'ę' => 'e',
+ 'Ɇ' => 'E',
+ 'ɇ' => 'e',
+ 'Ě' => 'E',
+ 'ě' => 'e',
+ 'Ẹ' => 'E',
+ 'ẹ' => 'e',
+ 'Ē' => 'E',
+ 'ē' => 'e',
+ 'Ẽ' => 'E',
+ 'ẽ' => 'e',
+ 'è' => 'e',
+ 'é' => 'e',
+ 'ê' => 'e',
+ 'ë' => 'e',
+ 'ĕ' => 'e',
+ 'ė' => 'e',
+ 'ƒ' => 'f',
+ 'Ѳ' => 'F',
+ 'ѳ' => 'f',
+ 'Ĝ' => 'G',
+ 'Ġ' => 'G',
+ 'ĝ' => 'g',
+ 'ġ' => 'g',
+ 'Ĥ' => 'H',
+ 'Ħ' => 'H',
+ 'ĥ' => 'h',
+ 'ħ' => 'h',
+ 'Ì' => 'I',
+ 'Í' => 'I',
+ 'Î' => 'I',
+ 'Ï' => 'I',
+ 'Ĩ' => 'I',
+ 'Ĭ' => 'I',
+ 'Ǐ' => 'I',
+ 'Į' => 'I',
+ 'ì' => 'i',
+ 'í' => 'i',
+ 'î' => 'i',
+ 'ï' => 'i',
+ 'ĩ' => 'i',
+ 'ĭ' => 'i',
+ 'ǐ' => 'i',
+ 'į' => 'i',
+ 'І' => 'I',
+ 'і' => 'i',
+ 'I̧' => 'I',
+ 'i̧' => 'i',
+ 'Ɨ' => 'I',
+ 'ɨ' => 'i',
+ 'İ' => 'I',
+ 'i' => 'i',
+ 'Ị' => 'I',
+ 'ị' => 'i',
+ 'Ī' => 'I',
+ 'ī' => 'i',
+ 'Ĵ' => 'J',
+ 'ĵ' => 'j',
+ 'J́́' => 'J',
+ 'j́' => 'j',
+ 'J̀̀' => 'J',
+ 'j̀' => 'j',
+ 'J̈' => 'J',
+ 'j̈' => 'j',
+ 'J̧' => 'J',
+ 'j̧' => 'j',
+ 'J̨' => 'J',
+ 'j̨' => 'j',
+ 'Ɉ' => 'J',
+ 'ɉ' => 'j',
+ 'J̌' => 'J',
+ 'ǰ' => 'j',
+ 'J̇' => 'J',
+ 'j' => 'j',
+ 'J̣' => 'J',
+ 'j̣' => 'j',
+ 'J̄' => 'J',
+ 'j̄' => 'j',
+ 'J̃' => 'J',
+ 'j̃' => 'j',
+ 'ĸ' => 'k',
+ 'Ĺ' => 'L',
+ 'Ľ' => 'L',
+ 'Ŀ' => 'L',
+ 'ĺ' => 'l',
+ 'ľ' => 'l',
+ 'ŀ' => 'l',
+ 'L̀' => 'L',
+ 'l̀' => 'l',
+ 'L̂' => 'L',
+ 'l̂' => 'l',
+ 'L̈' => 'L',
+ 'l̈' => 'l',
+ 'Ļ' => 'L',
+ 'ļ' => 'l',
+ 'L̨' => 'L',
+ 'l̨' => 'l',
+ 'Ł' => 'L',
+ 'ł' => 'l',
+ 'Ƚ' => 'L',
+ 'ƚ' => 'l',
+ 'L̇' => 'L',
+ 'l̇' => 'l',
+ 'Ḷ' => 'L',
+ 'ḷ' => 'l',
+ 'L̄' => 'L',
+ 'l̄' => 'l',
+ 'L̃' => 'L',
+ 'l̃' => 'l',
+ 'Ñ' => 'N',
+ 'ñ' => 'n',
+ 'Ŋ' => 'N',
+ 'ŋ' => 'n',
+ 'ʼn' => 'n',
+ 'Ń' => 'N',
+ 'ń' => 'n',
+ 'Ǹ' => 'N',
+ 'ǹ' => 'n',
+ 'N̂' => 'N',
+ 'n̂' => 'n',
+ 'N̈' => 'N',
+ 'n̈' => 'n',
+ 'Ņ' => 'N',
+ 'ņ' => 'n',
+ 'N̨' => 'N',
+ 'n̨' => 'n',
+ 'Ꞥ' => 'N',
+ 'ꞥ' => 'n',
+ 'Ň' => 'N',
+ 'ň' => 'n',
+ 'Ṅ' => 'N',
+ 'ṅ' => 'n',
+ 'Ṇ' => 'N',
+ 'ṇ' => 'n',
+ 'N̄' => 'N',
+ 'n̄' => 'n',
+ 'Ö' => 'O',
+ 'Ò' => 'O',
+ 'Ó' => 'O',
+ 'Ô' => 'O',
+ 'Õ' => 'O',
+ 'Ō' => 'O',
+ 'Ŏ' => 'O',
+ 'Ǒ' => 'O',
+ 'Ő' => 'O',
+ 'Ơ' => 'O',
+ 'Ø' => 'O',
+ 'Ǿ' => 'O',
+ 'ö' => 'o',
+ 'ò' => 'o',
+ 'ó' => 'o',
+ 'ô' => 'o',
+ 'õ' => 'o',
+ 'ō' => 'o',
+ 'ŏ' => 'o',
+ 'ǒ' => 'o',
+ 'ő' => 'o',
+ 'ơ' => 'o',
+ 'ø' => 'o',
+ 'ǿ' => 'o',
+ 'º' => 'o',
+ 'O̧' => 'O',
+ 'o̧' => 'o',
+ 'Ǫ' => 'O',
+ 'ǫ' => 'o',
+ 'Ɵ' => 'O',
+ 'ɵ' => 'o',
+ 'Ȯ' => 'O',
+ 'ȯ' => 'o',
+ 'Ọ' => 'O',
+ 'ọ' => 'o',
+ 'Ŕ' => 'R',
+ 'Ŗ' => 'R',
+ 'ŕ' => 'r',
+ 'ŗ' => 'r',
+ 'Ŝ' => 'S',
+ 'Ș' => 'S',
+ 'ș' => 's',
+ 'Ś' => 'S',
+ 'ś' => 's',
+ 'S̀' => 'S',
+ 's̀' => 's',
+ 'Ŝ̀' => 'S',
+ 'ŝ' => 's',
+ 'S̈' => 'S',
+ 's̈' => 's',
+ 'Ş' => 'S',
+ 'ş' => 's',
+ 'S̨' => 'S',
+ 's̨' => 's',
+ 'Ꞩ' => 'S',
+ 'ꞩ' => 's',
+ 'Š' => 'S',
+ 'š' => 's',
+ 'Ṡ' => 'S',
+ 'ṡ' => 's',
+ 'Ṣ' => 'S',
+ 'ṣ' => 's',
+ 'S̄' => 'S',
+ 's̄' => 's',
+ 'S̃' => 'S',
+ 's̃' => 's',
+ 'ſ' => 's',
+ 'Ţ' => 'T',
+ 'Ț' => 'T',
+ 'Ŧ' => 'T',
+ 'Þ' => 'TH',
+ 'ţ' => 't',
+ 'ț' => 't',
+ 'ŧ' => 't',
+ 'þ' => 'th',
+ 'T́' => 'T',
+ 't́' => 't',
+ 'T̀' => 'T',
+ 't̀' => 't',
+ 'T̂' => 'T',
+ 't̂' => 't',
+ 'T̈' => 'T',
+ 'ẗ' => 't',
+ 'T̨' => 'T',
+ 't̨' => 't',
+ 'Ⱦ' => 'T',
+ 'ⱦ' => 't',
+ 'Ť' => 'T',
+ 'ť' => 't',
+ 'Ṫ' => 'T',
+ 'ṫ' => 't',
+ 'Ṭ' => 'T',
+ 'ṭ' => 't',
+ 'T̄' => 'T',
+ 't̄' => 't',
+ 'T̃' => 'T',
+ 't̃' => 't',
+ 'Ü' => 'U',
+ 'Ù' => 'U',
+ 'Ú' => 'U',
+ 'Û' => 'U',
+ 'Ũ' => 'U',
+ 'Ŭ' => 'U',
+ 'Ű' => 'U',
+ 'Ų' => 'U',
+ 'Ư' => 'U',
+ 'Ǔ' => 'U',
+ 'Ǖ' => 'U',
+ 'Ǘ' => 'U',
+ 'Ǚ' => 'U',
+ 'Ǜ' => 'U',
+ 'ü' => 'u',
+ 'ù' => 'u',
+ 'ú' => 'u',
+ 'û' => 'u',
+ 'ũ' => 'u',
+ 'ŭ' => 'u',
+ 'ű' => 'u',
+ 'ų' => 'u',
+ 'ư' => 'u',
+ 'ǔ' => 'u',
+ 'ǖ' => 'u',
+ 'ǘ' => 'u',
+ 'ǚ' => 'u',
+ 'ǜ' => 'u',
+ 'U̧' => 'U',
+ 'u̧' => 'u',
+ 'Ʉ' => 'U',
+ 'ʉ' => 'u',
+ 'U̇' => 'U',
+ 'u̇' => 'u',
+ 'Ụ' => 'U',
+ 'ụ' => 'u',
+ 'Ū' => 'U',
+ 'ū' => 'u',
+ 'Ʊ' => 'U',
+ 'ʊ' => 'u',
+ 'Ŵ' => 'W',
+ 'ŵ' => 'w',
+ 'Ẁ' => 'W',
+ 'ẁ' => 'w',
+ 'Ẃ' => 'W',
+ 'ẃ' => 'w',
+ 'Ẅ' => 'W',
+ 'ẅ' => 'w',
+ 'Ѵ' => 'I',
+ 'ѵ' => 'i',
+ 'Ꙗ' => 'Ja',
+ 'ꙗ' => 'ja',
+ 'Є' => 'Je',
+ 'є' => 'je',
+ 'Ѥ' => 'Je',
+ 'ѥ' => 'je',
+ 'Ѕ' => 'Dz',
+ 'ѕ' => 'dz',
+ 'Ꙋ' => 'U',
+ 'ꙋ' => 'u',
+ 'Ѡ' => 'O',
+ 'ѡ' => 'o',
+ 'Ѿ' => 'Ot',
+ 'ѿ' => 'ot',
+ 'Ѫ' => 'U',
+ 'ѫ' => 'u',
+ 'Ѧ' => 'Ja',
+ 'ѧ' => 'ja',
+ 'Ѭ' => 'Ju',
+ 'ѭ' => 'ju',
+ 'Ѩ' => 'Ja',
+ 'ѩ' => 'Ja',
+ 'Ѯ' => 'Ks',
+ 'ѯ' => 'ks',
+ 'Ѱ' => 'Ps',
+ 'ѱ' => 'ps',
+ 'Х' => 'X',
+ 'х' => 'x',
+ 'Ý' => 'Y',
+ 'Ÿ' => 'Y',
+ 'Ŷ' => 'Y',
+ 'ý' => 'y',
+ 'ÿ' => 'y',
+ 'ŷ' => 'y',
+ 'Ỳ' => 'Y',
+ 'ỳ' => 'y',
+ 'Y̧' => 'Y',
+ 'y̧' => 'y',
+ 'Y̨' => 'Y',
+ 'y̨' => 'y',
+ 'Ɏ' => 'Y',
+ 'ɏ' => 'y',
+ 'Y̌' => 'Y',
+ 'y̌' => 'y',
+ 'Ẏ' => 'Y',
+ 'ẏ' => 'y',
+ 'Ỵ' => 'Y',
+ 'ỵ' => 'y',
+ 'Ȳ' => 'Y',
+ 'ȳ' => 'y',
+ 'Ỹ' => 'Y',
+ 'ỹ' => 'y',
+ 'Ź' => 'Z',
+ 'ź' => 'z',
+ 'Z̀' => 'Z',
+ 'z̀' => 'z',
+ 'Ẑ' => 'Z',
+ 'ẑ' => 'z',
+ 'Z̈' => 'Z',
+ 'z̈' => 'z',
+ 'Z̧' => 'Z',
+ 'z̧' => 'z',
+ 'Z̨' => 'Z',
+ 'z̨' => 'z',
+ 'Ƶ' => 'Z',
+ 'ƶ' => 'z',
+ 'Ž' => 'Z',
+ 'ž' => 'z',
+ 'Ż' => 'Z',
+ 'ż' => 'z',
+ 'Ẓ' => 'Z',
+ 'ẓ' => 'z',
+ 'Z̄' => 'Z',
+ 'z̄' => 'z',
+ 'Z̃' => 'Z',
+ 'z̃' => 'z',
+ ],
+ // whitespace chars
+ ' ' => [
+ "\xc2\xa0" => ' ', // 'NO-BREAK SPACE'
+ "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK'
+ "\xe2\x80\x80" => ' ', // 'EN QUAD'
+ "\xe2\x80\x81" => ' ', // 'EM QUAD'
+ "\xe2\x80\x82" => ' ', // 'EN SPACE'
+ "\xe2\x80\x83" => ' ', // 'EM SPACE'
+ "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE'
+ "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE'
+ "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE'
+ "\xe2\x80\x87" => ' ', // 'FIGURE SPACE'
+ "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE'
+ "\xe2\x80\x89" => ' ', // 'THIN SPACE'
+ "\xe2\x80\x8a" => ' ', // 'HAIR SPACE'
+ "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR'
+ "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR'
+ "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE'
+ "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE'
+ "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE'
+ "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE'
+ "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER'
+ ],
+ // commonly used in Word documents
+ 'msword' => [
+ "\xc2\xab" => '<<', // « (U+00AB) in UTF-8
+ "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8
+ "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8
+ "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8
+ "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8
+ "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8
+ "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8
+ "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8
+ "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8
+ "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8
+ "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8
+ "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8
+ "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8
+ "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8
+ "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8
+ ],
+ // Currency
+ //
+ // url => https://en.wikipedia.org/wiki/Currency_symbol
+ 'currency_short' => [
+ '€' => 'EUR',
+ '$' => '$',
+ '₢' => 'Cr',
+ '₣' => 'Fr.',
+ '£' => 'PS',
+ '₤' => 'L.',
+ 'ℳ' => 'M',
+ '₥' => 'mil',
+ '₦' => 'N',
+ '₧' => 'Pts',
+ '₨' => 'Rs',
+ 'රු' => 'LKR',
+ 'ரூ' => 'LKR',
+ '௹' => 'Rs',
+ 'रू' => 'NPR',
+ '₹' => 'Rs',
+ '૱' => 'Rs',
+ '₩' => 'W',
+ '₪' => 'NS',
+ '₸' => 'KZT',
+ '₫' => 'D',
+ '֏' => 'AMD',
+ '₭' => 'K',
+ '₺' => 'TL',
+ '₼' => 'AZN',
+ '₮' => 'T',
+ '₯' => 'Dr',
+ '₲' => 'PYG',
+ '₾' => 'GEL',
+ '₳' => 'ARA',
+ '₴' => 'UAH',
+ '₽' => 'RUB',
+ '₵' => 'GHS',
+ '₡' => 'CL',
+ '¢' => 'c',
+ '¥' => 'YEN',
+ '円' => 'JPY',
+ '৳' => 'BDT',
+ '元' => 'CNY',
+ '﷼' => 'SAR',
+ '៛' => 'KR',
+ '₠' => 'ECU',
+ '¤' => '$?',
+ '฿' => 'THB',
+ '؋' => 'AFN',
+ ],
+];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php
new file mode 100644
index 000000000..426d84a4d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php
@@ -0,0 +1,759 @@
+<?php
+
+return [
+ // Dutch (Flemish)
+ 'nl' => [
+ '=' => ' gelijk ',
+ '%' => ' procent ',
+ '∑' => ' som ',
+ '∆' => ' delta ',
+ '∞' => ' oneindig ',
+ '♥' => ' love ',
+ '&' => ' en ',
+ '+' => ' plus ',
+ ],
+ // Italian
+ 'it' => [
+ '=' => ' uguale ',
+ '%' => ' percent ',
+ '∑' => ' somma ',
+ '∆' => ' delta ',
+ '∞' => ' infinito ',
+ '♥' => ' amore ',
+ '&' => ' e ',
+ '+' => ' piu ',
+ ],
+ // Macedonian
+ 'mk' => [
+ '=' => ' ednakva ',
+ '%' => ' procenti ',
+ '∑' => ' zbir ',
+ '∆' => ' delta ',
+ '∞' => ' beskonecnost ',
+ '♥' => ' loveubov ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Portuguese (Brazil)
+ 'pt' => [
+ '=' => ' igual ',
+ '%' => ' por cento ',
+ '∑' => ' soma ',
+ '∆' => ' delta ',
+ '∞' => ' infinito ',
+ '♥' => ' amor ',
+ '&' => ' e ',
+ '+' => ' mais ',
+ ],
+ // Greek(lish) (Elláda)
+ 'el__greeklish' => [
+ '=' => ' isos ',
+ '%' => ' tois ekato ',
+ '∑' => ' athroisma ',
+ '∆' => ' delta ',
+ '∞' => ' apeiro ',
+ '♥' => ' agape ',
+ '&' => ' kai ',
+ '+' => ' syn ',
+ ],
+ // Greek (Elláda)
+ 'el' => [
+ '=' => ' isos ',
+ '%' => ' tois ekato ',
+ '∑' => ' athroisma ',
+ '∆' => ' delta ',
+ '∞' => ' apeiro ',
+ '♥' => ' agape ',
+ '&' => ' kai ',
+ '+' => ' syn ',
+ ],
+ // Hindi
+ 'hi' => [
+ '=' => ' samana ',
+ '%' => ' paratisata ',
+ '∑' => ' yoga ',
+ '∆' => ' dalata ',
+ '∞' => ' anata ',
+ '♥' => ' payara ',
+ '&' => ' aura ',
+ '+' => ' palasa ',
+ ],
+ // Armenian
+ 'hy' => [
+ '=' => ' havasar ',
+ '%' => ' tvokvos ',
+ '∑' => ' gvoumar ',
+ '∆' => ' delta ',
+ '∞' => ' ansahmanvouthyvoun ',
+ '♥' => ' ser ',
+ '&' => ' ev ',
+ '+' => ' gvoumarats ',
+ ],
+ // Swedish
+ 'sv' => [
+ '=' => ' lika ',
+ '%' => ' procent ',
+ '∑' => ' summa ',
+ '∆' => ' delta ',
+ '∞' => ' oandlighet ',
+ '♥' => ' alskar ',
+ '&' => ' och ',
+ '+' => ' plus ',
+ ],
+ // Turkmen
+ 'tk' => [
+ '=' => ' den ',
+ '%' => ' yuzde ',
+ '∑' => ' jem ',
+ '∆' => ' delta ',
+ '∞' => ' mudimilik ',
+ '♥' => ' soygi ',
+ '&' => ' we ',
+ '+' => ' yzy ',
+ ],
+ // Turkish
+ 'tr' => [
+ '=' => ' esit ',
+ '%' => ' yuzde ',
+ '∑' => ' Toplam ',
+ '∆' => ' delta ',
+ '∞' => ' sonsuzluk ',
+ '♥' => ' ask ',
+ '&' => ' ve ',
+ '+' => ' arti ',
+ ],
+ // Bulgarian
+ 'bg' => [
+ '=' => ' raven ',
+ '%' => ' na sto ',
+ '∑' => ' suma ',
+ '∆' => ' delta ',
+ '∞' => ' bezkrajnost ',
+ '♥' => ' obicam ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Hungarian
+ 'hu' => [
+ '=' => ' Egyenlo ',
+ '%' => ' Szazalek ',
+ '∑' => ' osszeg ',
+ '∆' => ' delta ',
+ '∞' => ' vegtelenitett ',
+ '♥' => ' love ',
+ '&' => ' Es ',
+ '+' => ' Plusz ',
+ ],
+ // Myanmar (Burmese)
+ 'my' => [
+ '=' => ' ttn:ttnnym? ',
+ '%' => ' raakhngnn:k ',
+ '∑' => ' ld ',
+ '∆' => ' m?cwk?n:pe? ',
+ '∞' => ' ach:m ',
+ '♥' => ' mettttaa ',
+ '&' => ' n ',
+ '+' => ' ape?ng: ',
+ ],
+ // Croatian (Hrvatska)
+ 'hr' => [
+ '=' => ' Jednaki ',
+ '%' => ' Posto ',
+ '∑' => ' zbroj ',
+ '∆' => ' Delta ',
+ '∞' => ' beskonacno ',
+ '♥' => ' ljubav ',
+ '&' => ' I ',
+ '+' => ' Plus ',
+ ],
+ // Finnish
+ 'fi' => [
+ '=' => ' Sama ',
+ '%' => ' Prosenttia ',
+ '∑' => ' sum ',
+ '∆' => ' delta ',
+ '∞' => ' aareton ',
+ '♥' => ' rakkautta ',
+ '&' => ' Ja ',
+ '+' => ' Plus ',
+ ],
+ // Georgian (Kartvelian)
+ 'ka' => [
+ '=' => ' tanasts\'ori ',
+ '%' => ' p\'rotsent\'i ',
+ '∑' => ' tankha ',
+ '∆' => ' delt\'a ',
+ '∞' => ' usasrulo ',
+ '♥' => ' siq\'varuli ',
+ '&' => ' da ',
+ '+' => ' p\'lus ',
+ ],
+ // Russian
+ 'ru' => [
+ '=' => ' ravnyj ',
+ '%' => ' procent ',
+ '∑' => ' summa ',
+ '∆' => ' del\'ta ',
+ '∞' => ' beskonecnost\' ',
+ '♥' => ' lublu ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Russian - Passport (2013), ICAO
+ 'ru__passport_2013' => [
+ '=' => ' ravnyj ',
+ '%' => ' procent ',
+ '∑' => ' summa ',
+ '∆' => ' del\'ta ',
+ '∞' => ' beskonecnost\' ',
+ '♥' => ' lublu ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Russian - GOST 7.79-2000(B)
+ 'ru__gost_2000_b' => [
+ '=' => ' ravnyj ',
+ '%' => ' procent ',
+ '∑' => ' summa ',
+ '∆' => ' del\'ta ',
+ '∞' => ' beskonecnost\' ',
+ '♥' => ' lublu ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Ukrainian
+ 'uk' => [
+ '=' => ' rivnij ',
+ '%' => ' vidsotkiv ',
+ '∑' => ' suma ',
+ '∆' => ' del\'ta ',
+ '∞' => ' neskincennist\' ',
+ '♥' => ' lubov ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Kazakh
+ 'kk' => [
+ '=' => ' ten\' ',
+ '%' => ' Pajyzdar ',
+ '∑' => ' zalpy ',
+ '∆' => ' ajyrmasylyk, ',
+ '∞' => ' seksiz ',
+ '♥' => ' mahabbat ',
+ '&' => ' z@ne ',
+ '+' => ' plus ',
+ ],
+ // Czech
+ 'cs' => [
+ '=' => ' rovnat se ',
+ '%' => ' procento ',
+ '∑' => ' soucet ',
+ '∆' => ' delta ',
+ '∞' => ' nekonecno ',
+ '♥' => ' laska ',
+ '&' => ' a ',
+ '+' => ' plus ',
+ ],
+ // Danish
+ 'da' => [
+ '=' => ' Lige ',
+ '%' => ' Prozent ',
+ '∑' => ' sum ',
+ '∆' => ' delta ',
+ '∞' => ' uendelig ',
+ '♥' => ' kaerlighed ',
+ '&' => ' Og ',
+ '+' => ' Plus ',
+ ],
+ // Polish
+ 'pl' => [
+ '=' => ' rowny ',
+ '%' => ' procent ',
+ '∑' => ' suma ',
+ '∆' => ' delta ',
+ '∞' => ' nieskonczonosc ',
+ '♥' => ' milosc ',
+ '&' => ' i ',
+ '+' => ' plus ',
+ ],
+ // Romanian
+ 'ro' => [
+ '=' => ' egal ',
+ '%' => ' la suta ',
+ '∑' => ' suma ',
+ '∆' => ' delta ',
+ '∞' => ' infinit ',
+ '♥' => ' dragoste ',
+ '&' => ' si ',
+ '+' => ' la care se adauga ',
+ ],
+ // Esperanto
+ 'eo' => [
+ '=' => ' Egalaj ',
+ '%' => ' Procento ',
+ '∑' => ' sumo ',
+ '∆' => ' delto ',
+ '∞' => ' senfina ',
+ '♥' => ' amo ',
+ '&' => ' Kaj ',
+ '+' => ' Pli ',
+ ],
+ // Estonian
+ 'et' => [
+ '=' => ' Vordsed ',
+ '%' => ' Protsenti ',
+ '∑' => ' summa ',
+ '∆' => ' o ',
+ '∞' => ' loputut ',
+ '♥' => ' armastus ',
+ '&' => ' Ja ',
+ '+' => ' Pluss ',
+ ],
+ // Latvian
+ 'lv' => [
+ '=' => ' vienads ',
+ '%' => ' procents ',
+ '∑' => ' summa ',
+ '∆' => ' delta ',
+ '∞' => ' bezgaliba ',
+ '♥' => ' milestiba ',
+ '&' => ' un ',
+ '+' => ' pluss ',
+ ],
+ // Lithuanian
+ 'lt' => [
+ '=' => ' lygus ',
+ '%' => ' procentu ',
+ '∑' => ' suma ',
+ '∆' => ' delta ',
+ '∞' => ' begalybe ',
+ '♥' => ' meile ',
+ '&' => ' ir ',
+ '+' => ' plius ',
+ ],
+ // Norwegian
+ 'no' => [
+ '=' => ' Lik ',
+ '%' => ' Prosent ',
+ '∑' => ' sum ',
+ '∆' => ' delta ',
+ '∞' => ' uendelig ',
+ '♥' => ' kjaerlighet ',
+ '&' => ' Og ',
+ '+' => ' Pluss ',
+ ],
+ // Vietnamese
+ 'vi' => [
+ '=' => ' cong bang ',
+ '%' => ' phan tram ',
+ '∑' => ' tong so ',
+ '∆' => ' dong bang ',
+ '∞' => ' vo cuc ',
+ '♥' => ' Yeu ',
+ '&' => ' va ',
+ '+' => ' them ',
+ ],
+ // Arabic
+ 'ar' => [
+ '=' => ' mtsawy ',
+ '%' => ' nsbh mywyh ',
+ '∑' => ' mjmw\' ',
+ '∆' => ' dlta ',
+ '∞' => ' ma la nhayt ',
+ '♥' => ' hb ',
+ '&' => ' w ',
+ '+' => ' zayd ',
+ ],
+ // Persian (Farsi)
+ 'fa' => [
+ '=' => ' brabr ',
+ '%' => ' dr sd ',
+ '∑' => ' mjmw\' ',
+ '∆' => ' dlta ',
+ '∞' => ' by nhayt ',
+ '♥' => ' \'shq ',
+ '&' => ' w ',
+ '+' => ' bh \'lawh ',
+ ],
+ // Serbian
+ 'sr' => [
+ '=' => ' jednak ',
+ '%' => ' procenat ',
+ '∑' => ' zbir ',
+ '∆' => ' delta ',
+ '∞' => ' beskraj ',
+ '♥' => ' lubav ',
+ '&' => ' i ',
+ '+' => ' vise ',
+ ],
+ // Serbian - Cyrillic
+ 'sr__cyr' => [
+ '=' => ' jednak ',
+ '%' => ' procenat ',
+ '∑' => ' zbir ',
+ '∆' => ' delta ',
+ '∞' => ' beskraj ',
+ '♥' => ' lubav ',
+ '&' => ' i ',
+ '+' => ' vise ',
+ ],
+ // Serbian - Latin
+ 'sr__lat' => [
+ '=' => ' jednak ',
+ '%' => ' procenat ',
+ '∑' => ' zbir ',
+ '∆' => ' delta ',
+ '∞' => ' beskraj ',
+ '♥' => ' lubav ',
+ '&' => ' i ',
+ '+' => ' vise ',
+ ],
+ // Azerbaijani
+ 'az' => [
+ '=' => ' b@rab@r ',
+ '%' => ' faiz ',
+ '∑' => ' m@bl@g ',
+ '∆' => ' delta ',
+ '∞' => ' sonsuzluq ',
+ '♥' => ' sevgi ',
+ '&' => ' v@ ',
+ '+' => ' plus ',
+ ],
+ // Slovak
+ 'sk' => [
+ '=' => ' rovny ',
+ '%' => ' percento ',
+ '∑' => ' sucet ',
+ '∆' => ' delta ',
+ '∞' => ' infinity ',
+ '♥' => ' milovat ',
+ '&' => ' a ',
+ '+' => ' viac ',
+ ],
+ // French
+ 'fr' => [
+ '=' => ' Egal ',
+ '%' => ' Pourcentage ',
+ '∑' => ' somme ',
+ '∆' => ' delta ',
+ '∞' => ' infini ',
+ '♥' => ' amour ',
+ '&' => ' Et ',
+ '+' => ' Plus ',
+ ],
+ // Austrian (French)
+ 'fr_at' => [
+ '=' => ' Egal ',
+ '%' => ' Pourcentage ',
+ '∑' => ' somme ',
+ '∆' => ' delta ',
+ '∞' => ' infini ',
+ '♥' => ' amour ',
+ '&' => ' Et ',
+ '+' => ' Plus ',
+ ],
+ // Switzerland (French)
+ 'fr_ch' => [
+ '=' => ' Egal ',
+ '%' => ' Pourcentage ',
+ '∑' => ' somme ',
+ '∆' => ' delta ',
+ '∞' => ' infini ',
+ '♥' => ' amour ',
+ '&' => ' Et ',
+ '+' => ' Plus ',
+ ],
+ // German
+ 'de' => [
+ '=' => ' gleich ',
+ '%' => ' Prozent ',
+ '∑' => ' gesamt ',
+ '∆' => ' Unterschied ',
+ '∞' => ' undendlich ',
+ '♥' => ' liebe ',
+ '&' => ' und ',
+ '+' => ' plus ',
+ ],
+ // Austrian (German)
+ 'de_at' => [
+ '=' => ' gleich ',
+ '%' => ' Prozent ',
+ '∑' => ' gesamt ',
+ '∆' => ' Unterschied ',
+ '∞' => ' undendlich ',
+ '♥' => ' liebe ',
+ '&' => ' und ',
+ '+' => ' plus ',
+ ],
+ // Switzerland (German)
+ 'de_ch' => [
+ '=' => ' gleich ',
+ '%' => ' Prozent ',
+ '∑' => ' gesamt ',
+ '∆' => ' Unterschied ',
+ '∞' => ' undendlich ',
+ '♥' => ' liebe ',
+ '&' => ' und ',
+ '+' => ' plus ',
+ ],
+ // Bengali (Bangla)
+ 'bn' => [
+ '=' => ' Saman ',
+ '%' => ' Satakora ',
+ '∑' => ' Samasti ',
+ '∆' => ' Badhip ',
+ '∞' => ' Ananta ',
+ '♥' => ' Valobasa ',
+ '&' => ' Abong ',
+ '+' => ' Songzojon ',
+ ],
+ // English
+ 'en' => [
+ '=' => ' equal ',
+ '%' => ' percent ',
+ '∑' => ' sum ',
+ '∆' => ' delta ',
+ '∞' => ' infinity ',
+ '♥' => ' love ',
+ '&' => ' and ',
+ '+' => ' plus ',
+ ],
+ // Currency
+ //
+ // url: https://en.wikipedia.org/wiki/Currency_symbol
+ 'currency' => [
+ '€' => ' Euro ',
+ '$' => ' Dollar ',
+ '₢' => ' cruzeiro ',
+ '₣' => ' French franc ',
+ '£' => ' pound ',
+ '₤' => ' lira ', // Italian
+ '₶' => ' livre tournois ',
+ 'ℳ' => ' mark ',
+ '₥' => ' mill ',
+ '₦' => ' naira ',
+ '₧' => ' peseta ',
+ '₨' => ' rupee ',
+ 'රු' => ' rupee ', // Sri Lankan
+ 'ரூ' => ' rupee ', // Sri Lankan
+ '௹' => ' rupee ', // Tamil
+ 'रू' => ' rupee ', // Nepalese
+ '₹' => ' rupee ', // Indian
+ '૱' => ' rupee ', // Gujarat
+ '₩' => ' won ',
+ '₪' => ' new shequel ',
+ '₸' => ' tenge ',
+ '₫' => ' dong ',
+ '֏' => ' dram ',
+ '₭' => ' kip ',
+ '₺' => ' lira ', // Turkish
+ '₼' => ' manat ',
+ '₮' => ' tugrik ',
+ '₯' => ' drachma ',
+ '₰' => ' pfennig ',
+ '₷' => ' spesmilo ',
+ '₱' => ' peso ', // Philippine
+ '﷼‎' => ' riyal ',
+ '₲' => ' guarani ',
+ '₾' => ' lari ',
+ '₳' => ' austral ',
+ '₴' => ' hryvnia ',
+ '₽' => ' ruble ',
+ '₵' => ' cedi ',
+ '₡' => ' colon ',
+ '¢' => ' cent ',
+ '¥' => ' yen ',
+ '円' => ' yen ',
+ '৳' => ' taka ',
+ '元' => ' yuan ',
+ '﷼' => ' riyal ',
+ '៛' => ' riel ',
+ '₠' => ' European Currency ',
+ '¤' => ' currency ',
+ '฿' => ' baht ',
+ '؋' => ' afghani ',
+ ],
+ // Temperature
+ //
+ // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature
+ 'temperature' => [
+ '°De' => ' Delisle ',
+ '°Re' => ' Reaumur ', // Réaumur
+ '°Ro' => ' Romer ', // Rømer
+ '°R' => ' Rankine ',
+ '°C' => ' Celsius ',
+ '°F' => ' Fahrenheit ',
+ '°N' => ' Newton ',
+ ],
+ 'latin_symbols' => [
+ '=' => '=',
+ '%' => '%',
+ '∑' => '∑',
+ '∆' => '∆',
+ '∞' => '∞',
+ '♥' => '♥',
+ '&' => '&',
+ '+' => '+',
+ // ---
+ '©' => ' (c) ',
+ '®' => ' (r) ',
+ '@' => ' (at) ',
+ '№' => ' No. ',
+ '℞' => ' Rx ',
+ '[' => '[',
+ '\' => '\\',
+ ']' => ']',
+ '^' => '^',
+ '_' => '_',
+ '`' => '`',
+ '‐' => '-',
+ '‑' => '-',
+ '‒' => '-',
+ '–' => '-',
+ '−' => '-',
+ '—' => '-',
+ '―' => '-',
+ '﹘' => '-',
+ '│' => '|',
+ '∖' => '\\',
+ '∕' => '/',
+ '⁄' => '/',
+ '←' => '<-',
+ '→' => '->',
+ '↑' => '|',
+ '↓' => '|',
+ '⁅' => '[',
+ '⁆' => ']',
+ '⁎' => '*',
+ '、' => ',',
+ '。' => '.',
+ '〈' => '<',
+ '〉' => '>',
+ '《' => '<<',
+ '》' => '>>',
+ '〔' => '[',
+ '〕' => ']',
+ '〘' => '[',
+ '〙' => ']',
+ '〚' => '[',
+ '〛' => ']',
+ '﹝' => '[',
+ '﹞' => ']',
+ '︹' => '[',
+ '︺' => ']',
+ '﹇' => '[',
+ '﹈' => ']',
+ '︐' => ',',
+ '︑' => ',',
+ '︒' => '.',
+ '︓' => ':',
+ '︔' => ';',
+ '︕' => '!',
+ '︖' => '?',
+ '︙' => '...',
+ '︰' => '..',
+ '︵' => '(',
+ '︶' => ')',
+ '﹙' => '(',
+ '﹚' => ')',
+ '︷' => '{',
+ '︸' => '}',
+ '﹛' => '{',
+ '﹜' => '}',
+ '︽' => '<<',
+ '︾' => '>>',
+ '︿' => '<',
+ '﹀' => '>',
+ '×' => '*',
+ '÷' => '/',
+ '≪' => '<<',
+ '≫' => '>>',
+ '⦅' => '((',
+ '⦆' => '))',
+ '〇' => '0',
+ '′' => '\'',
+ '〝' => '"',
+ '〞' => '"',
+ '«' => '<<',
+ '»' => '>>',
+ '‘' => "'",
+ '’' => "'",
+ '‚' => ',',
+ '‛' => "'",
+ '“' => '"',
+ '”' => '"',
+ '„' => '"',
+ '‟' => '"',
+ '‹' => '<',
+ '›' => '>',
+ '․' => '.',
+ '‥' => '..',
+ '…' => '...',
+ '″' => '"',
+ '‴' => '\'\'\'',
+ '‶' => '``',
+ '‷' => '```',
+ '‼' => '!!',
+ '⁇' => '??',
+ '⁈' => '?!',
+ '⁉' => '!?',
+ '⁗' => '````',
+ '⩴' => '::=',
+ '⩵' => '==',
+ '⩶' => '===',
+ '﹔' => ';',
+ '﹕' => ':',
+ '﹖' => '?',
+ '﹗' => '!',
+ '﹍' => '_',
+ '﹎' => '_',
+ '﹏' => '_',
+ '﹐' => ',',
+ '﹑' => ',',
+ '﹒' => '.',
+ '﹟' => '#',
+ '﹠' => '&',
+ '﹡' => '*',
+ '﹢' => '+',
+ '﹣' => '-',
+ '﹤' => '<',
+ '﹥' => '>',
+ '﹦' => '=',
+ '﹨' => '\\',
+ '﹩' => '$',
+ '﹪' => '%',
+ '﹫' => '@',
+ '!' => '!',
+ '"' => '"',
+ '#' => '#',
+ '$' => '$',
+ '%' => '%',
+ '&' => '&',
+ ''' => '\'',
+ '(' => '(',
+ ')' => ')',
+ '*' => '*',
+ '+' => '+',
+ ',' => ',',
+ '-' => '-',
+ '.' => '.',
+ '/' => '/',
+ ':' => ':',
+ ';' => ';',
+ '<' => '<',
+ '=' => '=',
+ '>' => '>',
+ '?' => '?',
+ '@' => '@',
+ '{' => '{',
+ '|' => '|',
+ '}' => '}',
+ '~' => '~',
+ '⦅' => '((',
+ '⦆' => '))',
+ '¬' => '!',
+ ' ̄' => '-',
+ '¦' => '|',
+ '■' => '#',
+ ],
+];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php
new file mode 100644
index 000000000..a6345f213
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php
@@ -0,0 +1,65 @@
+<?php
+
+return [
+ 'uz' => 0,
+ 'tk' => 1,
+ 'th' => 0,
+ 'ps' => 0,
+ 'or' => 0,
+ 'mn' => 0,
+ 'ko' => 0,
+ 'ky' => 0,
+ 'hy' => 1,
+ 'bn' => 5,
+ 'be' => 0,
+ 'am' => 0,
+ 'ja' => 0,
+ 'zh' => 0,
+ 'nl' => 1,
+ 'it' => 1,
+ 'mk' => 1,
+ 'pt' => 1,
+ 'el__greeklish' => 2,
+ 'el' => 2,
+ 'hi' => 2,
+ 'sv' => 1,
+ 'tr' => 1,
+ 'bg' => 2,
+ 'hu' => 1,
+ 'my' => 5,
+ 'hr' => 2,
+ 'fi' => 1,
+ 'ka' => 1,
+ 'ru' => 1,
+ 'ru__passport_2013' => 1,
+ 'ru__gost_2000_b' => 1,
+ 'uk' => 1,
+ 'kk' => 1,
+ 'cs' => 1,
+ 'da' => 1,
+ 'pl' => 1,
+ 'ro' => 1,
+ 'eo' => 1,
+ 'et' => 1,
+ 'lv' => 1,
+ 'lt' => 1,
+ 'no' => 1,
+ 'vi' => 1,
+ 'ar' => 1,
+ 'fa' => 1,
+ 'sr' => 1,
+ 'sr__cyr' => 1,
+ 'sr__lat' => 1,
+ 'az' => 1,
+ 'sk' => 1,
+ 'fr' => 1,
+ 'fr_at' => 1,
+ 'fr_ch' => 1,
+ 'de' => 1,
+ 'de_at' => 1,
+ 'de_ch' => 1,
+ 'en' => 0,
+ 'latin' => 3,
+ ' ' => 1,
+ 'msword' => 1,
+];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php
new file mode 100644
index 000000000..142318c33
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php
@@ -0,0 +1 @@
+<?php return ['' => 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x000.php b/vendor/voku/portable-ascii/src/voku/helper/data/x000.php
new file mode 100644
index 000000000..6c9d81f9d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x000.php
@@ -0,0 +1,16 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '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', '[', '\\', ']', '^', '_', '`', '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', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN
+ '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK
+ '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS
+ '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER
+ '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN
+ 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE
+ '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK
+ '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK
+ '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH
+ '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German
+ 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German
+ 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German
+ 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German
+ 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German
+ 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German
+ 'u', 'y', 'th', 'y', ];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x001.php b/vendor/voku/portable-ascii/src/voku/helper/data/x001.php
new file mode 100644
index 000000000..87fb12fb9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x001.php
@@ -0,0 +1 @@
+<?php return ['A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '\'n', 'ng', 'NG', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'b', 'B', 'B', 'b', '6', '6', 'O', 'C', 'c', 'D', 'D', 'D', 'd', 'd', '3', '@', 'E', 'F', 'f', 'G', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'l', 'W', 'N', 'n', 'O', 'O', 'o', 'OI', 'oi', 'P', 'p', 'YR', '2', '2', 'SH', 'sh', 't', 'T', 't', 'T', 'U', 'u', 'Y', 'V', 'Y', 'y', 'Z', 'z', 'ZH', 'ZH', 'zh', 'zh', '2', '5', '5', 'ts', 'w', '|', '||', '|=', '!', 'DZ', 'Dz', 'dz', 'LJ', 'Lj', 'lj', 'NJ', 'Nj', 'nj', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '@', 'A', 'a', 'A', 'a', 'AE', 'ae', 'G', 'g', 'G', 'g', 'K', 'k', 'O', 'o', 'O', 'o', 'ZH', 'zh', 'j', 'DZ', 'Dz', 'dz', 'G', 'g', 'HV', 'W', 'N', 'n', 'A', 'a', 'AE', 'ae', 'O', 'o'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x002.php b/vendor/voku/portable-ascii/src/voku/helper/data/x002.php
new file mode 100644
index 000000000..680e8690e
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x002.php
@@ -0,0 +1 @@
+<?php return ['A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'R', 'r', 'R', 'r', 'U', 'u', 'U', 'u', 'S', 's', 'T', 't', 'Y', 'y', 'H', 'h', 'N', 'd', 'OU', 'ou', 'Z', 'z', 'A', 'a', 'E', 'e', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'Y', 'y', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', '[?]', '[?]', 'B', 'U', '^', 'E', 'e', 'J', 'j', 'q', 'q', 'R', 'r', 'Y', 'y', 'a', 'a', 'a', 'b', 'o', 'c', 'd', 'd', 'e', '@', '@', 'e', 'e', 'e', 'e', 'j', 'g', 'g', 'g', 'g', 'u', 'Y', 'h', 'h', 'i', 'i', 'I', 'l', 'l', 'l', 'lZ', 'W', 'W', 'm', 'n', 'n', 'n', 'o', 'OE', 'O', 'F', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'R', 'R', 's', 'S', 'j', 'S', 'S', 't', 't', 'u', 'U', 'v', '^', 'w', 'y', 'Y', 'z', 'z', 'Z', 'Z', '?', '?', '?', 'C', '@', 'B', 'E', 'G', 'H', 'j', 'k', 'L', 'q', '?', '?', 'dz', 'dZ', 'dz', 'ts', 'tS', 'tC', 'fN', 'ls', 'lz', 'WW', ']]', 'h', 'h', 'h', 'h', 'j', 'r', 'r', 'r', 'r', 'w', 'y', '\'', '"', '`', '\'', '`', '`', '\'', '?', '?', '<', '>', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x003.php b/vendor/voku/portable-ascii/src/voku/helper/data/x003.php
new file mode 100644
index 000000000..3d02b86e2
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x003.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', 'a', 'e', 'i', 'o', 'u', 'c', 'd', 'h', 'm', 'r', 't', 'v', 'x', '[?]', '[?]', '[?]', '[?]', '\'', ',', '[?]', '[?]', '[?]', '[?]', '', '[?]', '[?]', '[?]', '?', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', 'A', ';', 'E', 'E', 'I', '[?]', 'O', '[?]', 'U', 'O', 'I', 'A', 'B', 'G', 'D', 'E', 'Z', 'E', 'Th', 'I', 'K', 'L', 'M', 'N', 'Ks', 'O', 'P', 'R', '[?]', 'S', 'T', 'U', 'Ph', 'Kh', 'Ps', 'O', 'I', 'U', 'a', 'e', 'e', 'i', 'u', 'a', 'b', 'g', 'd', 'e', 'z', 'e', 'th', 'i', 'k', 'l', 'm', 'n', 'x', 'o', 'p', 'r', 's', 's', 't', 'u', 'ph', 'kh', 'ps', 'o', 'i', 'u', 'o', 'u', 'o', '[?]', 'b', 'th', 'U', 'U', 'U', 'ph', 'p', '&', '[?]', '[?]', 'St', 'st', 'W', 'w', 'Q', 'q', 'Sp', 'sp', 'Sh', 'sh', 'F', 'f', 'Kh', 'kh', 'H', 'h', 'G', 'g', 'CH', 'ch', 'Ti', 'ti', 'k', 'r', 'c', 'j', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x004.php b/vendor/voku/portable-ascii/src/voku/helper/data/x004.php
new file mode 100644
index 000000000..ee92a0ca7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x004.php
@@ -0,0 +1 @@
+<?php return ['Ie', 'Io', 'Dj', 'Gj', 'Ie', 'Dz', 'I', 'Yi', 'J', 'Lj', 'Nj', 'Tsh', 'Kj', 'I', 'U', 'Dzh', 'A', 'B', 'V', 'G', 'D', 'E', 'Zh', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '\'', 'Y', '\'', 'E', 'Iu', 'Ia', 'a', 'b', 'v', 'g', 'd', 'e', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'kh', 'ts', 'ch', 'sh', 'shch', '\'', 'y', '\'', 'e', 'iu', 'ia', 'ie', 'io', 'dj', 'gj', 'ie', 'dz', 'i', 'yi', 'j', 'lj', 'nj', 'tsh', 'kj', 'i', 'u', 'dzh', 'O', 'o', 'E', 'e', 'Ie', 'ie', 'E', 'e', 'Ie', 'ie', 'O', 'o', 'Io', 'io', 'Ks', 'ks', 'Ps', 'ps', 'F', 'f', 'Y', 'y', 'Y', 'y', 'u', 'u', 'O', 'o', 'O', 'o', 'Ot', 'ot', 'Q', 'q', '*1000*', '', '', '', '', '[?]', '*100.000*', '*1.000.000*', '[?]', '[?]', '"', '"', 'R\'', 'r\'', 'G\'', 'g\'', 'G\'', 'g\'', 'G\'', 'g\'', 'Zh\'', 'zh\'', 'Z\'', 'z\'', 'K\'', 'k\'', 'K\'', 'k\'', 'K\'', 'k\'', 'K\'', 'k\'', 'N\'', 'n\'', 'Ng', 'ng', 'P\'', 'p\'', 'Kh', 'kh', 'S\'', 's\'', 'T\'', 't\'', 'U', 'u', 'U\'', 'u\'', 'Kh\'', 'kh\'', 'Tts', 'tts', 'Ch\'', 'ch\'', 'Ch\'', 'ch\'', 'H', 'h', 'Ch', 'ch', 'Ch\'', 'ch\'', '`', 'Zh', 'zh', 'K\'', 'k\'', '[?]', '[?]', 'N\'', 'n\'', '[?]', '[?]', 'Ch', 'ch', '[?]', '[?]', '[?]', 'a', 'a', 'A', 'a', 'Ae', 'ae', 'Ie', 'ie', '@', '@', '@', '@', 'Zh', 'zh', 'Z', 'z', 'Dz', 'dz', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'E', 'e', 'U', 'u', 'U', 'u', 'U', 'u', 'Ch', 'ch', '[?]', '[?]', 'Y', 'y', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x005.php b/vendor/voku/portable-ascii/src/voku/helper/data/x005.php
new file mode 100644
index 000000000..2a2ccdf8c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x005.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'B', 'G', 'D', 'E', 'Z', 'E', 'E', 'T`', 'Zh', 'I', 'L', 'Kh', 'Ts', 'K', 'H', 'Dz', 'Gh', 'Ch', 'M', 'Y', 'N', 'Sh', 'O', 'Ch`', 'P', 'J', 'Rh', 'S', 'V', 'T', 'R', 'Ts`', 'W', 'P`', 'K`', 'O', 'F', '[?]', '[?]', '<', '\'', '/', '!', ',', '?', '.', '[?]', 'a', 'b', 'g', 'd', 'e', 'z', 'e', 'e', 't`', 'zh', 'i', 'l', 'kh', 'ts', 'k', 'h', 'dz', 'gh', 'ch', 'm', 'y', 'n', 'sh', 'o', 'ch`', 'p', 'j', 'rh', 's', 'v', 't', 'r', 'ts`', 'w', 'p`', 'k`', 'o', 'f', 'ew', '[?]', ':', '-', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '@', 'e', 'a', 'o', 'i', 'e', 'e', 'a', 'a', 'o', 'o', 'u', '\'', '', '-', '-', '|', '', '', ':', '', '', 'n', 'o', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'b', 'g', 'd', 'h', 'v', 'z', 'KH', 't', 'y', 'k', 'k', 'l', 'm', 'm', 'n', 'n', 's', '`', 'p', 'p', 'TS', 'TS', 'q', 'r', 'SH', 't', '[?]', '[?]', '[?]', '[?]', '[?]', 'V', 'OY', 'i', '\'', '"', 'v', 'n', 'q', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x006.php b/vendor/voku/portable-ascii/src/voku/helper/data/x006.php
new file mode 100644
index 000000000..a49ed21f1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x006.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ',', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ';', '[?]', '[?]', '[?]', '?', '[?]', '', 'a', 'a', 'w\'', '', 'y\'', '', 'b', '@', 't', 'th', 'j', 'H', 'kh', 'd', 'dh', 'r', 'z', 's', 'sh', 'S', 'D', 'T', 'Z', '`', 'G', '[?]', '[?]', '[?]', '[?]', '[?]', '', 'f', 'q', 'k', 'l', 'm', 'n', 'h', 'w', '~', 'y', 'an', 'un', 'in', 'a', 'u', 'i', 'W', '', '', '\'', '\'', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '%', '.', ',', '*', '[?]', '[?]', '', '\'', '\'', '\'', '', '\'', '\'w', '\'u', '\'y', 'tt', 'tth', 'b', 't', 'T', 'p', 'th', 'bh', '\'h', 'H', 'ny', 'dy', 'H', 'ch', 'cch', 'dd', 'D', 'D', 'Dt', 'dh', 'ddh', 'd', 'D', 'D', 'rr', 'R', 'R', 'R', 'R', 'R', 'R', 'j', 'R', 'S', 'S', 'S', 'S', 'S', 'T', 'GH', 'F', 'F', 'F', 'v', 'f', 'ph', 'Q', 'Q', 'kh', 'k', 'K', 'K', 'ng', 'K', 'g', 'G', 'N', 'G', 'G', 'G', 'L', 'L', 'L', 'L', 'N', 'N', 'N', 'N', 'N', 'h', 'Ch', 'hy', 'h', 'H', '@', 'W', 'oe', 'oe', 'u', 'yu', 'yu', 'W', 'v', 'y', 'Y', 'Y', 'W', '', '', 'y', 'y\'', '.', 'ae', '', '', '', '', '', '', '', '@', '#', '', '', '', '', '', '', '', '', '', '', '^', '', '', '', '', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Sh', 'D', 'Gh', '&', '+m', 'h'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x007.php b/vendor/voku/portable-ascii/src/voku/helper/data/x007.php
new file mode 100644
index 000000000..7e6f3df45
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x007.php
@@ -0,0 +1 @@
+<?php return ['//', '/', ',', '!', '!', '-', ',', ',', ';', '?', '~', '{', '}', '*', '[?]', '', '\'', '', 'b', 'g', 'g', 'd', 'd', 'h', 'w', 'z', 'H', 't', 't', 'y', 'yh', 'k', 'l', 'm', 'n', 's', 's', '`', 'p', 'p', 'S', 'q', 'r', 'sh', 't', '[?]', '[?]', '[?]', 'a', 'a', 'a', 'A', 'A', 'A', 'e', 'e', 'e', 'E', 'i', 'i', 'u', 'u', 'u', 'o', '', '`', '\'', '', '', 'X', 'Q', '@', '@', '|', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'h', 'sh', 'n', 'r', 'b', 'L', 'k', '\'', 'v', 'm', 'f', 'dh', 'th', 'l', 'g', 'ny', 's', 'd', 'z', 't', 'y', 'p', 'j', 'ch', 'tt', 'hh', 'kh', 'th', 'z', 'sh', 's', 'd', 't', 'z', '`', 'gh', 'q', 'w', 'a', 'aa', 'i', 'ee', 'u', 'oo', 'e', 'ey', 'o', 'oa', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x009.php b/vendor/voku/portable-ascii/src/voku/helper/data/x009.php
new file mode 100644
index 000000000..47a9c49e9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x009.php
@@ -0,0 +1 @@
+<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', 'eN', 'e', 'e', 'ai', 'oN', 'o', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'nnn', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'l', 'lll', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'eN', 'e', 'e', 'ai', 'oN', 'o', 'o', 'au', '', '[?]', '[?]', 'AUM', '\'', '\'', '`', '\'', '[?]', '[?]', '[?]', 'q', 'khh', 'ghh', 'z', 'dddh', 'rh', 'f', 'yy', 'RR', 'LL', 'L', 'LL', ' / ', ' // ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', '[?]', 'l', '[?]', '[?]', '[?]', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', 'rr', 'rh', '[?]', 'yy', 'RR', 'LL', 'L', 'LL', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'r\'', 'r`', 'Rs', 'Rs', '1/', '2/', '3/', '4/', ' 1 - 1/', '/16', '', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php
new file mode 100644
index 000000000..ed73cc63a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', 'N', '[?]', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', '[?]', 'ee', 'ai', '[?]', '[?]', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bb', 'm', 'y', 'r', '[?]', 'l', 'll', '[?]', 'v', 'sh', '[?]', 's', 'h', '[?]', '[?]', '\'', '[?]', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', '[?]', 'ee', 'ai', '[?]', '[?]', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'khh', 'ghh', 'z', 'rr', '[?]', 'f', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'N', 'H', '', '', 'G.E.O.', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', 'eN', '[?]', 'e', 'ai', 'oN', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'ya', 'r', '[?]', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'eN', '[?]', 'e', 'ai', 'oN', '[?]', 'o', 'au', '', '[?]', '[?]', 'AUM', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php
new file mode 100644
index 000000000..68d1ab70b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php
@@ -0,0 +1 @@
+<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', '[?]', 'l', 'll', '[?]', '', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', 'rr', 'rh', '[?]', 'yy', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', '[?]', '[?]', '[?]', 'ng', 'c', '[?]', 'j', '[?]', 'ny', 'tt', '[?]', '[?]', '[?]', 'nn', 't', '[?]', '[?]', '[?]', 'n', 'nnn', 'p', '[?]', '[?]', '[?]', 'm', 'y', 'r', 'rr', 'l', 'll', 'lll', 'v', '[?]', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+10+', '+100+', '+1000+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php
new file mode 100644
index 000000000..96b0d1faf
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php
@@ -0,0 +1 @@
+<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'lll', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php
new file mode 100644
index 000000000..a8722bbbd
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', 'lll', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', '[?]', 'e', 'ee', 'ai', '', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'ae', 'aae', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', 'LL', 'e', 'ee', 'ai', 'o', 'oo', 'au', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'nng', 'c', 'ch', 'j', 'jh', 'ny', 'jny', 'nyj', 'tt', 'tth', 'dd', 'ddh', 'nn', 'nndd', 't', 'th', 'd', 'dh', 'n', '[?]', 'nd', 'p', 'ph', 'b', 'bh', 'm', 'mb', 'y', 'r', '[?]', 'l', '[?]', '[?]', 'v', 'sh', 'ss', 's', 'h', 'll', 'f', '[?]', '[?]', '[?]', '', '[?]', '[?]', '[?]', '[?]', 'aa', 'ae', 'aae', 'i', 'ii', 'u', '[?]', 'uu', '[?]', 'R', 'e', 'ee', 'ai', 'o', 'oo', 'au', 'L', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', ' . ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php
new file mode 100644
index 000000000..d48ef5ee2
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php
@@ -0,0 +1 @@
+<?php return ['[?]', 'k', 'kh', 'kh', 'kh', 'kh', 'kh', 'ng', 'cch', 'ch', 'ch', 'ch', 'ch', 'y', 'd', 't', 'th', 'th', 'th', 'n', 'd', 't', 'th', 'th', 'th', 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', 'ph', 'm', 'y', 'r', 'R', 'l', 'L', 'w', 's', 's', 's', 'h', 'l', '`', 'h', '~', 'a', 'a', 'aa', 'am', 'i', 'ii', 'ue', 'uue', 'u', 'uu', '\'', '[?]', '[?]', '[?]', '[?]', 'Bh.', 'e', 'ae', 'o', 'ai', 'ai', 'ao', '+', '', '', '', '', '', '', 'M', '', ' * ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' // ', ' /// ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', '[?]', 'kh', '[?]', '[?]', 'ng', 'ch', '[?]', 's', '[?]', '[?]', 'ny', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'd', 'h', 'th', 'th', '[?]', 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', '[?]', 'm', 'y', 'r', '[?]', 'l', '[?]', 'w', '[?]', '[?]', 's', 'h', '[?]', '`', '', '~', 'a', '', 'aa', 'am', 'i', 'ii', 'y', 'yy', 'u', 'uu', '[?]', 'o', 'l', 'ny', '[?]', '[?]', 'e', 'ei', 'o', 'ay', 'ai', '[?]', '+', '[?]', '', '', '', '', '', 'M', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', 'hn', 'hm', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php
new file mode 100644
index 000000000..1b16ca78d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php
@@ -0,0 +1 @@
+<?php return ['AUM', '', '', '', '', '', '', '', ' // ', ' * ', '', '-', ' / ', ' / ', ' // ', ' -/ ', ' +/ ', ' X/ ', ' /XX/ ', ' /X/ ', ', ', '', '', '', '', '', '', '', '', '', '', '', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.5', '1.5', '2.5', '3.5', '4.5', '5.5', '6.5', '7.5', '8.5', '-.5', '+', '*', '^', '_', '', '~', '[?]', ']', '[[', ']]', '', '', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', '[?]', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', '\'', 'y', 'r', 'l', 'sh', 'ssh', 's', 'h', 'a', 'kss', 'r', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', 'LL', 'e', 'ee', 'o', 'oo', 'M', 'H', 'i', 'ii', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', '[?]', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', '\'', 'y', 'r', 'l', 'sh', 'ss', 's', 'h', 'a', 'kss', 'w', 'y', 'r', '[?]', 'X', ' :X: ', ' /O/ ', ' /o/ ', ' \\o\\ ', ' (O) ', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x010.php b/vendor/voku/portable-ascii/src/voku/helper/data/x010.php
new file mode 100644
index 000000000..b9c3a65b1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x010.php
@@ -0,0 +1 @@
+<?php return ['k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'nny', 'tt', 'tth', 'dd', 'ddh', 'nn', 'tt', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'w', 's', 'h', 'll', 'a', '[?]', 'i', 'ii', 'u', 'uu', 'e', '[?]', 'o', 'au', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'e', 'ai', '[?]', '[?]', '[?]', 'N', '\'', ':', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' / ', ' // ', 'n*', 'r*', 'l*', 'e*', 'sh', 'ss', 'R', 'RR', 'L', 'LL', 'R', 'RR', 'L', 'LL', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'B', 'G', 'D', 'E', 'V', 'Z', 'T`', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Zh', 'R', 'S', 'T', 'U', 'P`', 'K`', 'G\'', 'Q', 'Sh', 'Ch`', 'C`', 'Z\'', 'C', 'Ch', 'X', 'J', 'H', 'E', 'Y', 'W', 'Xh', 'OE', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'b', 'g', 'd', 'e', 'v', 'z', 't`', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'zh', 'r', 's', 't', 'u', 'p`', 'k`', 'g\'', 'q', 'sh', 'ch`', 'c`', 'z\'', 'c', 'ch', 'x', 'j', 'h', 'e', 'y', 'w', 'xh', 'oe', 'f', '[?]', '[?]', '[?]', '[?]', ' // ', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x011.php b/vendor/voku/portable-ascii/src/voku/helper/data/x011.php
new file mode 100644
index 000000000..32bdb8cdb
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x011.php
@@ -0,0 +1 @@
+<?php return ['g', 'gg', 'n', 'd', 'dd', 'r', 'm', 'b', 'bb', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', 'ng', 'nn', 'nd', 'nb', 'dg', 'rn', 'rr', 'rh', 'rN', 'mb', 'mN', 'bg', 'bn', '', 'bs', 'bsg', 'bst', 'bsb', 'bss', 'bsj', 'bj', 'bc', 'bt', 'bp', 'bN', 'bbN', 'sg', 'sn', 'sd', 'sr', 'sm', 'sb', 'sbg', 'sss', 's', 'sj', 'sc', 'sk', 'st', 'sp', 'sh', '', '', '', '', 'Z', 'g', 'd', 'm', 'b', 's', 'Z', '', 'j', 'c', 't', 'p', 'N', 'j', '', '', '', '', 'ck', 'ch', '', '', 'pb', 'pN', 'hh', 'Q', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', 'a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', 'we', 'wi', 'yu', 'eu', 'yi', 'i', 'a-o', 'a-u', 'ya-o', 'ya-yo', 'eo-o', 'eo-u', 'eo-eu', 'yeo-o', 'yeo-u', 'o-eo', 'o-e', 'o-ye', 'o-o', 'o-u', 'yo-ya', 'yo-yae', 'yo-yeo', 'yo-o', 'yo-i', 'u-a', 'u-ae', 'u-eo-eu', 'u-ye', 'u-u', 'yu-a', 'yu-eo', 'yu-e', 'yu-yeo', 'yu-ye', 'yu-u', 'yu-i', 'eu-u', 'eu-eu', 'yi-u', 'i-a', 'i-ya', 'i-o', 'i-u', 'i-eu', 'i-U', 'U', 'U-eo', 'U-u', 'U-i', 'UU', '[?]', '[?]', '[?]', '[?]', '[?]', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'l', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'lh', 'm', 'b', 'bs', 's', 'ss', 'ng', 'j', 'c', 'k', 't', 'p', 'h', 'gl', 'gsg', 'ng', 'nd', 'ns', 'nZ', 'nt', 'dg', 'tl', 'lgs', 'ln', 'ld', 'lth', 'll', 'lmg', 'lms', 'lbs', 'lbh', 'rNp', 'lss', 'lZ', 'lk', 'lQ', 'mg', 'ml', 'mb', 'ms', 'mss', 'mZ', 'mc', 'mh', 'mN', 'bl', 'bp', 'ph', 'pN', 'sg', 'sd', 'sl', 'sb', 'Z', 'g', 'ss', '', 'kh', 'N', 'Ns', 'NZ', 'pb', 'pN', 'hn', 'hl', 'hm', 'hb', 'Q', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x012.php b/vendor/voku/portable-ascii/src/voku/helper/data/x012.php
new file mode 100644
index 000000000..3eeb30aa5
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x012.php
@@ -0,0 +1 @@
+<?php return ['ha', 'hu', 'hi', 'haa', 'hee', 'he', 'ho', '[?]', 'la', 'lu', 'li', 'laa', 'lee', 'le', 'lo', 'lwa', 'hha', 'hhu', 'hhi', 'hhaa', 'hhee', 'hhe', 'hho', 'hhwa', 'ma', 'mu', 'mi', 'maa', 'mee', 'me', 'mo', 'mwa', 'sza', 'szu', 'szi', 'szaa', 'szee', 'sze', 'szo', 'szwa', 'ra', 'ru', 'ri', 'raa', 'ree', 're', 'ro', 'rwa', 'sa', 'su', 'si', 'saa', 'see', 'se', 'so', 'swa', 'sha', 'shu', 'shi', 'shaa', 'shee', 'she', 'sho', 'shwa', 'qa', 'qu', 'qi', 'qaa', 'qee', 'qe', 'qo', '[?]', 'qwa', '[?]', 'qwi', 'qwaa', 'qwee', 'qwe', '[?]', '[?]', 'qha', 'qhu', 'qhi', 'qhaa', 'qhee', 'qhe', 'qho', '[?]', 'qhwa', '[?]', 'qhwi', 'qhwaa', 'qhwee', 'qhwe', '[?]', '[?]', 'ba', 'bu', 'bi', 'baa', 'bee', 'be', 'bo', 'bwa', 'va', 'vu', 'vi', 'vaa', 'vee', 've', 'vo', 'vwa', 'ta', 'tu', 'ti', 'taa', 'tee', 'te', 'to', 'twa', 'ca', 'cu', 'ci', 'caa', 'cee', 'ce', 'co', 'cwa', 'xa', 'xu', 'xi', 'xaa', 'xee', 'xe', 'xo', '[?]', 'xwa', '[?]', 'xwi', 'xwaa', 'xwee', 'xwe', '[?]', '[?]', 'na', 'nu', 'ni', 'naa', 'nee', 'ne', 'no', 'nwa', 'nya', 'nyu', 'nyi', 'nyaa', 'nyee', 'nye', 'nyo', 'nywa', '\'a', '\'u', '[?]', '\'aa', '\'ee', '\'e', '\'o', '\'wa', 'ka', 'ku', 'ki', 'kaa', 'kee', 'ke', 'ko', '[?]', 'kwa', '[?]', 'kwi', 'kwaa', 'kwee', 'kwe', '[?]', '[?]', 'kxa', 'kxu', 'kxi', 'kxaa', 'kxee', 'kxe', 'kxo', '[?]', 'kxwa', '[?]', 'kxwi', 'kxwaa', 'kxwee', 'kxwe', '[?]', '[?]', 'wa', 'wu', 'wi', 'waa', 'wee', 'we', 'wo', '[?]', '`a', '`u', '`i', '`aa', '`ee', '`e', '`o', '[?]', 'za', 'zu', 'zi', 'zaa', 'zee', 'ze', 'zo', 'zwa', 'zha', 'zhu', 'zhi', 'zhaa', 'zhee', 'zhe', 'zho', 'zhwa', 'ya', 'yu', 'yi', 'yaa', 'yee', 'ye', 'yo', '[?]', 'da', 'du', 'di', 'daa', 'dee', 'de', 'do', 'dwa', 'dda', 'ddu', 'ddi', 'ddaa', 'ddee', 'dde', 'ddo', 'ddwa'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x013.php b/vendor/voku/portable-ascii/src/voku/helper/data/x013.php
new file mode 100644
index 000000000..67d59528d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x013.php
@@ -0,0 +1 @@
+<?php return ['ja', 'ju', 'ji', 'jaa', 'jee', 'je', 'jo', 'jwa', 'ga', 'gu', 'gi', 'gaa', 'gee', 'ge', 'go', '[?]', 'gwa', '[?]', 'gwi', 'gwaa', 'gwee', 'gwe', '[?]', '[?]', 'gga', 'ggu', 'ggi', 'ggaa', 'ggee', 'gge', 'ggo', '[?]', 'tha', 'thu', 'thi', 'thaa', 'thee', 'the', 'tho', 'thwa', 'cha', 'chu', 'chi', 'chaa', 'chee', 'che', 'cho', 'chwa', 'pha', 'phu', 'phi', 'phaa', 'phee', 'phe', 'pho', 'phwa', 'tsa', 'tsu', 'tsi', 'tsaa', 'tsee', 'tse', 'tso', 'tswa', 'tza', 'tzu', 'tzi', 'tzaa', 'tzee', 'tze', 'tzo', '[?]', 'fa', 'fu', 'fi', 'faa', 'fee', 'fe', 'fo', 'fwa', 'pa', 'pu', 'pi', 'paa', 'pee', 'pe', 'po', 'pwa', 'rya', 'mya', 'fya', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '.', ',', ';', ':', ':: ', '?', '//', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10+', '20+', '30+', '40+', '50+', '60+', '70+', '80+', '90+', '100+', '10,000+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'e', 'i', 'o', 'u', 'v', 'ga', 'ka', 'ge', 'gi', 'go', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hu', 'hv', 'la', 'le', 'li', 'lo', 'lu', 'lv', 'ma', 'me', 'mi', 'mo', 'mu', 'na', 'hna', 'nah', 'ne', 'ni', 'no', 'nu', 'nv', 'qua', 'que', 'qui', 'quo', 'quu', 'quv', 'sa', 's', 'se', 'si', 'so', 'su', 'sv', 'da', 'ta', 'de', 'te', 'di', 'ti', 'do', 'du', 'dv', 'dla', 'tla', 'tle', 'tli', 'tlo', 'tlu', 'tlv', 'tsa', 'tse', 'tsi', 'tso', 'tsu', 'tsv', 'wa', 'we', 'wi', 'wo', 'wu', 'wv', 'ya', 'ye', 'yi', 'yo', 'yu', 'yv', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x014.php b/vendor/voku/portable-ascii/src/voku/helper/data/x014.php
new file mode 100644
index 000000000..6a9c8862a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x014.php
@@ -0,0 +1 @@
+<?php return ['[?]', 'e', 'aai', 'i', 'ii', 'o', 'oo', 'oo', 'ee', 'i', 'a', 'aa', 'we', 'we', 'wi', 'wi', 'wii', 'wii', 'wo', 'wo', 'woo', 'woo', 'woo', 'wa', 'wa', 'waa', 'waa', 'waa', 'ai', 'w', '\'', 't', 'k', 'sh', 's', 'n', 'w', 'n', '[?]', 'w', 'c', '?', 'l', 'en', 'in', 'on', 'an', 'pe', 'paai', 'pi', 'pii', 'po', 'poo', 'poo', 'hee', 'hi', 'pa', 'paa', 'pwe', 'pwe', 'pwi', 'pwi', 'pwii', 'pwii', 'pwo', 'pwo', 'pwoo', 'pwoo', 'pwa', 'pwa', 'pwaa', 'pwaa', 'pwaa', 'p', 'p', 'h', 'te', 'taai', 'ti', 'tii', 'to', 'too', 'too', 'dee', 'di', 'ta', 'taa', 'twe', 'twe', 'twi', 'twi', 'twii', 'twii', 'two', 'two', 'twoo', 'twoo', 'twa', 'twa', 'twaa', 'twaa', 'twaa', 't', 'tte', 'tti', 'tto', 'tta', 'ke', 'kaai', 'ki', 'kii', 'ko', 'koo', 'koo', 'ka', 'kaa', 'kwe', 'kwe', 'kwi', 'kwi', 'kwii', 'kwii', 'kwo', 'kwo', 'kwoo', 'kwoo', 'kwa', 'kwa', 'kwaa', 'kwaa', 'kwaa', 'k', 'kw', 'keh', 'kih', 'koh', 'kah', 'ce', 'caai', 'ci', 'cii', 'co', 'coo', 'coo', 'ca', 'caa', 'cwe', 'cwe', 'cwi', 'cwi', 'cwii', 'cwii', 'cwo', 'cwo', 'cwoo', 'cwoo', 'cwa', 'cwa', 'cwaa', 'cwaa', 'cwaa', 'c', 'th', 'me', 'maai', 'mi', 'mii', 'mo', 'moo', 'moo', 'ma', 'maa', 'mwe', 'mwe', 'mwi', 'mwi', 'mwii', 'mwii', 'mwo', 'mwo', 'mwoo', 'mwoo', 'mwa', 'mwa', 'mwaa', 'mwaa', 'mwaa', 'm', 'm', 'mh', 'm', 'm', 'ne', 'naai', 'ni', 'nii', 'no', 'noo', 'noo', 'na', 'naa', 'nwe', 'nwe', 'nwa', 'nwa', 'nwaa', 'nwaa', 'nwaa', 'n', 'ng', 'nh', 'le', 'laai', 'li', 'lii', 'lo', 'loo', 'loo', 'la', 'laa', 'lwe', 'lwe', 'lwi', 'lwi', 'lwii', 'lwii', 'lwo', 'lwo', 'lwoo', 'lwoo', 'lwa', 'lwa', 'lwaa', 'lwaa', 'l', 'l', 'l', 'se', 'saai', 'si', 'sii', 'so', 'soo', 'soo', 'sa', 'saa', 'swe', 'swe', 'swi', 'swi', 'swii', 'swii', 'swo', 'swo', 'swoo', 'swoo'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x015.php b/vendor/voku/portable-ascii/src/voku/helper/data/x015.php
new file mode 100644
index 000000000..5a9b0bf12
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x015.php
@@ -0,0 +1 @@
+<?php return ['swa', 'swa', 'swaa', 'swaa', 'swaa', 's', 's', 'sw', 's', 'sk', 'skw', 'sW', 'spwa', 'stwa', 'skwa', 'scwa', 'she', 'shi', 'shii', 'sho', 'shoo', 'sha', 'shaa', 'shwe', 'shwe', 'shwi', 'shwi', 'shwii', 'shwii', 'shwo', 'shwo', 'shwoo', 'shwoo', 'shwa', 'shwa', 'shwaa', 'shwaa', 'sh', 'ye', 'yaai', 'yi', 'yii', 'yo', 'yoo', 'yoo', 'ya', 'yaa', 'ywe', 'ywe', 'ywi', 'ywi', 'ywii', 'ywii', 'ywo', 'ywo', 'ywoo', 'ywoo', 'ywa', 'ywa', 'ywaa', 'ywaa', 'ywaa', 'y', 'y', 'y', 'yi', 're', 're', 'le', 'raai', 'ri', 'rii', 'ro', 'roo', 'lo', 'ra', 'raa', 'la', 'rwaa', 'rwaa', 'r', 'r', 'r', 'fe', 'faai', 'fi', 'fii', 'fo', 'foo', 'fa', 'faa', 'fwaa', 'fwaa', 'f', 'the', 'the', 'thi', 'thi', 'thii', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'thwaa', 'thwaa', 'th', 'tthe', 'tthi', 'ttho', 'ttha', 'tth', 'tye', 'tyi', 'tyo', 'tya', 'he', 'hi', 'hii', 'ho', 'hoo', 'ha', 'haa', 'h', 'h', 'hk', 'qaai', 'qi', 'qii', 'qo', 'qoo', 'qa', 'qaa', 'q', 'tlhe', 'tlhi', 'tlho', 'tlha', 're', 'ri', 'ro', 'ra', 'ngaai', 'ngi', 'ngii', 'ngo', 'ngoo', 'nga', 'ngaa', 'ng', 'nng', 'she', 'shi', 'sho', 'sha', 'the', 'thi', 'tho', 'tha', 'th', 'lhi', 'lhii', 'lho', 'lhoo', 'lha', 'lhaa', 'lh', 'the', 'thi', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'th', 'b', 'e', 'i', 'o', 'a', 'we', 'wi', 'wo', 'wa', 'ne', 'ni', 'no', 'na', 'ke', 'ki', 'ko', 'ka', 'he', 'hi', 'ho', 'ha', 'ghu', 'gho', 'ghe', 'ghee', 'ghi', 'gha', 'ru', 'ro', 're', 'ree', 'ri', 'ra', 'wu', 'wo', 'we', 'wee', 'wi', 'wa', 'hwu', 'hwo', 'hwe', 'hwee', 'hwi', 'hwa', 'thu', 'tho', 'the', 'thee', 'thi', 'tha', 'ttu', 'tto', 'tte', 'ttee', 'tti', 'tta', 'pu', 'po', 'pe', 'pee', 'pi', 'pa', 'p', 'gu', 'go', 'ge', 'gee', 'gi', 'ga', 'khu', 'kho', 'khe', 'khee', 'khi', 'kha', 'kku', 'kko', 'kke', 'kkee', 'kki'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x016.php b/vendor/voku/portable-ascii/src/voku/helper/data/x016.php
new file mode 100644
index 000000000..49b4b937e
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x016.php
@@ -0,0 +1 @@
+<?php return ['kka', 'kk', 'nu', 'no', 'ne', 'nee', 'ni', 'na', 'mu', 'mo', 'me', 'mee', 'mi', 'ma', 'yu', 'yo', 'ye', 'yee', 'yi', 'ya', 'ju', 'ju', 'jo', 'je', 'jee', 'ji', 'ji', 'ja', 'jju', 'jjo', 'jje', 'jjee', 'jji', 'jja', 'lu', 'lo', 'le', 'lee', 'li', 'la', 'dlu', 'dlo', 'dle', 'dlee', 'dli', 'dla', 'lhu', 'lho', 'lhe', 'lhee', 'lhi', 'lha', 'tlhu', 'tlho', 'tlhe', 'tlhee', 'tlhi', 'tlha', 'tlu', 'tlo', 'tle', 'tlee', 'tli', 'tla', 'zu', 'zo', 'ze', 'zee', 'zi', 'za', 'z', 'z', 'dzu', 'dzo', 'dze', 'dzee', 'dzi', 'dza', 'su', 'so', 'se', 'see', 'si', 'sa', 'shu', 'sho', 'she', 'shee', 'shi', 'sha', 'sh', 'tsu', 'tso', 'tse', 'tsee', 'tsi', 'tsa', 'chu', 'cho', 'che', 'chee', 'chi', 'cha', 'ttsu', 'ttso', 'ttse', 'ttsee', 'ttsi', 'ttsa', 'X', '.', 'qai', 'ngai', 'nngi', 'nngii', 'nngo', 'nngoo', 'nnga', 'nngaa', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', 'b', 'l', 'f', 's', 'n', 'h', 'd', 't', 'c', 'q', 'm', 'g', 'ng', 'z', 'r', 'a', 'o', 'u', 'e', 'i', 'ch', 'th', 'ph', 'p', 'x', 'p', '<', '>', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x017.php b/vendor/voku/portable-ascii/src/voku/helper/data/x017.php
new file mode 100644
index 000000000..8f2a7cac1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x017.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 't', 'tth', 'd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'v', 'sh', 'ss', 's', 'h', 'l', 'q', 'a', 'aa', 'i', 'ii', 'u', 'uk', 'uu', 'uuv', 'ry', 'ryy', 'ly', 'lyy', 'e', 'ai', 'oo', 'oo', 'au', 'a', 'aa', 'aa', 'i', 'ii', 'y', 'yy', 'u', 'uu', 'ua', 'oe', 'ya', 'ie', 'e', 'ae', 'ai', 'oo', 'au', 'M', 'H', 'a`', '', '', '', 'r', '', '!', '', '', '', '', '', '.', ' // ', ':', '+', '++', ' * ', ' /// ', 'KR', '\'', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x018.php b/vendor/voku/portable-ascii/src/voku/helper/data/x018.php
new file mode 100644
index 000000000..d4a1350f5
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x018.php
@@ -0,0 +1 @@
+<?php return [' @ ', ' ... ', ', ', '. ', ': ', ' // ', '', '-', ', ', '. ', '', '', '', '', '', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'e', 'i', 'o', 'u', 'O', 'U', 'ee', 'n', 'ng', 'b', 'p', 'q', 'g', 'm', 'l', 's', 'sh', 't', 'd', 'ch', 'j', 'y', 'r', 'w', 'f', 'k', 'kha', 'ts', 'z', 'h', 'zr', 'lh', 'zh', 'ch', '-', 'e', 'i', 'o', 'u', 'O', 'U', 'ng', 'b', 'p', 'q', 'g', 'm', 't', 'd', 'ch', 'j', 'ts', 'y', 'w', 'k', 'g', 'h', 'jy', 'ny', 'dz', 'e', 'i', 'iy', 'U', 'u', 'ng', 'k', 'g', 'h', 'p', 'sh', 't', 'd', 'j', 'f', 'g', 'h', 'ts', 'z', 'r', 'ch', 'zh', 'i', 'k', 'r', 'f', 'zh', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'H', 'X', 'W', 'M', ' 3 ', ' 333 ', 'a', 'i', 'k', 'ng', 'c', 'tt', 'tth', 'dd', 'nn', 't', 'd', 'p', 'ph', 'ss', 'zh', 'z', 'a', 't', 'zh', 'gh', 'ng', 'c', 'jh', 'tta', 'ddh', 't', 'dh', 'ss', 'cy', 'zh', 'z', 'u', 'y', 'bh', '\'', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php
new file mode 100644
index 000000000..2842a4d64
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php
@@ -0,0 +1 @@
+<?php return ['A', 'AE', 'ae', 'B', 'C', 'D', 'D', 'E', 'e', 'i', 'J', 'K', 'L', 'M', 'N', 'O', '', 'O', '', 'O', 'Oe', 'Ou', '', '', 'P', 'R', 'R', 'T', 'U', 'u', 'u', 'm', 'V', 'W', 'Z', '', '', '', '', '', '', '', '', '', 'A', 'AE', 'B', 'B', 'D', 'E', 'E', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'N', 'O', 'Ou', 'P', 'R', 'T', 'U', 'W', 'a', 'a', 'a', 'ae', 'b', 'd', 'e', '', 'e', 'e', 'g', 'i', 'k', 'm', '', 'o', '', '', '', 'p', 't', 'u', 'u', 'm', 'v', '', 'b', 'g', 'd', 'f', '', 'i', 'r', 'u', 'v', 'b', 'g', 'r', 'f', '', '', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'g', '', '', '', '', '', 'p', '', '', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', '', 'v', 'x', 'z', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php
new file mode 100644
index 000000000..24ca9f470
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php
@@ -0,0 +1 @@
+<?php return ['A', 'a', 'B', 'b', 'B', 'b', 'B', 'b', 'C', 'c', 'D', 'd', 'D', 'd', 'D', 'd', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'K', 'k', 'K', 'k', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'M', 'm', 'M', 'm', 'M', 'm', 'N', 'n', 'N', 'n', 'N', 'n', 'N', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'P', 'p', 'P', 'p', 'R', 'r', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'V', 'v', 'V', 'v', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'X', 'x', 'X', 'x', 'Y', 'y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 'h', 't', 'w', 'y', 'a', 's', 's', 's', 'Ss', 'd', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'LL', 'll', 'V', 'v', 'Y', 'y'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php
new file mode 100644
index 000000000..490dd5d9e
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php
@@ -0,0 +1 @@
+<?php return ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'e', 'e', 'e', 'e', 'e', 'e', '[?]', '[?]', 'E', 'E', 'E', 'E', 'E', 'E', '[?]', '[?]', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'o', 'o', 'o', 'o', 'o', 'o', '[?]', '[?]', 'O', 'O', 'O', 'O', 'O', 'O', '[?]', '[?]', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', '[?]', 'U', '[?]', 'U', '[?]', 'U', '[?]', 'U', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'u', 'u', 'o', 'o', '[?]', '[?]', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'a', 'a', 'a', 'a', 'a', '[?]', 'a', 'a', 'A', 'A', 'A', 'A', 'A', '\'', 'i', '\'', '~', '"~', 'e', 'e', 'e', '[?]', 'e', 'e', 'E', 'E', 'E', 'E', 'E', '\'`', '\'\'', '\'~', 'i', 'i', 'i', 'i', '[?]', '[?]', 'i', 'i', 'I', 'I', 'I', 'I', '[?]', '`\'', '`\'', '`~', 'u', 'u', 'u', 'u', 'R', 'R', 'u', 'u', 'U', 'U', 'U', 'U', 'R', '"`', '"\'', '`', '[?]', '[?]', 'o', 'o', 'o', '[?]', 'o', 'o', 'O', 'O', 'O', 'O', 'O', '\'', '`', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x020.php b/vendor/voku/portable-ascii/src/voku/helper/data/x020.php
new file mode 100644
index 000000000..3e8495145
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x020.php
@@ -0,0 +1,4 @@
+<?php return [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '-', '-', '-', '-', '--', '--', '||', '_', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '+', '++', '*', '*>', '.', '..', '...', '.', "\n",
+ "\n\n",
+ '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57
+ '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x021.php b/vendor/voku/portable-ascii/src/voku/helper/data/x021.php
new file mode 100644
index 000000000..1643d67dc
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x021.php
@@ -0,0 +1 @@
+<?php return [' a/c ', ' a/s ', 'C', '', '', ' c/o ', ' c/u ', '', '', '', 'g', 'H', 'H', 'H', 'h', '', 'I', 'I', 'L', 'l', '', 'N', 'No. ', '', '', 'P', 'Q', 'R', 'R', 'R', '', '', '(sm)', 'TEL', '(tm)', '', 'Z', '', '', '', 'Z', '', 'K', 'A', 'B', 'C', 'e', 'e', 'E', 'F', 'F', 'M', 'o', '', '', '', '', 'i', '', 'FAX', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', 'D', 'd', 'e', 'i', 'j', '[?]', '[?]', '[?]', '[?]', 'F', '[?]', ' 1/7 ', ' 1/9 ', ' 1/10 ', ' 1/3 ', ' 2/3 ', ' 1/5 ', ' 2/5 ', ' 3/5 ', ' 4/5 ', ' 1/6 ', ' 5/6 ', ' 1/8 ', ' 3/8 ', ' 5/8 ', ' 7/8 ', ' 1/', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'L', 'C', 'D', 'M', 'i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'xi', 'xii', 'l', 'c', 'd', 'm', '(D', 'D)', '((|))', ')', '[?]', '[?]', '[?]', '[?]', '[?]', ' 0/3 ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '-', '|', '-', '|', '-', '|', '\\', '/', '\\', '/', '-', '-', '~', '~', '-', '|', '-', '|', '-', '-', '-', '|', '-', '|', '|', '-', '-', '-', '-', '-', '-', '|', '|', '|', '|', '|', '|', '|', '^', 'V', '\\', '=', 'V', '^', '-', '-', '|', '|', '-', '-', '|', '|', '=', '|', '=', '=', '|', '=', '|', '=', '=', '=', '=', '=', '=', '|', '=', '|', '=', '|', '\\', '/', '\\', '/', '=', '=', '~', '~', '|', '|', '-', '|', '-', '|', '-', '-', '-', '|', '-', '|', '|', '|', '|', '|', '|', '|', '-', '\\', '\\', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x022.php b/vendor/voku/portable-ascii/src/voku/helper/data/x022.php
new file mode 100644
index 000000000..4a6763e79
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x022.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '-', '[?]', '[?]', '/', '\\', '*', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ':', '[?]', '[?]', '[?]', '[?]', '[?]', '~', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '<=', '>=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x023.php b/vendor/voku/portable-ascii/src/voku/helper/data/x023.php
new file mode 100644
index 000000000..b8f4ca0d2
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x023.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '^', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '<', '> ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x024.php b/vendor/voku/portable-ascii/src/voku/helper/data/x024.php
new file mode 100644
index 000000000..26abcc69a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x024.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '(1)', '(2)', '(3)', '(4)', '(5)', '(6)', '(7)', '(8)', '(9)', '(10)', '(11)', '(12)', '(13)', '(14)', '(15)', '(16)', '(17)', '(18)', '(19)', '(20)', '1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.', '13.', '14.', '15.', '16.', '17.', '18.', '19.', '20.', '(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)', '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', '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', '0', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '0'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x025.php b/vendor/voku/portable-ascii/src/voku/helper/data/x025.php
new file mode 100644
index 000000000..7826f84e7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x025.php
@@ -0,0 +1 @@
+<?php return ['-', '-', '|', '|', '-', '-', '|', '|', '-', '-', '|', '|', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '-', '-', '|', '|', '-', '|', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '/', '\\', 'X', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '-', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '^', '^', '^', '^', '>', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x026.php b/vendor/voku/portable-ascii/src/voku/helper/data/x026.php
new file mode 100644
index 000000000..0c97de3f8
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x026.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '#', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x027.php b/vendor/voku/portable-ascii/src/voku/helper/data/x027.php
new file mode 100644
index 000000000..d24e4401a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x027.php
@@ -0,0 +1 @@
+<?php return ['[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '*', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '|', '', '', '', '', '', '', '[?]', '[?]', '', '!', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[', '[?]', '<', '> ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x028.php b/vendor/voku/portable-ascii/src/voku/helper/data/x028.php
new file mode 100644
index 000000000..9585d9149
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x028.php
@@ -0,0 +1 @@
+<?php return [' ', 'a', '1', 'b', '\'', 'k', '2', 'l', '@', 'c', 'i', 'f', '/', 'm', 's', 'p', '"', 'e', '3', 'h', '9', 'o', '6', 'r', '^', 'd', 'j', 'g', '>', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x029.php b/vendor/voku/portable-ascii/src/voku/helper/data/x029.php
new file mode 100644
index 000000000..5162de386
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x029.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '{', '} ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php
new file mode 100644
index 000000000..e3ca5520b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '::=', '==', '===', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php
new file mode 100644
index 000000000..31f84d814
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'L', 'l', 'L', 'P', 'R', 'a', 't', 'H', 'h', 'K', 'k', 'Z', 'z', '', 'M', 'A', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php
new file mode 100644
index 000000000..b45c47093
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php
@@ -0,0 +1 @@
+<?php return ['r', 'r.', '[?]', '[?]', '[?]', '[?]', 'T', 'T.', '[?]', 's', '[?]', '[]', '\\', '/', '[?]', '__', '[?]', '[?]', '>', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php
new file mode 100644
index 000000000..5147b5740
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php
@@ -0,0 +1 @@
+<?php return ['[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x030.php b/vendor/voku/portable-ascii/src/voku/helper/data/x030.php
new file mode 100644
index 000000000..5880d768b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x030.php
@@ -0,0 +1,9 @@
+<?php return [' ', ', ', '. ', '"', '[JIS]', '"', '/', '0', '<', '> ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57
+ 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61
+ 'di', 'tsu', // 0x63
+ 'tsu', // 0x64
+ 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7
+ 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1
+ 'di', 'tsu', // 0xc3
+ 'tsu', // 0xc4
+ 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x031.php b/vendor/voku/portable-ascii/src/voku/helper/data/x031.php
new file mode 100644
index 000000000..72c0260cf
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x031.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', 'B', 'P', 'M', 'F', 'D', 'T', 'N', 'L', 'G', 'K', 'H', 'J', 'Q', 'X', 'ZH', 'CH', 'SH', 'R', 'Z', 'C', 'S', 'A', 'O', 'E', 'EH', 'AI', 'EI', 'AU', 'OU', 'AN', 'EN', 'ANG', 'ENG', 'ER', 'I', 'U', 'IU', 'V', 'NG', 'GN', '[?]', '[?]', '[?]', '[?]', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', 'a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', 'we', 'wi', 'yu', 'eu', 'yi', 'i', '', 'nn', 'nd', 'ns', 'nZ', 'lgs', 'ld', 'lbs', 'lZ', 'lQ', 'mb', 'ms', 'mZ', 'mN', 'bg', '', 'bsg', 'bst', 'bj', 'bt', 'bN', 'bbN', 'sg', 'sn', 'sd', 'sb', 'sj', 'Z', '', 'N', 'Ns', 'NZ', 'pN', 'hh', 'Q', 'yo-ya', 'yo-yae', 'yo-i', 'yu-yeo', 'yu-ye', 'yu-i', 'U', 'U-i', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'BU', 'ZI', 'JI', 'GU', 'EE', 'ENN', 'OO', 'ONN', 'IR', 'ANN', 'INN', 'UNN', 'IM', 'NGG', 'AINN', 'AUNN', 'AM', 'OM', 'ONG', 'INNN', 'P', 'T', 'K', 'H', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x032.php b/vendor/voku/portable-ascii/src/voku/helper/data/x032.php
new file mode 100644
index 000000000..f5df8c8b2
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x032.php
@@ -0,0 +1 @@
+<?php return ['(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '(ju)', '[?]', '[?]', '[?]', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Dai) ', '(Hu) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ji) ', '(Xiu) ', '<<', '>>', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x033.php b/vendor/voku/portable-ascii/src/voku/helper/data/x033.php
new file mode 100644
index 000000000..8505337e3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x033.php
@@ -0,0 +1 @@
+<?php return ['apartment', 'alpha', 'ampere', 'are', 'inning', 'inch', 'won', 'escudo', 'acre', 'ounce', 'ohm', 'kai-ri', 'carat', 'calorie', 'gallon', 'gamma', 'giga', 'guinea', 'curie', 'guilder', 'kilo', 'kilogram', 'kilometer', 'kilowatt', 'gram', 'gram ton', 'cruzeiro', 'krone', 'case', 'koruna', 'co-op', 'cycle', 'centime', 'shilling', 'centi', 'cent', 'dozen', 'desi', 'dollar', 'ton', 'nano', 'knot', 'heights', 'percent', 'parts', 'barrel', 'piaster', 'picul', 'pico', 'building', 'farad', 'feet', 'bushel', 'franc', 'hectare', 'peso', 'pfennig', 'hertz', 'pence', 'page', 'beta', 'point', 'volt', 'hon', 'pound', 'hall', 'horn', 'micro', 'mile', 'mach', 'mark', 'mansion', 'micron', 'milli', 'millibar', 'mega', 'megaton', 'meter', 'yard', 'yard', 'yuan', 'liter', 'lira', 'rupee', 'ruble', 'rem', 'roentgen', 'watt', '0h', '1h', '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', '10h', '11h', '12h', '13h', '14h', '15h', '16h', '17h', '18h', '19h', '20h', '21h', '22h', '23h', '24h', 'hPa', 'da', 'AU', 'bar', 'oV', 'pc', 'dm', 'dm^2', 'dm^3', 'IU', 'Heisei', 'Syouwa', 'Taisyou', 'Meiji', 'Inc.', 'pA', 'nA', 'microamp', 'mA', 'kA', 'kB', 'MB', 'GB', 'cal', 'kcal', 'pF', 'nF', 'microFarad', 'microgram', 'mg', 'kg', 'Hz', 'kHz', 'MHz', 'GHz', 'THz', 'microliter', 'ml', 'dl', 'kl', 'fm', 'nm', 'micrometer', 'mm', 'cm', 'km', 'mm^2', 'cm^2', 'm^2', 'km^2', 'mm^3', 'cm^3', 'm^3', 'km^3', 'm/s', 'm/s^2', 'Pa', 'kPa', 'MPa', 'GPa', 'rad', 'rad/s', 'rad/s^2', 'ps', 'ns', 'microsecond', 'ms', 'pV', 'nV', 'microvolt', 'mV', 'kV', 'MV', 'pW', 'nW', 'microwatt', 'mW', 'kW', 'MW', 'kOhm', 'MOhm', 'a.m.', 'Bq', 'cc', 'cd', 'C/kg', 'Co.', 'dB', 'Gy', 'ha', 'HP', 'in', 'K.K.', 'KM', 'kt', 'lm', 'ln', 'log', 'lx', 'mb', 'mil', 'mol', 'pH', 'p.m.', 'PPM', 'PR', 'sr', 'Sv', 'Wb', '[?]', '[?]', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', '10d', '11d', '12d', '13d', '14d', '15d', '16d', '17d', '18d', '19d', '20d', '21d', '22d', '23d', '24d', '25d', '26d', '27d', '28d', '29d', '30d', '31d', 'gal'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php
new file mode 100644
index 000000000..59b23f524
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php
@@ -0,0 +1 @@
+<?php return ['[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php
new file mode 100644
index 000000000..ae51afcca
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php
@@ -0,0 +1 @@
+<?php return ['Yi ', 'Ding ', 'Kao ', 'Qi ', 'Shang ', 'Xia ', '[?] ', 'Mo ', 'Zhang ', 'San ', 'Shang ', 'Xia ', 'Ji ', 'Bu ', 'Yu ', 'Mian ', 'Gai ', 'Chou ', 'Chou ', 'Zhuan ', 'Qie ', 'Pi ', 'Shi ', 'Shi ', 'Qiu ', 'Bing ', 'Ye ', 'Cong ', 'Dong ', 'Si ', 'Cheng ', 'Diu ', 'Qiu ', 'Liang ', 'Diu ', 'You ', 'Liang ', 'Yan ', 'Bing ', 'Sang ', 'Gun ', 'Jiu ', 'Ge ', 'Ya ', 'Qiang ', 'Zhong ', 'Ji ', 'Jie ', 'Feng ', 'Guan ', 'Chuan ', 'Chan ', 'Lin ', 'Zhuo ', 'Zhu ', 'Ha ', 'Wan ', 'Dan ', 'Wei ', 'Zhu ', 'Jing ', 'Li ', 'Ju ', 'Pie ', 'Fu ', 'Yi ', 'Yi ', 'Nai ', 'Shime ', 'Jiu ', 'Jiu ', 'Zhe ', 'Yao ', 'Yi ', '[?] ', 'Zhi ', 'Wu ', 'Zha ', 'Hu ', 'Fa ', 'Le ', 'Zhong ', 'Ping ', 'Pang ', 'Qiao ', 'Hu ', 'Guai ', 'Cheng ', 'Cheng ', 'Yi ', 'Yin ', '[?] ', 'Mie ', 'Jiu ', 'Qi ', 'Ye ', 'Xi ', 'Xiang ', 'Gai ', 'Diu ', 'Hal ', '[?] ', 'Shu ', 'Twul ', 'Shi ', 'Ji ', 'Nang ', 'Jia ', 'Kel ', 'Shi ', '[?] ', 'Ol ', 'Mai ', 'Luan ', 'Cal ', 'Ru ', 'Xue ', 'Yan ', 'Fu ', 'Sha ', 'Na ', 'Gan ', 'Sol ', 'El ', 'Cwul ', '[?] ', 'Gan ', 'Chi ', 'Gui ', 'Gan ', 'Luan ', 'Lin ', 'Yi ', 'Jue ', 'Liao ', 'Ma ', 'Yu ', 'Zheng ', 'Shi ', 'Shi ', 'Er ', 'Chu ', 'Yu ', 'Yu ', 'Yu ', 'Yun ', 'Hu ', 'Qi ', 'Wu ', 'Jing ', 'Si ', 'Sui ', 'Gen ', 'Gen ', 'Ya ', 'Xie ', 'Ya ', 'Qi ', 'Ya ', 'Ji ', 'Tou ', 'Wang ', 'Kang ', 'Ta ', 'Jiao ', 'Hai ', 'Yi ', 'Chan ', 'Heng ', 'Mu ', '[?] ', 'Xiang ', 'Jing ', 'Ting ', 'Liang ', 'Xiang ', 'Jing ', 'Ye ', 'Qin ', 'Bo ', 'You ', 'Xie ', 'Dan ', 'Lian ', 'Duo ', 'Wei ', 'Ren ', 'Ren ', 'Ji ', 'La ', 'Wang ', 'Yi ', 'Shi ', 'Ren ', 'Le ', 'Ding ', 'Ze ', 'Jin ', 'Pu ', 'Chou ', 'Ba ', 'Zhang ', 'Jin ', 'Jie ', 'Bing ', 'Reng ', 'Cong ', 'Fo ', 'San ', 'Lun ', 'Sya ', 'Cang ', 'Zi ', 'Shi ', 'Ta ', 'Zhang ', 'Fu ', 'Xian ', 'Xian ', 'Tuo ', 'Hong ', 'Tong ', 'Ren ', 'Qian ', 'Gan ', 'Yi ', 'Di ', 'Dai ', 'Ling ', 'Yi ', 'Chao ', 'Chang ', 'Sa ', '[?] ', 'Yi ', 'Mu ', 'Men ', 'Ren ', 'Jia ', 'Chao ', 'Yang ', 'Qian ', 'Zhong ', 'Pi ', 'Wan ', 'Wu ', 'Jian ', 'Jie ', 'Yao ', 'Feng ', 'Cang ', 'Ren ', 'Wang ', 'Fen ', 'Di ', 'Fang '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php
new file mode 100644
index 000000000..a42bb3e74
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php
@@ -0,0 +1 @@
+<?php return ['Zhong ', 'Qi ', 'Pei ', 'Yu ', 'Diao ', 'Dun ', 'Wen ', 'Yi ', 'Xin ', 'Kang ', 'Yi ', 'Ji ', 'Ai ', 'Wu ', 'Ji ', 'Fu ', 'Fa ', 'Xiu ', 'Jin ', 'Bei ', 'Dan ', 'Fu ', 'Tang ', 'Zhong ', 'You ', 'Huo ', 'Hui ', 'Yu ', 'Cui ', 'Chuan ', 'San ', 'Wei ', 'Chuan ', 'Che ', 'Ya ', 'Xian ', 'Shang ', 'Chang ', 'Lun ', 'Cang ', 'Xun ', 'Xin ', 'Wei ', 'Zhu ', '[?] ', 'Xuan ', 'Nu ', 'Bo ', 'Gu ', 'Ni ', 'Ni ', 'Xie ', 'Ban ', 'Xu ', 'Ling ', 'Zhou ', 'Shen ', 'Qu ', 'Si ', 'Beng ', 'Si ', 'Jia ', 'Pi ', 'Yi ', 'Si ', 'Ai ', 'Zheng ', 'Dian ', 'Han ', 'Mai ', 'Dan ', 'Zhu ', 'Bu ', 'Qu ', 'Bi ', 'Shao ', 'Ci ', 'Wei ', 'Di ', 'Zhu ', 'Zuo ', 'You ', 'Yang ', 'Ti ', 'Zhan ', 'He ', 'Bi ', 'Tuo ', 'She ', 'Yu ', 'Yi ', 'Fo ', 'Zuo ', 'Kou ', 'Ning ', 'Tong ', 'Ni ', 'Xuan ', 'Qu ', 'Yong ', 'Wa ', 'Qian ', '[?] ', 'Ka ', '[?] ', 'Pei ', 'Huai ', 'He ', 'Lao ', 'Xiang ', 'Ge ', 'Yang ', 'Bai ', 'Fa ', 'Ming ', 'Jia ', 'Er ', 'Bing ', 'Ji ', 'Hen ', 'Huo ', 'Gui ', 'Quan ', 'Tiao ', 'Jiao ', 'Ci ', 'Yi ', 'Shi ', 'Xing ', 'Shen ', 'Tuo ', 'Kan ', 'Zhi ', 'Gai ', 'Lai ', 'Yi ', 'Chi ', 'Kua ', 'Guang ', 'Li ', 'Yin ', 'Shi ', 'Mi ', 'Zhu ', 'Xu ', 'You ', 'An ', 'Lu ', 'Mou ', 'Er ', 'Lun ', 'Tong ', 'Cha ', 'Chi ', 'Xun ', 'Gong ', 'Zhou ', 'Yi ', 'Ru ', 'Jian ', 'Xia ', 'Jia ', 'Zai ', 'Lu ', 'Ko ', 'Jiao ', 'Zhen ', 'Ce ', 'Qiao ', 'Kuai ', 'Chai ', 'Ning ', 'Nong ', 'Jin ', 'Wu ', 'Hou ', 'Jiong ', 'Cheng ', 'Zhen ', 'Zuo ', 'Chou ', 'Qin ', 'Lu ', 'Ju ', 'Shu ', 'Ting ', 'Shen ', 'Tuo ', 'Bo ', 'Nan ', 'Hao ', 'Bian ', 'Tui ', 'Yu ', 'Xi ', 'Cu ', 'E ', 'Qiu ', 'Xu ', 'Kuang ', 'Ku ', 'Wu ', 'Jun ', 'Yi ', 'Fu ', 'Lang ', 'Zu ', 'Qiao ', 'Li ', 'Yong ', 'Hun ', 'Jing ', 'Xian ', 'San ', 'Pai ', 'Su ', 'Fu ', 'Xi ', 'Li ', 'Fu ', 'Ping ', 'Bao ', 'Yu ', 'Si ', 'Xia ', 'Xin ', 'Xiu ', 'Yu ', 'Ti ', 'Che ', 'Chou ', '[?] ', 'Yan ', 'Lia ', 'Li ', 'Lai ', '[?] ', 'Jian ', 'Xiu ', 'Fu ', 'He ', 'Ju ', 'Xiao ', 'Pai ', 'Jian ', 'Biao ', 'Chu ', 'Fei ', 'Feng ', 'Ya ', 'An ', 'Bei ', 'Yu ', 'Xin ', 'Bi ', 'Jian '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x050.php b/vendor/voku/portable-ascii/src/voku/helper/data/x050.php
new file mode 100644
index 000000000..14db069b3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x050.php
@@ -0,0 +1 @@
+<?php return ['Chang ', 'Chi ', 'Bing ', 'Zan ', 'Yao ', 'Cui ', 'Lia ', 'Wan ', 'Lai ', 'Cang ', 'Zong ', 'Ge ', 'Guan ', 'Bei ', 'Tian ', 'Shu ', 'Shu ', 'Men ', 'Dao ', 'Tan ', 'Jue ', 'Chui ', 'Xing ', 'Peng ', 'Tang ', 'Hou ', 'Yi ', 'Qi ', 'Ti ', 'Gan ', 'Jing ', 'Jie ', 'Sui ', 'Chang ', 'Jie ', 'Fang ', 'Zhi ', 'Kong ', 'Juan ', 'Zong ', 'Ju ', 'Qian ', 'Ni ', 'Lun ', 'Zhuo ', 'Wei ', 'Luo ', 'Song ', 'Leng ', 'Hun ', 'Dong ', 'Zi ', 'Ben ', 'Wu ', 'Ju ', 'Nai ', 'Cai ', 'Jian ', 'Zhai ', 'Ye ', 'Zhi ', 'Sha ', 'Qing ', '[?] ', 'Ying ', 'Cheng ', 'Jian ', 'Yan ', 'Nuan ', 'Zhong ', 'Chun ', 'Jia ', 'Jie ', 'Wei ', 'Yu ', 'Bing ', 'Ruo ', 'Ti ', 'Wei ', 'Pian ', 'Yan ', 'Feng ', 'Tang ', 'Wo ', 'E ', 'Xie ', 'Che ', 'Sheng ', 'Kan ', 'Di ', 'Zuo ', 'Cha ', 'Ting ', 'Bei ', 'Ye ', 'Huang ', 'Yao ', 'Zhan ', 'Chou ', 'Yan ', 'You ', 'Jian ', 'Xu ', 'Zha ', 'Ci ', 'Fu ', 'Bi ', 'Zhi ', 'Zong ', 'Mian ', 'Ji ', 'Yi ', 'Xie ', 'Xun ', 'Si ', 'Duan ', 'Ce ', 'Zhen ', 'Ou ', 'Tou ', 'Tou ', 'Bei ', 'Za ', 'Lu ', 'Jie ', 'Wei ', 'Fen ', 'Chang ', 'Gui ', 'Sou ', 'Zhi ', 'Su ', 'Xia ', 'Fu ', 'Yuan ', 'Rong ', 'Li ', 'Ru ', 'Yun ', 'Gou ', 'Ma ', 'Bang ', 'Dian ', 'Tang ', 'Hao ', 'Jie ', 'Xi ', 'Shan ', 'Qian ', 'Jue ', 'Cang ', 'Chu ', 'San ', 'Bei ', 'Xiao ', 'Yong ', 'Yao ', 'Tan ', 'Suo ', 'Yang ', 'Fa ', 'Bing ', 'Jia ', 'Dai ', 'Zai ', 'Tang ', '[?] ', 'Bin ', 'Chu ', 'Nuo ', 'Can ', 'Lei ', 'Cui ', 'Yong ', 'Zao ', 'Zong ', 'Peng ', 'Song ', 'Ao ', 'Chuan ', 'Yu ', 'Zhai ', 'Cou ', 'Shang ', 'Qiang ', 'Jing ', 'Chi ', 'Sha ', 'Han ', 'Zhang ', 'Qing ', 'Yan ', 'Di ', 'Xi ', 'Lu ', 'Bei ', 'Piao ', 'Jin ', 'Lian ', 'Lu ', 'Man ', 'Qian ', 'Xian ', 'Tan ', 'Ying ', 'Dong ', 'Zhuan ', 'Xiang ', 'Shan ', 'Qiao ', 'Jiong ', 'Tui ', 'Zun ', 'Pu ', 'Xi ', 'Lao ', 'Chang ', 'Guang ', 'Liao ', 'Qi ', 'Deng ', 'Chan ', 'Wei ', 'Ji ', 'Fan ', 'Hui ', 'Chuan ', 'Jian ', 'Dan ', 'Jiao ', 'Jiu ', 'Seng ', 'Fen ', 'Xian ', 'Jue ', 'E ', 'Jiao ', 'Jian ', 'Tong ', 'Lin ', 'Bo ', 'Gu ', '[?] ', 'Su ', 'Xian ', 'Jiang ', 'Min ', 'Ye ', 'Jin ', 'Jia ', 'Qiao ', 'Pi ', 'Feng ', 'Zhou ', 'Ai ', 'Sai '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x051.php b/vendor/voku/portable-ascii/src/voku/helper/data/x051.php
new file mode 100644
index 000000000..a5dec8103
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x051.php
@@ -0,0 +1 @@
+<?php return ['Yi ', 'Jun ', 'Nong ', 'Chan ', 'Yi ', 'Dang ', 'Jing ', 'Xuan ', 'Kuai ', 'Jian ', 'Chu ', 'Dan ', 'Jiao ', 'Sha ', 'Zai ', '[?] ', 'Bin ', 'An ', 'Ru ', 'Tai ', 'Chou ', 'Chai ', 'Lan ', 'Ni ', 'Jin ', 'Qian ', 'Meng ', 'Wu ', 'Ning ', 'Qiong ', 'Ni ', 'Chang ', 'Lie ', 'Lei ', 'Lu ', 'Kuang ', 'Bao ', 'Du ', 'Biao ', 'Zan ', 'Zhi ', 'Si ', 'You ', 'Hao ', 'Chen ', 'Chen ', 'Li ', 'Teng ', 'Wei ', 'Long ', 'Chu ', 'Chan ', 'Rang ', 'Shu ', 'Hui ', 'Li ', 'Luo ', 'Zan ', 'Nuo ', 'Tang ', 'Yan ', 'Lei ', 'Nang ', 'Er ', 'Wu ', 'Yun ', 'Zan ', 'Yuan ', 'Xiong ', 'Chong ', 'Zhao ', 'Xiong ', 'Xian ', 'Guang ', 'Dui ', 'Ke ', 'Dui ', 'Mian ', 'Tu ', 'Chang ', 'Er ', 'Dui ', 'Er ', 'Xin ', 'Tu ', 'Si ', 'Yan ', 'Yan ', 'Shi ', 'Shi ', 'Dang ', 'Qian ', 'Dou ', 'Fen ', 'Mao ', 'Shen ', 'Dou ', 'Bai ', 'Jing ', 'Li ', 'Huang ', 'Ru ', 'Wang ', 'Nei ', 'Quan ', 'Liang ', 'Yu ', 'Ba ', 'Gong ', 'Liu ', 'Xi ', '[?] ', 'Lan ', 'Gong ', 'Tian ', 'Guan ', 'Xing ', 'Bing ', 'Qi ', 'Ju ', 'Dian ', 'Zi ', 'Ppwun ', 'Yang ', 'Jian ', 'Shou ', 'Ji ', 'Yi ', 'Ji ', 'Chan ', 'Jiong ', 'Mao ', 'Ran ', 'Nei ', 'Yuan ', 'Mao ', 'Gang ', 'Ran ', 'Ce ', 'Jiong ', 'Ce ', 'Zai ', 'Gua ', 'Jiong ', 'Mao ', 'Zhou ', 'Mou ', 'Gou ', 'Xu ', 'Mian ', 'Mi ', 'Rong ', 'Yin ', 'Xie ', 'Kan ', 'Jun ', 'Nong ', 'Yi ', 'Mi ', 'Shi ', 'Guan ', 'Meng ', 'Zhong ', 'Ju ', 'Yuan ', 'Ming ', 'Kou ', 'Lam ', 'Fu ', 'Xie ', 'Mi ', 'Bing ', 'Dong ', 'Tai ', 'Gang ', 'Feng ', 'Bing ', 'Hu ', 'Chong ', 'Jue ', 'Hu ', 'Kuang ', 'Ye ', 'Leng ', 'Pan ', 'Fu ', 'Min ', 'Dong ', 'Xian ', 'Lie ', 'Xia ', 'Jian ', 'Jing ', 'Shu ', 'Mei ', 'Tu ', 'Qi ', 'Gu ', 'Zhun ', 'Song ', 'Jing ', 'Liang ', 'Qing ', 'Diao ', 'Ling ', 'Dong ', 'Gan ', 'Jian ', 'Yin ', 'Cou ', 'Yi ', 'Li ', 'Cang ', 'Ming ', 'Zhuen ', 'Cui ', 'Si ', 'Duo ', 'Jin ', 'Lin ', 'Lin ', 'Ning ', 'Xi ', 'Du ', 'Ji ', 'Fan ', 'Fan ', 'Fan ', 'Feng ', 'Ju ', 'Chu ', 'Tako ', 'Feng ', 'Mok ', 'Ci ', 'Fu ', 'Feng ', 'Ping ', 'Feng ', 'Kai ', 'Huang ', 'Kai ', 'Gan ', 'Deng ', 'Ping ', 'Qu ', 'Xiong ', 'Kuai ', 'Tu ', 'Ao ', 'Chu ', 'Ji ', 'Dang ', 'Han ', 'Han ', 'Zao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x052.php b/vendor/voku/portable-ascii/src/voku/helper/data/x052.php
new file mode 100644
index 000000000..91d904530
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x052.php
@@ -0,0 +1 @@
+<?php return ['Dao ', 'Diao ', 'Dao ', 'Ren ', 'Ren ', 'Chuang ', 'Fen ', 'Qie ', 'Yi ', 'Ji ', 'Kan ', 'Qian ', 'Cun ', 'Chu ', 'Wen ', 'Ji ', 'Dan ', 'Xing ', 'Hua ', 'Wan ', 'Jue ', 'Li ', 'Yue ', 'Lie ', 'Liu ', 'Ze ', 'Gang ', 'Chuang ', 'Fu ', 'Chu ', 'Qu ', 'Ju ', 'Shan ', 'Min ', 'Ling ', 'Zhong ', 'Pan ', 'Bie ', 'Jie ', 'Jie ', 'Bao ', 'Li ', 'Shan ', 'Bie ', 'Chan ', 'Jing ', 'Gua ', 'Gen ', 'Dao ', 'Chuang ', 'Kui ', 'Ku ', 'Duo ', 'Er ', 'Zhi ', 'Shua ', 'Quan ', 'Cha ', 'Ci ', 'Ke ', 'Jie ', 'Gui ', 'Ci ', 'Gui ', 'Kai ', 'Duo ', 'Ji ', 'Ti ', 'Jing ', 'Lou ', 'Gen ', 'Ze ', 'Yuan ', 'Cuo ', 'Xue ', 'Ke ', 'La ', 'Qian ', 'Cha ', 'Chuang ', 'Gua ', 'Jian ', 'Cuo ', 'Li ', 'Ti ', 'Fei ', 'Pou ', 'Chan ', 'Qi ', 'Chuang ', 'Zi ', 'Gang ', 'Wan ', 'Bo ', 'Ji ', 'Duo ', 'Qing ', 'Yan ', 'Zhuo ', 'Jian ', 'Ji ', 'Bo ', 'Yan ', 'Ju ', 'Huo ', 'Sheng ', 'Jian ', 'Duo ', 'Duan ', 'Wu ', 'Gua ', 'Fu ', 'Sheng ', 'Jian ', 'Ge ', 'Zha ', 'Kai ', 'Chuang ', 'Juan ', 'Chan ', 'Tuan ', 'Lu ', 'Li ', 'Fou ', 'Shan ', 'Piao ', 'Kou ', 'Jiao ', 'Gua ', 'Qiao ', 'Jue ', 'Hua ', 'Zha ', 'Zhuo ', 'Lian ', 'Ju ', 'Pi ', 'Liu ', 'Gui ', 'Jiao ', 'Gui ', 'Jian ', 'Jian ', 'Tang ', 'Huo ', 'Ji ', 'Jian ', 'Yi ', 'Jian ', 'Zhi ', 'Chan ', 'Cuan ', 'Mo ', 'Li ', 'Zhu ', 'Li ', 'Ya ', 'Quan ', 'Ban ', 'Gong ', 'Jia ', 'Wu ', 'Mai ', 'Lie ', 'Jin ', 'Keng ', 'Xie ', 'Zhi ', 'Dong ', 'Zhu ', 'Nu ', 'Jie ', 'Qu ', 'Shao ', 'Yi ', 'Zhu ', 'Miao ', 'Li ', 'Jing ', 'Lao ', 'Lao ', 'Juan ', 'Kou ', 'Yang ', 'Wa ', 'Xiao ', 'Mou ', 'Kuang ', 'Jie ', 'Lie ', 'He ', 'Shi ', 'Ke ', 'Jing ', 'Hao ', 'Bo ', 'Min ', 'Chi ', 'Lang ', 'Yong ', 'Yong ', 'Mian ', 'Ke ', 'Xun ', 'Juan ', 'Qing ', 'Lu ', 'Pou ', 'Meng ', 'Lai ', 'Le ', 'Kai ', 'Mian ', 'Dong ', 'Xu ', 'Xu ', 'Kan ', 'Wu ', 'Yi ', 'Xun ', 'Weng ', 'Sheng ', 'Lao ', 'Mu ', 'Lu ', 'Piao ', 'Shi ', 'Ji ', 'Qin ', 'Qiang ', 'Jiao ', 'Quan ', 'Yang ', 'Yi ', 'Jue ', 'Fan ', 'Juan ', 'Tong ', 'Ju ', 'Dan ', 'Xie ', 'Mai ', 'Xun ', 'Xun ', 'Lu ', 'Li ', 'Che ', 'Rang ', 'Quan ', 'Bao ', 'Shao ', 'Yun ', 'Jiu ', 'Bao ', 'Gou ', 'Wu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x053.php b/vendor/voku/portable-ascii/src/voku/helper/data/x053.php
new file mode 100644
index 000000000..ffb671fc4
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x053.php
@@ -0,0 +1 @@
+<?php return ['Yun ', 'Mwun ', 'Nay ', 'Gai ', 'Gai ', 'Bao ', 'Cong ', '[?] ', 'Xiong ', 'Peng ', 'Ju ', 'Tao ', 'Ge ', 'Pu ', 'An ', 'Pao ', 'Fu ', 'Gong ', 'Da ', 'Jiu ', 'Qiong ', 'Bi ', 'Hua ', 'Bei ', 'Nao ', 'Chi ', 'Fang ', 'Jiu ', 'Yi ', 'Za ', 'Jiang ', 'Kang ', 'Jiang ', 'Kuang ', 'Hu ', 'Xia ', 'Qu ', 'Bian ', 'Gui ', 'Qie ', 'Zang ', 'Kuang ', 'Fei ', 'Hu ', 'Tou ', 'Gui ', 'Gui ', 'Hui ', 'Dan ', 'Gui ', 'Lian ', 'Lian ', 'Suan ', 'Du ', 'Jiu ', 'Qu ', 'Xi ', 'Pi ', 'Qu ', 'Yi ', 'Qia ', 'Yan ', 'Bian ', 'Ni ', 'Qu ', 'Shi ', 'Xin ', 'Qian ', 'Nian ', 'Sa ', 'Zu ', 'Sheng ', 'Wu ', 'Hui ', 'Ban ', 'Shi ', 'Xi ', 'Wan ', 'Hua ', 'Xie ', 'Wan ', 'Bei ', 'Zu ', 'Zhuo ', 'Xie ', 'Dan ', 'Mai ', 'Nan ', 'Dan ', 'Ji ', 'Bo ', 'Shuai ', 'Bu ', 'Kuang ', 'Bian ', 'Bu ', 'Zhan ', 'Qia ', 'Lu ', 'You ', 'Lu ', 'Xi ', 'Gua ', 'Wo ', 'Xie ', 'Jie ', 'Jie ', 'Wei ', 'Ang ', 'Qiong ', 'Zhi ', 'Mao ', 'Yin ', 'Wei ', 'Shao ', 'Ji ', 'Que ', 'Luan ', 'Shi ', 'Juan ', 'Xie ', 'Xu ', 'Jin ', 'Que ', 'Wu ', 'Ji ', 'E ', 'Qing ', 'Xi ', '[?] ', 'Han ', 'Zhan ', 'E ', 'Ting ', 'Li ', 'Zhe ', 'Han ', 'Li ', 'Ya ', 'Ya ', 'Yan ', 'She ', 'Zhi ', 'Zha ', 'Pang ', '[?] ', 'He ', 'Ya ', 'Zhi ', 'Ce ', 'Pang ', 'Ti ', 'Li ', 'She ', 'Hou ', 'Ting ', 'Zui ', 'Cuo ', 'Fei ', 'Yuan ', 'Ce ', 'Yuan ', 'Xiang ', 'Yan ', 'Li ', 'Jue ', 'Sha ', 'Dian ', 'Chu ', 'Jiu ', 'Qin ', 'Ao ', 'Gui ', 'Yan ', 'Si ', 'Li ', 'Chang ', 'Lan ', 'Li ', 'Yan ', 'Yan ', 'Yuan ', 'Si ', 'Gong ', 'Lin ', 'Qiu ', 'Qu ', 'Qu ', 'Uk ', 'Lei ', 'Du ', 'Xian ', 'Zhuan ', 'San ', 'Can ', 'Can ', 'Can ', 'Can ', 'Ai ', 'Dai ', 'You ', 'Cha ', 'Ji ', 'You ', 'Shuang ', 'Fan ', 'Shou ', 'Guai ', 'Ba ', 'Fa ', 'Ruo ', 'Shi ', 'Shu ', 'Zhuo ', 'Qu ', 'Shou ', 'Bian ', 'Xu ', 'Jia ', 'Pan ', 'Sou ', 'Gao ', 'Wei ', 'Sou ', 'Die ', 'Rui ', 'Cong ', 'Kou ', 'Gu ', 'Ju ', 'Ling ', 'Gua ', 'Tao ', 'Kou ', 'Zhi ', 'Jiao ', 'Zhao ', 'Ba ', 'Ding ', 'Ke ', 'Tai ', 'Chi ', 'Shi ', 'You ', 'Qiu ', 'Po ', 'Xie ', 'Hao ', 'Si ', 'Tan ', 'Chi ', 'Le ', 'Diao ', 'Ji ', '[?] ', 'Hong '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x054.php b/vendor/voku/portable-ascii/src/voku/helper/data/x054.php
new file mode 100644
index 000000000..c90148fe5
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x054.php
@@ -0,0 +1 @@
+<?php return ['Mie ', 'Xu ', 'Mang ', 'Chi ', 'Ge ', 'Xuan ', 'Yao ', 'Zi ', 'He ', 'Ji ', 'Diao ', 'Cun ', 'Tong ', 'Ming ', 'Hou ', 'Li ', 'Tu ', 'Xiang ', 'Zha ', 'Xia ', 'Ye ', 'Lu ', 'A ', 'Ma ', 'Ou ', 'Xue ', 'Yi ', 'Jun ', 'Chou ', 'Lin ', 'Tun ', 'Yin ', 'Fei ', 'Bi ', 'Qin ', 'Qin ', 'Jie ', 'Bu ', 'Fou ', 'Ba ', 'Dun ', 'Fen ', 'E ', 'Han ', 'Ting ', 'Hang ', 'Shun ', 'Qi ', 'Hong ', 'Zhi ', 'Shen ', 'Wu ', 'Wu ', 'Chao ', 'Ne ', 'Xue ', 'Xi ', 'Chui ', 'Dou ', 'Wen ', 'Hou ', 'Ou ', 'Wu ', 'Gao ', 'Ya ', 'Jun ', 'Lu ', 'E ', 'Ge ', 'Mei ', 'Ai ', 'Qi ', 'Cheng ', 'Wu ', 'Gao ', 'Fu ', 'Jiao ', 'Hong ', 'Chi ', 'Sheng ', 'Ne ', 'Tun ', 'Fu ', 'Yi ', 'Dai ', 'Ou ', 'Li ', 'Bai ', 'Yuan ', 'Kuai ', '[?] ', 'Qiang ', 'Wu ', 'E ', 'Shi ', 'Quan ', 'Pen ', 'Wen ', 'Ni ', 'M ', 'Ling ', 'Ran ', 'You ', 'Di ', 'Zhou ', 'Shi ', 'Zhou ', 'Tie ', 'Xi ', 'Yi ', 'Qi ', 'Ping ', 'Zi ', 'Gu ', 'Zi ', 'Wei ', 'Xu ', 'He ', 'Nao ', 'Xia ', 'Pei ', 'Yi ', 'Xiao ', 'Shen ', 'Hu ', 'Ming ', 'Da ', 'Qu ', 'Ju ', 'Gem ', 'Za ', 'Tuo ', 'Duo ', 'Pou ', 'Pao ', 'Bi ', 'Fu ', 'Yang ', 'He ', 'Zha ', 'He ', 'Hai ', 'Jiu ', 'Yong ', 'Fu ', 'Que ', 'Zhou ', 'Wa ', 'Ka ', 'Gu ', 'Ka ', 'Zuo ', 'Bu ', 'Long ', 'Dong ', 'Ning ', 'Tha ', 'Si ', 'Xian ', 'Huo ', 'Qi ', 'Er ', 'E ', 'Guang ', 'Zha ', 'Xi ', 'Yi ', 'Lie ', 'Zi ', 'Mie ', 'Mi ', 'Zhi ', 'Yao ', 'Ji ', 'Zhou ', 'Ge ', 'Shuai ', 'Zan ', 'Xiao ', 'Ke ', 'Hui ', 'Kua ', 'Huai ', 'Tao ', 'Xian ', 'E ', 'Xuan ', 'Xiu ', 'Wai ', 'Yan ', 'Lao ', 'Yi ', 'Ai ', 'Pin ', 'Shen ', 'Tong ', 'Hong ', 'Xiong ', 'Chi ', 'Wa ', 'Ha ', 'Zai ', 'Yu ', 'Di ', 'Pai ', 'Xiang ', 'Ai ', 'Hen ', 'Kuang ', 'Ya ', 'Da ', 'Xiao ', 'Bi ', 'Yue ', '[?] ', 'Hua ', 'Sasou ', 'Kuai ', 'Duo ', '[?] ', 'Ji ', 'Nong ', 'Mou ', 'Yo ', 'Hao ', 'Yuan ', 'Long ', 'Pou ', 'Mang ', 'Ge ', 'E ', 'Chi ', 'Shao ', 'Li ', 'Na ', 'Zu ', 'He ', 'Ku ', 'Xiao ', 'Xian ', 'Lao ', 'Bo ', 'Zhe ', 'Zha ', 'Liang ', 'Ba ', 'Mie ', 'Le ', 'Sui ', 'Fou ', 'Bu ', 'Han ', 'Heng ', 'Geng ', 'Shuo ', 'Ge '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x055.php b/vendor/voku/portable-ascii/src/voku/helper/data/x055.php
new file mode 100644
index 000000000..0aa75ca60
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x055.php
@@ -0,0 +1 @@
+<?php return ['You ', 'Yan ', 'Gu ', 'Gu ', 'Bai ', 'Han ', 'Suo ', 'Chun ', 'Yi ', 'Ai ', 'Jia ', 'Tu ', 'Xian ', 'Huan ', 'Li ', 'Xi ', 'Tang ', 'Zuo ', 'Qiu ', 'Che ', 'Wu ', 'Zao ', 'Ya ', 'Dou ', 'Qi ', 'Di ', 'Qin ', 'Ma ', 'Mal ', 'Hong ', 'Dou ', 'Kes ', 'Lao ', 'Liang ', 'Suo ', 'Zao ', 'Huan ', 'Lang ', 'Sha ', 'Ji ', 'Zuo ', 'Wo ', 'Feng ', 'Yin ', 'Hu ', 'Qi ', 'Shou ', 'Wei ', 'Shua ', 'Chang ', 'Er ', 'Li ', 'Qiang ', 'An ', 'Jie ', 'Yo ', 'Nian ', 'Yu ', 'Tian ', 'Lai ', 'Sha ', 'Xi ', 'Tuo ', 'Hu ', 'Ai ', 'Zhou ', 'Nou ', 'Ken ', 'Zhuo ', 'Zhuo ', 'Shang ', 'Di ', 'Heng ', 'Lan ', 'A ', 'Xiao ', 'Xiang ', 'Tun ', 'Wu ', 'Wen ', 'Cui ', 'Sha ', 'Hu ', 'Qi ', 'Qi ', 'Tao ', 'Dan ', 'Dan ', 'Ye ', 'Zi ', 'Bi ', 'Cui ', 'Chuo ', 'He ', 'Ya ', 'Qi ', 'Zhe ', 'Pei ', 'Liang ', 'Xian ', 'Pi ', 'Sha ', 'La ', 'Ze ', 'Qing ', 'Gua ', 'Pa ', 'Zhe ', 'Se ', 'Zhuan ', 'Nie ', 'Guo ', 'Luo ', 'Yan ', 'Di ', 'Quan ', 'Tan ', 'Bo ', 'Ding ', 'Lang ', 'Xiao ', '[?] ', 'Tang ', 'Chi ', 'Ti ', 'An ', 'Jiu ', 'Dan ', 'Ke ', 'Yong ', 'Wei ', 'Nan ', 'Shan ', 'Yu ', 'Zhe ', 'La ', 'Jie ', 'Hou ', 'Han ', 'Die ', 'Zhou ', 'Chai ', 'Wai ', 'Re ', 'Yu ', 'Yin ', 'Zan ', 'Yao ', 'Wo ', 'Mian ', 'Hu ', 'Yun ', 'Chuan ', 'Hui ', 'Huan ', 'Huan ', 'Xi ', 'He ', 'Ji ', 'Kui ', 'Zhong ', 'Wei ', 'Sha ', 'Xu ', 'Huang ', 'Du ', 'Nie ', 'Xuan ', 'Liang ', 'Yu ', 'Sang ', 'Chi ', 'Qiao ', 'Yan ', 'Dan ', 'Pen ', 'Can ', 'Li ', 'Yo ', 'Zha ', 'Wei ', 'Miao ', 'Ying ', 'Pen ', 'Phos ', 'Kui ', 'Xi ', 'Yu ', 'Jie ', 'Lou ', 'Ku ', 'Sao ', 'Huo ', 'Ti ', 'Yao ', 'He ', 'A ', 'Xiu ', 'Qiang ', 'Se ', 'Yong ', 'Su ', 'Hong ', 'Xie ', 'Yi ', 'Suo ', 'Ma ', 'Cha ', 'Hai ', 'Ke ', 'Ta ', 'Sang ', 'Tian ', 'Ru ', 'Sou ', 'Wa ', 'Ji ', 'Pang ', 'Wu ', 'Xian ', 'Shi ', 'Ge ', 'Zi ', 'Jie ', 'Luo ', 'Weng ', 'Wa ', 'Si ', 'Chi ', 'Hao ', 'Suo ', 'Jia ', 'Hai ', 'Suo ', 'Qin ', 'Nie ', 'He ', 'Cis ', 'Sai ', 'Ng ', 'Ge ', 'Na ', 'Dia ', 'Ai ', '[?] ', 'Tong ', 'Bi ', 'Ao ', 'Ao ', 'Lian ', 'Cui ', 'Zhe ', 'Mo ', 'Sou ', 'Sou ', 'Tan '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x056.php b/vendor/voku/portable-ascii/src/voku/helper/data/x056.php
new file mode 100644
index 000000000..157e4a0ce
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x056.php
@@ -0,0 +1 @@
+<?php return ['Di ', 'Qi ', 'Jiao ', 'Chong ', 'Jiao ', 'Kai ', 'Tan ', 'San ', 'Cao ', 'Jia ', 'Ai ', 'Xiao ', 'Piao ', 'Lou ', 'Ga ', 'Gu ', 'Xiao ', 'Hu ', 'Hui ', 'Guo ', 'Ou ', 'Xian ', 'Ze ', 'Chang ', 'Xu ', 'Po ', 'De ', 'Ma ', 'Ma ', 'Hu ', 'Lei ', 'Du ', 'Ga ', 'Tang ', 'Ye ', 'Beng ', 'Ying ', 'Saai ', 'Jiao ', 'Mi ', 'Xiao ', 'Hua ', 'Mai ', 'Ran ', 'Zuo ', 'Peng ', 'Lao ', 'Xiao ', 'Ji ', 'Zhu ', 'Chao ', 'Kui ', 'Zui ', 'Xiao ', 'Si ', 'Hao ', 'Fu ', 'Liao ', 'Qiao ', 'Xi ', 'Xiu ', 'Tan ', 'Tan ', 'Mo ', 'Xun ', 'E ', 'Zun ', 'Fan ', 'Chi ', 'Hui ', 'Zan ', 'Chuang ', 'Cu ', 'Dan ', 'Yu ', 'Tun ', 'Cheng ', 'Jiao ', 'Ye ', 'Xi ', 'Qi ', 'Hao ', 'Lian ', 'Xu ', 'Deng ', 'Hui ', 'Yin ', 'Pu ', 'Jue ', 'Qin ', 'Xun ', 'Nie ', 'Lu ', 'Si ', 'Yan ', 'Ying ', 'Da ', 'Dan ', 'Yu ', 'Zhou ', 'Jin ', 'Nong ', 'Yue ', 'Hui ', 'Qi ', 'E ', 'Zao ', 'Yi ', 'Shi ', 'Jiao ', 'Yuan ', 'Ai ', 'Yong ', 'Jue ', 'Kuai ', 'Yu ', 'Pen ', 'Dao ', 'Ge ', 'Xin ', 'Dun ', 'Dang ', 'Sin ', 'Sai ', 'Pi ', 'Pi ', 'Yin ', 'Zui ', 'Ning ', 'Di ', 'Lan ', 'Ta ', 'Huo ', 'Ru ', 'Hao ', 'Xia ', 'Ya ', 'Duo ', 'Xi ', 'Chou ', 'Ji ', 'Jin ', 'Hao ', 'Ti ', 'Chang ', '[?] ', '[?] ', 'Ca ', 'Ti ', 'Lu ', 'Hui ', 'Bo ', 'You ', 'Nie ', 'Yin ', 'Hu ', 'Mo ', 'Huang ', 'Zhe ', 'Li ', 'Liu ', 'Haai ', 'Nang ', 'Xiao ', 'Mo ', 'Yan ', 'Li ', 'Lu ', 'Long ', 'Fu ', 'Dan ', 'Chen ', 'Pin ', 'Pi ', 'Xiang ', 'Huo ', 'Mo ', 'Xi ', 'Duo ', 'Ku ', 'Yan ', 'Chan ', 'Ying ', 'Rang ', 'Dian ', 'La ', 'Ta ', 'Xiao ', 'Jiao ', 'Chuo ', 'Huan ', 'Huo ', 'Zhuan ', 'Nie ', 'Xiao ', 'Ca ', 'Li ', 'Chan ', 'Chai ', 'Li ', 'Yi ', 'Luo ', 'Nang ', 'Zan ', 'Su ', 'Xi ', 'So ', 'Jian ', 'Za ', 'Zhu ', 'Lan ', 'Nie ', 'Nang ', '[?] ', '[?] ', 'Wei ', 'Hui ', 'Yin ', 'Qiu ', 'Si ', 'Nin ', 'Jian ', 'Hui ', 'Xin ', 'Yin ', 'Nan ', 'Tuan ', 'Tuan ', 'Dun ', 'Kang ', 'Yuan ', 'Jiong ', 'Pian ', 'Yun ', 'Cong ', 'Hu ', 'Hui ', 'Yuan ', 'You ', 'Guo ', 'Kun ', 'Cong ', 'Wei ', 'Tu ', 'Wei ', 'Lun ', 'Guo ', 'Qun ', 'Ri ', 'Ling ', 'Gu ', 'Guo ', 'Tai ', 'Guo ', 'Tu ', 'You '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x057.php b/vendor/voku/portable-ascii/src/voku/helper/data/x057.php
new file mode 100644
index 000000000..ead2e2b48
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x057.php
@@ -0,0 +1 @@
+<?php return ['Guo ', 'Yin ', 'Hun ', 'Pu ', 'Yu ', 'Han ', 'Yuan ', 'Lun ', 'Quan ', 'Yu ', 'Qing ', 'Guo ', 'Chuan ', 'Wei ', 'Yuan ', 'Quan ', 'Ku ', 'Fu ', 'Yuan ', 'Yuan ', 'E ', 'Tu ', 'Tu ', 'Tu ', 'Tuan ', 'Lue ', 'Hui ', 'Yi ', 'Yuan ', 'Luan ', 'Luan ', 'Tu ', 'Ya ', 'Tu ', 'Ting ', 'Sheng ', 'Pu ', 'Lu ', 'Iri ', 'Ya ', 'Zai ', 'Wei ', 'Ge ', 'Yu ', 'Wu ', 'Gui ', 'Pi ', 'Yi ', 'Di ', 'Qian ', 'Qian ', 'Zhen ', 'Zhuo ', 'Dang ', 'Qia ', 'Akutsu ', 'Yama ', 'Kuang ', 'Chang ', 'Qi ', 'Nie ', 'Mo ', 'Ji ', 'Jia ', 'Zhi ', 'Zhi ', 'Ban ', 'Xun ', 'Tou ', 'Qin ', 'Fen ', 'Jun ', 'Keng ', 'Tun ', 'Fang ', 'Fen ', 'Ben ', 'Tan ', 'Kan ', 'Pi ', 'Zuo ', 'Keng ', 'Bi ', 'Xing ', 'Di ', 'Jing ', 'Ji ', 'Kuai ', 'Di ', 'Jing ', 'Jian ', 'Tan ', 'Li ', 'Ba ', 'Wu ', 'Fen ', 'Zhui ', 'Po ', 'Pan ', 'Tang ', 'Kun ', 'Qu ', 'Tan ', 'Zhi ', 'Tuo ', 'Gan ', 'Ping ', 'Dian ', 'Gua ', 'Ni ', 'Tai ', 'Pi ', 'Jiong ', 'Yang ', 'Fo ', 'Ao ', 'Liu ', 'Qiu ', 'Mu ', 'Ke ', 'Gou ', 'Xue ', 'Ba ', 'Chi ', 'Che ', 'Ling ', 'Zhu ', 'Fu ', 'Hu ', 'Zhi ', 'Chui ', 'La ', 'Long ', 'Long ', 'Lu ', 'Ao ', 'Tay ', 'Pao ', '[?] ', 'Xing ', 'Dong ', 'Ji ', 'Ke ', 'Lu ', 'Ci ', 'Chi ', 'Lei ', 'Gai ', 'Yin ', 'Hou ', 'Dui ', 'Zhao ', 'Fu ', 'Guang ', 'Yao ', 'Duo ', 'Duo ', 'Gui ', 'Cha ', 'Yang ', 'Yin ', 'Fa ', 'Gou ', 'Yuan ', 'Die ', 'Xie ', 'Ken ', 'Jiong ', 'Shou ', 'E ', 'Ha ', 'Dian ', 'Hong ', 'Wu ', 'Kua ', '[?] ', 'Tao ', 'Dang ', 'Kai ', 'Gake ', 'Nao ', 'An ', 'Xing ', 'Xian ', 'Huan ', 'Bang ', 'Pei ', 'Ba ', 'Yi ', 'Yin ', 'Han ', 'Xu ', 'Chui ', 'Cen ', 'Geng ', 'Ai ', 'Peng ', 'Fang ', 'Que ', 'Yong ', 'Xun ', 'Jia ', 'Di ', 'Mai ', 'Lang ', 'Xuan ', 'Cheng ', 'Yan ', 'Jin ', 'Zhe ', 'Lei ', 'Lie ', 'Bu ', 'Cheng ', 'Gomi ', 'Bu ', 'Shi ', 'Xun ', 'Guo ', 'Jiong ', 'Ye ', 'Nian ', 'Di ', 'Yu ', 'Bu ', 'Ya ', 'Juan ', 'Sui ', 'Pi ', 'Cheng ', 'Wan ', 'Ju ', 'Lun ', 'Zheng ', 'Kong ', 'Chong ', 'Dong ', 'Dai ', 'Tan ', 'An ', 'Cai ', 'Shu ', 'Beng ', 'Kan ', 'Zhi ', 'Duo ', 'Yi ', 'Zhi ', 'Yi ', 'Pei ', 'Ji ', 'Zhun ', 'Qi ', 'Sao ', 'Ju ', 'Ni '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x058.php b/vendor/voku/portable-ascii/src/voku/helper/data/x058.php
new file mode 100644
index 000000000..00f2ac4e7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x058.php
@@ -0,0 +1 @@
+<?php return ['Ku ', 'Ke ', 'Tang ', 'Kun ', 'Ni ', 'Jian ', 'Dui ', 'Jin ', 'Gang ', 'Yu ', 'E ', 'Peng ', 'Gu ', 'Tu ', 'Leng ', '[?] ', 'Ya ', 'Qian ', '[?] ', 'An ', '[?] ', 'Duo ', 'Nao ', 'Tu ', 'Cheng ', 'Yin ', 'Hun ', 'Bi ', 'Lian ', 'Guo ', 'Die ', 'Zhuan ', 'Hou ', 'Bao ', 'Bao ', 'Yu ', 'Di ', 'Mao ', 'Jie ', 'Ruan ', 'E ', 'Geng ', 'Kan ', 'Zong ', 'Yu ', 'Huang ', 'E ', 'Yao ', 'Yan ', 'Bao ', 'Ji ', 'Mei ', 'Chang ', 'Du ', 'Tuo ', 'Yin ', 'Feng ', 'Zhong ', 'Jie ', 'Zhen ', 'Feng ', 'Gang ', 'Chuan ', 'Jian ', 'Pyeng ', 'Toride ', 'Xiang ', 'Huang ', 'Leng ', 'Duan ', '[?] ', 'Xuan ', 'Ji ', 'Ji ', 'Kuai ', 'Ying ', 'Ta ', 'Cheng ', 'Yong ', 'Kai ', 'Su ', 'Su ', 'Shi ', 'Mi ', 'Ta ', 'Weng ', 'Cheng ', 'Tu ', 'Tang ', 'Que ', 'Zhong ', 'Li ', 'Peng ', 'Bang ', 'Sai ', 'Zang ', 'Dui ', 'Tian ', 'Wu ', 'Cheng ', 'Xun ', 'Ge ', 'Zhen ', 'Ai ', 'Gong ', 'Yan ', 'Kan ', 'Tian ', 'Yuan ', 'Wen ', 'Xie ', 'Liu ', 'Ama ', 'Lang ', 'Chang ', 'Peng ', 'Beng ', 'Chen ', 'Cu ', 'Lu ', 'Ou ', 'Qian ', 'Mei ', 'Mo ', 'Zhuan ', 'Shuang ', 'Shu ', 'Lou ', 'Chi ', 'Man ', 'Biao ', 'Jing ', 'Qi ', 'Shu ', 'Di ', 'Zhang ', 'Kan ', 'Yong ', 'Dian ', 'Chen ', 'Zhi ', 'Xi ', 'Guo ', 'Qiang ', 'Jin ', 'Di ', 'Shang ', 'Mu ', 'Cui ', 'Yan ', 'Ta ', 'Zeng ', 'Qi ', 'Qiang ', 'Liang ', '[?] ', 'Zhui ', 'Qiao ', 'Zeng ', 'Xu ', 'Shan ', 'Shan ', 'Ba ', 'Pu ', 'Kuai ', 'Dong ', 'Fan ', 'Que ', 'Mo ', 'Dun ', 'Dun ', 'Dun ', 'Di ', 'Sheng ', 'Duo ', 'Duo ', 'Tan ', 'Deng ', 'Wu ', 'Fen ', 'Huang ', 'Tan ', 'Da ', 'Ye ', 'Sho ', 'Mama ', 'Yu ', 'Qiang ', 'Ji ', 'Qiao ', 'Ken ', 'Yi ', 'Pi ', 'Bi ', 'Dian ', 'Jiang ', 'Ye ', 'Yong ', 'Bo ', 'Tan ', 'Lan ', 'Ju ', 'Huai ', 'Dang ', 'Rang ', 'Qian ', 'Xun ', 'Lan ', 'Xi ', 'He ', 'Ai ', 'Ya ', 'Dao ', 'Hao ', 'Ruan ', 'Mama ', 'Lei ', 'Kuang ', 'Lu ', 'Yan ', 'Tan ', 'Wei ', 'Huai ', 'Long ', 'Long ', 'Rui ', 'Li ', 'Lin ', 'Rang ', 'Ten ', 'Xun ', 'Yan ', 'Lei ', 'Ba ', '[?] ', 'Shi ', 'Ren ', '[?] ', 'Zhuang ', 'Zhuang ', 'Sheng ', 'Yi ', 'Mai ', 'Ke ', 'Zhu ', 'Zhuang ', 'Hu ', 'Hu ', 'Kun ', 'Yi ', 'Hu ', 'Xu ', 'Kun ', 'Shou ', 'Mang ', 'Zun '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x059.php b/vendor/voku/portable-ascii/src/voku/helper/data/x059.php
new file mode 100644
index 000000000..f093af0e2
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x059.php
@@ -0,0 +1 @@
+<?php return ['Shou ', 'Yi ', 'Zhi ', 'Gu ', 'Chu ', 'Jiang ', 'Feng ', 'Bei ', 'Cay ', 'Bian ', 'Sui ', 'Qun ', 'Ling ', 'Fu ', 'Zuo ', 'Xia ', 'Xiong ', '[?] ', 'Nao ', 'Xia ', 'Kui ', 'Xi ', 'Wai ', 'Yuan ', 'Mao ', 'Su ', 'Duo ', 'Duo ', 'Ye ', 'Qing ', 'Uys ', 'Gou ', 'Gou ', 'Qi ', 'Meng ', 'Meng ', 'Yin ', 'Huo ', 'Chen ', 'Da ', 'Ze ', 'Tian ', 'Tai ', 'Fu ', 'Guai ', 'Yao ', 'Yang ', 'Hang ', 'Gao ', 'Shi ', 'Ben ', 'Tai ', 'Tou ', 'Yan ', 'Bi ', 'Yi ', 'Kua ', 'Jia ', 'Duo ', 'Kwu ', 'Kuang ', 'Yun ', 'Jia ', 'Pa ', 'En ', 'Lian ', 'Huan ', 'Di ', 'Yan ', 'Pao ', 'Quan ', 'Qi ', 'Nai ', 'Feng ', 'Xie ', 'Fen ', 'Dian ', '[?] ', 'Kui ', 'Zou ', 'Huan ', 'Qi ', 'Kai ', 'Zha ', 'Ben ', 'Yi ', 'Jiang ', 'Tao ', 'Zang ', 'Ben ', 'Xi ', 'Xiang ', 'Fei ', 'Diao ', 'Xun ', 'Keng ', 'Dian ', 'Ao ', 'She ', 'Weng ', 'Pan ', 'Ao ', 'Wu ', 'Ao ', 'Jiang ', 'Lian ', 'Duo ', 'Yun ', 'Jiang ', 'Shi ', 'Fen ', 'Huo ', 'Bi ', 'Lian ', 'Duo ', 'Nu ', 'Nu ', 'Ding ', 'Nai ', 'Qian ', 'Jian ', 'Ta ', 'Jiu ', 'Nan ', 'Cha ', 'Hao ', 'Xian ', 'Fan ', 'Ji ', 'Shuo ', 'Ru ', 'Fei ', 'Wang ', 'Hong ', 'Zhuang ', 'Fu ', 'Ma ', 'Dan ', 'Ren ', 'Fu ', 'Jing ', 'Yan ', 'Xie ', 'Wen ', 'Zhong ', 'Pa ', 'Du ', 'Ji ', 'Keng ', 'Zhong ', 'Yao ', 'Jin ', 'Yun ', 'Miao ', 'Pei ', 'Shi ', 'Yue ', 'Zhuang ', 'Niu ', 'Yan ', 'Na ', 'Xin ', 'Fen ', 'Bi ', 'Yu ', 'Tuo ', 'Feng ', 'Yuan ', 'Fang ', 'Wu ', 'Yu ', 'Gui ', 'Du ', 'Ba ', 'Ni ', 'Zhou ', 'Zhuo ', 'Zhao ', 'Da ', 'Nai ', 'Yuan ', 'Tou ', 'Xuan ', 'Zhi ', 'E ', 'Mei ', 'Mo ', 'Qi ', 'Bi ', 'Shen ', 'Qie ', 'E ', 'He ', 'Xu ', 'Fa ', 'Zheng ', 'Min ', 'Ban ', 'Mu ', 'Fu ', 'Ling ', 'Zi ', 'Zi ', 'Shi ', 'Ran ', 'Shan ', 'Yang ', 'Man ', 'Jie ', 'Gu ', 'Si ', 'Xing ', 'Wei ', 'Zi ', 'Ju ', 'Shan ', 'Pin ', 'Ren ', 'Yao ', 'Tong ', 'Jiang ', 'Shu ', 'Ji ', 'Gai ', 'Shang ', 'Kuo ', 'Juan ', 'Jiao ', 'Gou ', 'Mu ', 'Jian ', 'Jian ', 'Yi ', 'Nian ', 'Zhi ', 'Ji ', 'Ji ', 'Xian ', 'Heng ', 'Guang ', 'Jun ', 'Kua ', 'Yan ', 'Ming ', 'Lie ', 'Pei ', 'Yan ', 'You ', 'Yan ', 'Cha ', 'Shen ', 'Yin ', 'Chi ', 'Gui ', 'Quan ', 'Zi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php
new file mode 100644
index 000000000..565202141
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php
@@ -0,0 +1 @@
+<?php return ['Song ', 'Wei ', 'Hong ', 'Wa ', 'Lou ', 'Ya ', 'Rao ', 'Jiao ', 'Luan ', 'Ping ', 'Xian ', 'Shao ', 'Li ', 'Cheng ', 'Xiao ', 'Mang ', 'Fu ', 'Suo ', 'Wu ', 'Wei ', 'Ke ', 'Lai ', 'Chuo ', 'Ding ', 'Niang ', 'Xing ', 'Nan ', 'Yu ', 'Nuo ', 'Pei ', 'Nei ', 'Juan ', 'Shen ', 'Zhi ', 'Han ', 'Di ', 'Zhuang ', 'E ', 'Pin ', 'Tui ', 'Han ', 'Mian ', 'Wu ', 'Yan ', 'Wu ', 'Xi ', 'Yan ', 'Yu ', 'Si ', 'Yu ', 'Wa ', '[?] ', 'Xian ', 'Ju ', 'Qu ', 'Shui ', 'Qi ', 'Xian ', 'Zhui ', 'Dong ', 'Chang ', 'Lu ', 'Ai ', 'E ', 'E ', 'Lou ', 'Mian ', 'Cong ', 'Pou ', 'Ju ', 'Po ', 'Cai ', 'Ding ', 'Wan ', 'Biao ', 'Xiao ', 'Shu ', 'Qi ', 'Hui ', 'Fu ', 'E ', 'Wo ', 'Tan ', 'Fei ', 'Wei ', 'Jie ', 'Tian ', 'Ni ', 'Quan ', 'Jing ', 'Hun ', 'Jing ', 'Qian ', 'Dian ', 'Xing ', 'Hu ', 'Wa ', 'Lai ', 'Bi ', 'Yin ', 'Chou ', 'Chuo ', 'Fu ', 'Jing ', 'Lun ', 'Yan ', 'Lan ', 'Kun ', 'Yin ', 'Ya ', 'Ju ', 'Li ', 'Dian ', 'Xian ', 'Hwa ', 'Hua ', 'Ying ', 'Chan ', 'Shen ', 'Ting ', 'Dang ', 'Yao ', 'Wu ', 'Nan ', 'Ruo ', 'Jia ', 'Tou ', 'Xu ', 'Yu ', 'Wei ', 'Ti ', 'Rou ', 'Mei ', 'Dan ', 'Ruan ', 'Qin ', 'Hui ', 'Wu ', 'Qian ', 'Chun ', 'Mao ', 'Fu ', 'Jie ', 'Duan ', 'Xi ', 'Zhong ', 'Mei ', 'Huang ', 'Mian ', 'An ', 'Ying ', 'Xuan ', 'Jie ', 'Wei ', 'Mei ', 'Yuan ', 'Zhen ', 'Qiu ', 'Ti ', 'Xie ', 'Tuo ', 'Lian ', 'Mao ', 'Ran ', 'Si ', 'Pian ', 'Wei ', 'Wa ', 'Jiu ', 'Hu ', 'Ao ', '[?] ', 'Bou ', 'Xu ', 'Tou ', 'Gui ', 'Zou ', 'Yao ', 'Pi ', 'Xi ', 'Yuan ', 'Ying ', 'Rong ', 'Ru ', 'Chi ', 'Liu ', 'Mei ', 'Pan ', 'Ao ', 'Ma ', 'Gou ', 'Kui ', 'Qin ', 'Jia ', 'Sao ', 'Zhen ', 'Yuan ', 'Cha ', 'Yong ', 'Ming ', 'Ying ', 'Ji ', 'Su ', 'Niao ', 'Xian ', 'Tao ', 'Pang ', 'Lang ', 'Nao ', 'Bao ', 'Ai ', 'Pi ', 'Pin ', 'Yi ', 'Piao ', 'Yu ', 'Lei ', 'Xuan ', 'Man ', 'Yi ', 'Zhang ', 'Kang ', 'Yong ', 'Ni ', 'Li ', 'Di ', 'Gui ', 'Yan ', 'Jin ', 'Zhuan ', 'Chang ', 'Ce ', 'Han ', 'Nen ', 'Lao ', 'Mo ', 'Zhe ', 'Hu ', 'Hu ', 'Ao ', 'Nen ', 'Qiang ', 'Ma ', 'Pie ', 'Gu ', 'Wu ', 'Jiao ', 'Tuo ', 'Zhan ', 'Mao ', 'Xian ', 'Xian ', 'Mo ', 'Liao ', 'Lian ', 'Hua '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php
new file mode 100644
index 000000000..6d59d163d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php
@@ -0,0 +1 @@
+<?php return ['Gui ', 'Deng ', 'Zhi ', 'Xu ', 'Yi ', 'Hua ', 'Xi ', 'Hui ', 'Rao ', 'Xi ', 'Yan ', 'Chan ', 'Jiao ', 'Mei ', 'Fan ', 'Fan ', 'Xian ', 'Yi ', 'Wei ', 'Jiao ', 'Fu ', 'Shi ', 'Bi ', 'Shan ', 'Sui ', 'Qiang ', 'Lian ', 'Huan ', 'Xin ', 'Niao ', 'Dong ', 'Yi ', 'Can ', 'Ai ', 'Niang ', 'Neng ', 'Ma ', 'Tiao ', 'Chou ', 'Jin ', 'Ci ', 'Yu ', 'Pin ', 'Yong ', 'Xu ', 'Nai ', 'Yan ', 'Tai ', 'Ying ', 'Can ', 'Niao ', 'Wo ', 'Ying ', 'Mian ', 'Kaka ', 'Ma ', 'Shen ', 'Xing ', 'Ni ', 'Du ', 'Liu ', 'Yuan ', 'Lan ', 'Yan ', 'Shuang ', 'Ling ', 'Jiao ', 'Niang ', 'Lan ', 'Xian ', 'Ying ', 'Shuang ', 'Shuai ', 'Quan ', 'Mi ', 'Li ', 'Luan ', 'Yan ', 'Zhu ', 'Lan ', 'Zi ', 'Jie ', 'Jue ', 'Jue ', 'Kong ', 'Yun ', 'Zi ', 'Zi ', 'Cun ', 'Sun ', 'Fu ', 'Bei ', 'Zi ', 'Xiao ', 'Xin ', 'Meng ', 'Si ', 'Tai ', 'Bao ', 'Ji ', 'Gu ', 'Nu ', 'Xue ', '[?] ', 'Zhuan ', 'Hai ', 'Luan ', 'Sun ', 'Huai ', 'Mie ', 'Cong ', 'Qian ', 'Shu ', 'Chan ', 'Ya ', 'Zi ', 'Ni ', 'Fu ', 'Zi ', 'Li ', 'Xue ', 'Bo ', 'Ru ', 'Lai ', 'Nie ', 'Nie ', 'Ying ', 'Luan ', 'Mian ', 'Zhu ', 'Rong ', 'Ta ', 'Gui ', 'Zhai ', 'Qiong ', 'Yu ', 'Shou ', 'An ', 'Tu ', 'Song ', 'Wan ', 'Rou ', 'Yao ', 'Hong ', 'Yi ', 'Jing ', 'Zhun ', 'Mi ', 'Zhu ', 'Dang ', 'Hong ', 'Zong ', 'Guan ', 'Zhou ', 'Ding ', 'Wan ', 'Yi ', 'Bao ', 'Shi ', 'Shi ', 'Chong ', 'Shen ', 'Ke ', 'Xuan ', 'Shi ', 'You ', 'Huan ', 'Yi ', 'Tiao ', 'Shi ', 'Xian ', 'Gong ', 'Cheng ', 'Qun ', 'Gong ', 'Xiao ', 'Zai ', 'Zha ', 'Bao ', 'Hai ', 'Yan ', 'Xiao ', 'Jia ', 'Shen ', 'Chen ', 'Rong ', 'Huang ', 'Mi ', 'Kou ', 'Kuan ', 'Bin ', 'Su ', 'Cai ', 'Zan ', 'Ji ', 'Yuan ', 'Ji ', 'Yin ', 'Mi ', 'Kou ', 'Qing ', 'Que ', 'Zhen ', 'Jian ', 'Fu ', 'Ning ', 'Bing ', 'Huan ', 'Mei ', 'Qin ', 'Han ', 'Yu ', 'Shi ', 'Ning ', 'Qin ', 'Ning ', 'Zhi ', 'Yu ', 'Bao ', 'Kuan ', 'Ning ', 'Qin ', 'Mo ', 'Cha ', 'Ju ', 'Gua ', 'Qin ', 'Hu ', 'Wu ', 'Liao ', 'Shi ', 'Zhu ', 'Zhai ', 'Shen ', 'Wei ', 'Xie ', 'Kuan ', 'Hui ', 'Liao ', 'Jun ', 'Huan ', 'Yi ', 'Yi ', 'Bao ', 'Qin ', 'Chong ', 'Bao ', 'Feng ', 'Cun ', 'Dui ', 'Si ', 'Xun ', 'Dao ', 'Lu ', 'Dui ', 'Shou '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php
new file mode 100644
index 000000000..f66996280
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php
@@ -0,0 +1 @@
+<?php return ['Po ', 'Feng ', 'Zhuan ', 'Fu ', 'She ', 'Ke ', 'Jiang ', 'Jiang ', 'Zhuan ', 'Wei ', 'Zun ', 'Xun ', 'Shu ', 'Dui ', 'Dao ', 'Xiao ', 'Ji ', 'Shao ', 'Er ', 'Er ', 'Er ', 'Ga ', 'Jian ', 'Shu ', 'Chen ', 'Shang ', 'Shang ', 'Mo ', 'Ga ', 'Chang ', 'Liao ', 'Xian ', 'Xian ', '[?] ', 'Wang ', 'Wang ', 'You ', 'Liao ', 'Liao ', 'Yao ', 'Mang ', 'Wang ', 'Wang ', 'Wang ', 'Ga ', 'Yao ', 'Duo ', 'Kui ', 'Zhong ', 'Jiu ', 'Gan ', 'Gu ', 'Gan ', 'Tui ', 'Gan ', 'Gan ', 'Shi ', 'Yin ', 'Chi ', 'Kao ', 'Ni ', 'Jin ', 'Wei ', 'Niao ', 'Ju ', 'Pi ', 'Ceng ', 'Xi ', 'Bi ', 'Ju ', 'Jie ', 'Tian ', 'Qu ', 'Ti ', 'Jie ', 'Wu ', 'Diao ', 'Shi ', 'Shi ', 'Ping ', 'Ji ', 'Xie ', 'Chen ', 'Xi ', 'Ni ', 'Zhan ', 'Xi ', '[?] ', 'Man ', 'E ', 'Lou ', 'Ping ', 'Ti ', 'Fei ', 'Shu ', 'Xie ', 'Tu ', 'Lu ', 'Lu ', 'Xi ', 'Ceng ', 'Lu ', 'Ju ', 'Xie ', 'Ju ', 'Jue ', 'Liao ', 'Jue ', 'Shu ', 'Xi ', 'Che ', 'Tun ', 'Ni ', 'Shan ', '[?] ', 'Xian ', 'Li ', 'Xue ', 'Nata ', '[?] ', 'Long ', 'Yi ', 'Qi ', 'Ren ', 'Wu ', 'Han ', 'Shen ', 'Yu ', 'Chu ', 'Sui ', 'Qi ', '[?] ', 'Yue ', 'Ban ', 'Yao ', 'Ang ', 'Ya ', 'Wu ', 'Jie ', 'E ', 'Ji ', 'Qian ', 'Fen ', 'Yuan ', 'Qi ', 'Cen ', 'Qian ', 'Qi ', 'Cha ', 'Jie ', 'Qu ', 'Gang ', 'Xian ', 'Ao ', 'Lan ', 'Dao ', 'Ba ', 'Zuo ', 'Zuo ', 'Yang ', 'Ju ', 'Gang ', 'Ke ', 'Gou ', 'Xue ', 'Bei ', 'Li ', 'Tiao ', 'Ju ', 'Yan ', 'Fu ', 'Xiu ', 'Jia ', 'Ling ', 'Tuo ', 'Pei ', 'You ', 'Dai ', 'Kuang ', 'Yue ', 'Qu ', 'Hu ', 'Po ', 'Min ', 'An ', 'Tiao ', 'Ling ', 'Chi ', 'Yuri ', 'Dong ', 'Cem ', 'Kui ', 'Xiu ', 'Mao ', 'Tong ', 'Xue ', 'Yi ', 'Kura ', 'He ', 'Ke ', 'Luo ', 'E ', 'Fu ', 'Xun ', 'Die ', 'Lu ', 'An ', 'Er ', 'Gai ', 'Quan ', 'Tong ', 'Yi ', 'Mu ', 'Shi ', 'An ', 'Wei ', 'Hu ', 'Zhi ', 'Mi ', 'Li ', 'Ji ', 'Tong ', 'Wei ', 'You ', 'Sang ', 'Xia ', 'Li ', 'Yao ', 'Jiao ', 'Zheng ', 'Luan ', 'Jiao ', 'E ', 'E ', 'Yu ', 'Ye ', 'Bu ', 'Qiao ', 'Qun ', 'Feng ', 'Feng ', 'Nao ', 'Li ', 'You ', 'Xian ', 'Hong ', 'Dao ', 'Shen ', 'Cheng ', 'Tu ', 'Geng ', 'Jun ', 'Hao ', 'Xia ', 'Yin ', 'Yu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php
new file mode 100644
index 000000000..a0b7062a8
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php
@@ -0,0 +1 @@
+<?php return ['Lang ', 'Kan ', 'Lao ', 'Lai ', 'Xian ', 'Que ', 'Kong ', 'Chong ', 'Chong ', 'Ta ', 'Lin ', 'Hua ', 'Ju ', 'Lai ', 'Qi ', 'Min ', 'Kun ', 'Kun ', 'Zu ', 'Gu ', 'Cui ', 'Ya ', 'Ya ', 'Gang ', 'Lun ', 'Lun ', 'Leng ', 'Jue ', 'Duo ', 'Zheng ', 'Guo ', 'Yin ', 'Dong ', 'Han ', 'Zheng ', 'Wei ', 'Yao ', 'Pi ', 'Yan ', 'Song ', 'Jie ', 'Beng ', 'Zu ', 'Jue ', 'Dong ', 'Zhan ', 'Gu ', 'Yin ', '[?] ', 'Ze ', 'Huang ', 'Yu ', 'Wei ', 'Yang ', 'Feng ', 'Qiu ', 'Dun ', 'Ti ', 'Yi ', 'Zhi ', 'Shi ', 'Zai ', 'Yao ', 'E ', 'Zhu ', 'Kan ', 'Lu ', 'Yan ', 'Mei ', 'Gan ', 'Ji ', 'Ji ', 'Huan ', 'Ting ', 'Sheng ', 'Mei ', 'Qian ', 'Wu ', 'Yu ', 'Zong ', 'Lan ', 'Jue ', 'Yan ', 'Yan ', 'Wei ', 'Zong ', 'Cha ', 'Sui ', 'Rong ', 'Yamashina ', 'Qin ', 'Yu ', 'Kewashii ', 'Lou ', 'Tu ', 'Dui ', 'Xi ', 'Weng ', 'Cang ', 'Dang ', 'Hong ', 'Jie ', 'Ai ', 'Liu ', 'Wu ', 'Song ', 'Qiao ', 'Zi ', 'Wei ', 'Beng ', 'Dian ', 'Cuo ', 'Qian ', 'Yong ', 'Nie ', 'Cuo ', 'Ji ', '[?] ', 'Tao ', 'Song ', 'Zong ', 'Jiang ', 'Liao ', 'Kang ', 'Chan ', 'Die ', 'Cen ', 'Ding ', 'Tu ', 'Lou ', 'Zhang ', 'Zhan ', 'Zhan ', 'Ao ', 'Cao ', 'Qu ', 'Qiang ', 'Zui ', 'Zui ', 'Dao ', 'Dao ', 'Xi ', 'Yu ', 'Bo ', 'Long ', 'Xiang ', 'Ceng ', 'Bo ', 'Qin ', 'Jiao ', 'Yan ', 'Lao ', 'Zhan ', 'Lin ', 'Liao ', 'Liao ', 'Jin ', 'Deng ', 'Duo ', 'Zun ', 'Jiao ', 'Gui ', 'Yao ', 'Qiao ', 'Yao ', 'Jue ', 'Zhan ', 'Yi ', 'Xue ', 'Nao ', 'Ye ', 'Ye ', 'Yi ', 'E ', 'Xian ', 'Ji ', 'Xie ', 'Ke ', 'Xi ', 'Di ', 'Ao ', 'Zui ', '[?] ', 'Ni ', 'Rong ', 'Dao ', 'Ling ', 'Za ', 'Yu ', 'Yue ', 'Yin ', '[?] ', 'Jie ', 'Li ', 'Sui ', 'Long ', 'Long ', 'Dian ', 'Ying ', 'Xi ', 'Ju ', 'Chan ', 'Ying ', 'Kui ', 'Yan ', 'Wei ', 'Nao ', 'Quan ', 'Chao ', 'Cuan ', 'Luan ', 'Dian ', 'Dian ', '[?] ', 'Yan ', 'Yan ', 'Yan ', 'Nao ', 'Yan ', 'Chuan ', 'Gui ', 'Chuan ', 'Zhou ', 'Huang ', 'Jing ', 'Xun ', 'Chao ', 'Chao ', 'Lie ', 'Gong ', 'Zuo ', 'Qiao ', 'Ju ', 'Gong ', 'Kek ', 'Wu ', 'Pwu ', 'Pwu ', 'Chai ', 'Qiu ', 'Qiu ', 'Ji ', 'Yi ', 'Si ', 'Ba ', 'Zhi ', 'Zhao ', 'Xiang ', 'Yi ', 'Jin ', 'Xun ', 'Juan ', 'Phas ', 'Xun ', 'Jin ', 'Fu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php
new file mode 100644
index 000000000..2ebbc3406
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php
@@ -0,0 +1 @@
+<?php return ['Za ', 'Bi ', 'Shi ', 'Bu ', 'Ding ', 'Shuai ', 'Fan ', 'Nie ', 'Shi ', 'Fen ', 'Pa ', 'Zhi ', 'Xi ', 'Hu ', 'Dan ', 'Wei ', 'Zhang ', 'Tang ', 'Dai ', 'Ma ', 'Pei ', 'Pa ', 'Tie ', 'Fu ', 'Lian ', 'Zhi ', 'Zhou ', 'Bo ', 'Zhi ', 'Di ', 'Mo ', 'Yi ', 'Yi ', 'Ping ', 'Qia ', 'Juan ', 'Ru ', 'Shuai ', 'Dai ', 'Zheng ', 'Shui ', 'Qiao ', 'Zhen ', 'Shi ', 'Qun ', 'Xi ', 'Bang ', 'Dai ', 'Gui ', 'Chou ', 'Ping ', 'Zhang ', 'Sha ', 'Wan ', 'Dai ', 'Wei ', 'Chang ', 'Sha ', 'Qi ', 'Ze ', 'Guo ', 'Mao ', 'Du ', 'Hou ', 'Zheng ', 'Xu ', 'Mi ', 'Wei ', 'Wo ', 'Fu ', 'Yi ', 'Bang ', 'Ping ', 'Tazuna ', 'Gong ', 'Pan ', 'Huang ', 'Dao ', 'Mi ', 'Jia ', 'Teng ', 'Hui ', 'Zhong ', 'Shan ', 'Man ', 'Mu ', 'Biao ', 'Guo ', 'Ze ', 'Mu ', 'Bang ', 'Zhang ', 'Jiong ', 'Chan ', 'Fu ', 'Zhi ', 'Hu ', 'Fan ', 'Chuang ', 'Bi ', 'Hei ', '[?] ', 'Mi ', 'Qiao ', 'Chan ', 'Fen ', 'Meng ', 'Bang ', 'Chou ', 'Mie ', 'Chu ', 'Jie ', 'Xian ', 'Lan ', 'Gan ', 'Ping ', 'Nian ', 'Qian ', 'Bing ', 'Bing ', 'Xing ', 'Gan ', 'Yao ', 'Huan ', 'You ', 'You ', 'Ji ', 'Yan ', 'Pi ', 'Ting ', 'Ze ', 'Guang ', 'Zhuang ', 'Mo ', 'Qing ', 'Bi ', 'Qin ', 'Dun ', 'Chuang ', 'Gui ', 'Ya ', 'Bai ', 'Jie ', 'Xu ', 'Lu ', 'Wu ', '[?] ', 'Ku ', 'Ying ', 'Di ', 'Pao ', 'Dian ', 'Ya ', 'Miao ', 'Geng ', 'Ci ', 'Fu ', 'Tong ', 'Pang ', 'Fei ', 'Xiang ', 'Yi ', 'Zhi ', 'Tiao ', 'Zhi ', 'Xiu ', 'Du ', 'Zuo ', 'Xiao ', 'Tu ', 'Gui ', 'Ku ', 'Pang ', 'Ting ', 'You ', 'Bu ', 'Ding ', 'Cheng ', 'Lai ', 'Bei ', 'Ji ', 'An ', 'Shu ', 'Kang ', 'Yong ', 'Tuo ', 'Song ', 'Shu ', 'Qing ', 'Yu ', 'Yu ', 'Miao ', 'Sou ', 'Ce ', 'Xiang ', 'Fei ', 'Jiu ', 'He ', 'Hui ', 'Liu ', 'Sha ', 'Lian ', 'Lang ', 'Sou ', 'Jian ', 'Pou ', 'Qing ', 'Jiu ', 'Jiu ', 'Qin ', 'Ao ', 'Kuo ', 'Lou ', 'Yin ', 'Liao ', 'Dai ', 'Lu ', 'Yi ', 'Chu ', 'Chan ', 'Tu ', 'Si ', 'Xin ', 'Miao ', 'Chang ', 'Wu ', 'Fei ', 'Guang ', 'Koc ', 'Kuai ', 'Bi ', 'Qiang ', 'Xie ', 'Lin ', 'Lin ', 'Liao ', 'Lu ', '[?] ', 'Ying ', 'Xian ', 'Ting ', 'Yong ', 'Li ', 'Ting ', 'Yin ', 'Xun ', 'Yan ', 'Ting ', 'Di ', 'Po ', 'Jian ', 'Hui ', 'Nai ', 'Hui ', 'Gong ', 'Nian '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php
new file mode 100644
index 000000000..aee88eac1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php
@@ -0,0 +1 @@
+<?php return ['Kai ', 'Bian ', 'Yi ', 'Qi ', 'Nong ', 'Fen ', 'Ju ', 'Yan ', 'Yi ', 'Zang ', 'Bi ', 'Yi ', 'Yi ', 'Er ', 'San ', 'Shi ', 'Er ', 'Shi ', 'Shi ', 'Gong ', 'Diao ', 'Yin ', 'Hu ', 'Fu ', 'Hong ', 'Wu ', 'Tui ', 'Chi ', 'Jiang ', 'Ba ', 'Shen ', 'Di ', 'Zhang ', 'Jue ', 'Tao ', 'Fu ', 'Di ', 'Mi ', 'Xian ', 'Hu ', 'Chao ', 'Nu ', 'Jing ', 'Zhen ', 'Yi ', 'Mi ', 'Quan ', 'Wan ', 'Shao ', 'Ruo ', 'Xuan ', 'Jing ', 'Dun ', 'Zhang ', 'Jiang ', 'Qiang ', 'Peng ', 'Dan ', 'Qiang ', 'Bi ', 'Bi ', 'She ', 'Dan ', 'Jian ', 'Gou ', 'Sei ', 'Fa ', 'Bi ', 'Kou ', 'Nagi ', 'Bie ', 'Xiao ', 'Dan ', 'Kuo ', 'Qiang ', 'Hong ', 'Mi ', 'Kuo ', 'Wan ', 'Jue ', 'Ji ', 'Ji ', 'Gui ', 'Dang ', 'Lu ', 'Lu ', 'Tuan ', 'Hui ', 'Zhi ', 'Hui ', 'Hui ', 'Yi ', 'Yi ', 'Yi ', 'Yi ', 'Huo ', 'Huo ', 'Shan ', 'Xing ', 'Wen ', 'Tong ', 'Yan ', 'Yan ', 'Yu ', 'Chi ', 'Cai ', 'Biao ', 'Diao ', 'Bin ', 'Peng ', 'Yong ', 'Piao ', 'Zhang ', 'Ying ', 'Chi ', 'Chi ', 'Zhuo ', 'Tuo ', 'Ji ', 'Pang ', 'Zhong ', 'Yi ', 'Wang ', 'Che ', 'Bi ', 'Chi ', 'Ling ', 'Fu ', 'Wang ', 'Zheng ', 'Cu ', 'Wang ', 'Jing ', 'Dai ', 'Xi ', 'Xun ', 'Hen ', 'Yang ', 'Huai ', 'Lu ', 'Hou ', 'Wa ', 'Cheng ', 'Zhi ', 'Xu ', 'Jing ', 'Tu ', 'Cong ', '[?] ', 'Lai ', 'Cong ', 'De ', 'Pai ', 'Xi ', '[?] ', 'Qi ', 'Chang ', 'Zhi ', 'Cong ', 'Zhou ', 'Lai ', 'Yu ', 'Xie ', 'Jie ', 'Jian ', 'Chi ', 'Jia ', 'Bian ', 'Huang ', 'Fu ', 'Xun ', 'Wei ', 'Pang ', 'Yao ', 'Wei ', 'Xi ', 'Zheng ', 'Piao ', 'Chi ', 'De ', 'Zheng ', 'Zheng ', 'Bie ', 'De ', 'Chong ', 'Che ', 'Jiao ', 'Wei ', 'Jiao ', 'Hui ', 'Mei ', 'Long ', 'Xiang ', 'Bao ', 'Qu ', 'Xin ', 'Shu ', 'Bi ', 'Yi ', 'Le ', 'Ren ', 'Dao ', 'Ding ', 'Gai ', 'Ji ', 'Ren ', 'Ren ', 'Chan ', 'Tan ', 'Te ', 'Te ', 'Gan ', 'Qi ', 'Shi ', 'Cun ', 'Zhi ', 'Wang ', 'Mang ', 'Xi ', 'Fan ', 'Ying ', 'Tian ', 'Min ', 'Min ', 'Zhong ', 'Chong ', 'Wu ', 'Ji ', 'Wu ', 'Xi ', 'Ye ', 'You ', 'Wan ', 'Cong ', 'Zhong ', 'Kuai ', 'Yu ', 'Bian ', 'Zhi ', 'Qi ', 'Cui ', 'Chen ', 'Tai ', 'Tun ', 'Qian ', 'Nian ', 'Hun ', 'Xiong ', 'Niu ', 'Wang ', 'Xian ', 'Xin ', 'Kang ', 'Hu ', 'Kai ', 'Fen '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x060.php b/vendor/voku/portable-ascii/src/voku/helper/data/x060.php
new file mode 100644
index 000000000..91122b6a3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x060.php
@@ -0,0 +1 @@
+<?php return ['Huai ', 'Tai ', 'Song ', 'Wu ', 'Ou ', 'Chang ', 'Chuang ', 'Ju ', 'Yi ', 'Bao ', 'Chao ', 'Min ', 'Pei ', 'Zuo ', 'Zen ', 'Yang ', 'Kou ', 'Ban ', 'Nu ', 'Nao ', 'Zheng ', 'Pa ', 'Bu ', 'Tie ', 'Gu ', 'Hu ', 'Ju ', 'Da ', 'Lian ', 'Si ', 'Chou ', 'Di ', 'Dai ', 'Yi ', 'Tu ', 'You ', 'Fu ', 'Ji ', 'Peng ', 'Xing ', 'Yuan ', 'Ni ', 'Guai ', 'Fu ', 'Xi ', 'Bi ', 'You ', 'Qie ', 'Xuan ', 'Cong ', 'Bing ', 'Huang ', 'Xu ', 'Chu ', 'Pi ', 'Xi ', 'Xi ', 'Tan ', 'Koraeru ', 'Zong ', 'Dui ', '[?] ', 'Ki ', 'Yi ', 'Chi ', 'Ren ', 'Xun ', 'Shi ', 'Xi ', 'Lao ', 'Heng ', 'Kuang ', 'Mu ', 'Zhi ', 'Xie ', 'Lian ', 'Tiao ', 'Huang ', 'Die ', 'Hao ', 'Kong ', 'Gui ', 'Heng ', 'Xi ', 'Xiao ', 'Shu ', 'S ', 'Kua ', 'Qiu ', 'Yang ', 'Hui ', 'Hui ', 'Chi ', 'Jia ', 'Yi ', 'Xiong ', 'Guai ', 'Lin ', 'Hui ', 'Zi ', 'Xu ', 'Chi ', 'Xiang ', 'Nu ', 'Hen ', 'En ', 'Ke ', 'Tong ', 'Tian ', 'Gong ', 'Quan ', 'Xi ', 'Qia ', 'Yue ', 'Peng ', 'Ken ', 'De ', 'Hui ', 'E ', 'Kyuu ', 'Tong ', 'Yan ', 'Kai ', 'Ce ', 'Nao ', 'Yun ', 'Mang ', 'Yong ', 'Yong ', 'Yuan ', 'Pi ', 'Kun ', 'Qiao ', 'Yue ', 'Yu ', 'Yu ', 'Jie ', 'Xi ', 'Zhe ', 'Lin ', 'Ti ', 'Han ', 'Hao ', 'Qie ', 'Ti ', 'Bu ', 'Yi ', 'Qian ', 'Hui ', 'Xi ', 'Bei ', 'Man ', 'Yi ', 'Heng ', 'Song ', 'Quan ', 'Cheng ', 'Hui ', 'Wu ', 'Wu ', 'You ', 'Li ', 'Liang ', 'Huan ', 'Cong ', 'Yi ', 'Yue ', 'Li ', 'Nin ', 'Nao ', 'E ', 'Que ', 'Xuan ', 'Qian ', 'Wu ', 'Min ', 'Cong ', 'Fei ', 'Bei ', 'Duo ', 'Cui ', 'Chang ', 'Men ', 'Li ', 'Ji ', 'Guan ', 'Guan ', 'Xing ', 'Dao ', 'Qi ', 'Kong ', 'Tian ', 'Lun ', 'Xi ', 'Kan ', 'Kun ', 'Ni ', 'Qing ', 'Chou ', 'Dun ', 'Guo ', 'Chan ', 'Liang ', 'Wan ', 'Yuan ', 'Jin ', 'Ji ', 'Lin ', 'Yu ', 'Huo ', 'He ', 'Quan ', 'Tan ', 'Ti ', 'Ti ', 'Nie ', 'Wang ', 'Chuo ', 'Bu ', 'Hun ', 'Xi ', 'Tang ', 'Xin ', 'Wei ', 'Hui ', 'E ', 'Rui ', 'Zong ', 'Jian ', 'Yong ', 'Dian ', 'Ju ', 'Can ', 'Cheng ', 'De ', 'Bei ', 'Qie ', 'Can ', 'Dan ', 'Guan ', 'Duo ', 'Nao ', 'Yun ', 'Xiang ', 'Zhui ', 'Die ', 'Huang ', 'Chun ', 'Qiong ', 'Re ', 'Xing ', 'Ce ', 'Bian ', 'Hun ', 'Zong ', 'Ti '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x061.php b/vendor/voku/portable-ascii/src/voku/helper/data/x061.php
new file mode 100644
index 000000000..b2d25d81a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x061.php
@@ -0,0 +1 @@
+<?php return ['Qiao ', 'Chou ', 'Bei ', 'Xuan ', 'Wei ', 'Ge ', 'Qian ', 'Wei ', 'Yu ', 'Yu ', 'Bi ', 'Xuan ', 'Huan ', 'Min ', 'Bi ', 'Yi ', 'Mian ', 'Yong ', 'Kai ', 'Dang ', 'Yin ', 'E ', 'Chen ', 'Mou ', 'Ke ', 'Ke ', 'Yu ', 'Ai ', 'Qie ', 'Yan ', 'Nuo ', 'Gan ', 'Yun ', 'Zong ', 'Sai ', 'Leng ', 'Fen ', '[?] ', 'Kui ', 'Kui ', 'Que ', 'Gong ', 'Yun ', 'Su ', 'Su ', 'Qi ', 'Yao ', 'Song ', 'Huang ', 'Ji ', 'Gu ', 'Ju ', 'Chuang ', 'Ni ', 'Xie ', 'Kai ', 'Zheng ', 'Yong ', 'Cao ', 'Sun ', 'Shen ', 'Bo ', 'Kai ', 'Yuan ', 'Xie ', 'Hun ', 'Yong ', 'Yang ', 'Li ', 'Sao ', 'Tao ', 'Yin ', 'Ci ', 'Xu ', 'Qian ', 'Tai ', 'Huang ', 'Yun ', 'Shen ', 'Ming ', '[?] ', 'She ', 'Cong ', 'Piao ', 'Mo ', 'Mu ', 'Guo ', 'Chi ', 'Can ', 'Can ', 'Can ', 'Cui ', 'Min ', 'Te ', 'Zhang ', 'Tong ', 'Ao ', 'Shuang ', 'Man ', 'Guan ', 'Que ', 'Zao ', 'Jiu ', 'Hui ', 'Kai ', 'Lian ', 'Ou ', 'Song ', 'Jin ', 'Yin ', 'Lu ', 'Shang ', 'Wei ', 'Tuan ', 'Man ', 'Qian ', 'She ', 'Yong ', 'Qing ', 'Kang ', 'Di ', 'Zhi ', 'Lou ', 'Juan ', 'Qi ', 'Qi ', 'Yu ', 'Ping ', 'Liao ', 'Cong ', 'You ', 'Chong ', 'Zhi ', 'Tong ', 'Cheng ', 'Qi ', 'Qu ', 'Peng ', 'Bei ', 'Bie ', 'Chun ', 'Jiao ', 'Zeng ', 'Chi ', 'Lian ', 'Ping ', 'Kui ', 'Hui ', 'Qiao ', 'Cheng ', 'Yin ', 'Yin ', 'Xi ', 'Xi ', 'Dan ', 'Tan ', 'Duo ', 'Dui ', 'Dui ', 'Su ', 'Jue ', 'Ce ', 'Xiao ', 'Fan ', 'Fen ', 'Lao ', 'Lao ', 'Chong ', 'Han ', 'Qi ', 'Xian ', 'Min ', 'Jing ', 'Liao ', 'Wu ', 'Can ', 'Jue ', 'Cu ', 'Xian ', 'Tan ', 'Sheng ', 'Pi ', 'Yi ', 'Chu ', 'Xian ', 'Nao ', 'Dan ', 'Tan ', 'Jing ', 'Song ', 'Han ', 'Jiao ', 'Wai ', 'Huan ', 'Dong ', 'Qin ', 'Qin ', 'Qu ', 'Cao ', 'Ken ', 'Xie ', 'Ying ', 'Ao ', 'Mao ', 'Yi ', 'Lin ', 'Se ', 'Jun ', 'Huai ', 'Men ', 'Lan ', 'Ai ', 'Lin ', 'Yan ', 'Gua ', 'Xia ', 'Chi ', 'Yu ', 'Yin ', 'Dai ', 'Meng ', 'Ai ', 'Meng ', 'Dui ', 'Qi ', 'Mo ', 'Lan ', 'Men ', 'Chou ', 'Zhi ', 'Nuo ', 'Nuo ', 'Yan ', 'Yang ', 'Bo ', 'Zhi ', 'Kuang ', 'Kuang ', 'You ', 'Fu ', 'Liu ', 'Mie ', 'Cheng ', '[?] ', 'Chan ', 'Meng ', 'Lan ', 'Huai ', 'Xuan ', 'Rang ', 'Chan ', 'Ji ', 'Ju ', 'Huan ', 'She ', 'Yi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x062.php b/vendor/voku/portable-ascii/src/voku/helper/data/x062.php
new file mode 100644
index 000000000..b8808e7e6
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x062.php
@@ -0,0 +1 @@
+<?php return ['Lian ', 'Nan ', 'Mi ', 'Tang ', 'Jue ', 'Gang ', 'Gang ', 'Gang ', 'Ge ', 'Yue ', 'Wu ', 'Jian ', 'Xu ', 'Shu ', 'Rong ', 'Xi ', 'Cheng ', 'Wo ', 'Jie ', 'Ge ', 'Jian ', 'Qiang ', 'Huo ', 'Qiang ', 'Zhan ', 'Dong ', 'Qi ', 'Jia ', 'Die ', 'Zei ', 'Jia ', 'Ji ', 'Shi ', 'Kan ', 'Ji ', 'Kui ', 'Gai ', 'Deng ', 'Zhan ', 'Chuang ', 'Ge ', 'Jian ', 'Jie ', 'Yu ', 'Jian ', 'Yan ', 'Lu ', 'Xi ', 'Zhan ', 'Xi ', 'Xi ', 'Chuo ', 'Dai ', 'Qu ', 'Hu ', 'Hu ', 'Hu ', 'E ', 'Shi ', 'Li ', 'Mao ', 'Hu ', 'Li ', 'Fang ', 'Suo ', 'Bian ', 'Dian ', 'Jiong ', 'Shang ', 'Yi ', 'Yi ', 'Shan ', 'Hu ', 'Fei ', 'Yan ', 'Shou ', 'T ', 'Cai ', 'Zha ', 'Qiu ', 'Le ', 'Bu ', 'Ba ', 'Da ', 'Reng ', 'Fu ', 'Hameru ', 'Zai ', 'Tuo ', 'Zhang ', 'Diao ', 'Kang ', 'Yu ', 'Ku ', 'Han ', 'Shen ', 'Cha ', 'Yi ', 'Gu ', 'Kou ', 'Wu ', 'Tuo ', 'Qian ', 'Zhi ', 'Ren ', 'Kuo ', 'Men ', 'Sao ', 'Yang ', 'Niu ', 'Ban ', 'Che ', 'Rao ', 'Xi ', 'Qian ', 'Ban ', 'Jia ', 'Yu ', 'Fu ', 'Ao ', 'Xi ', 'Pi ', 'Zhi ', 'Zi ', 'E ', 'Dun ', 'Zhao ', 'Cheng ', 'Ji ', 'Yan ', 'Kuang ', 'Bian ', 'Chao ', 'Ju ', 'Wen ', 'Hu ', 'Yue ', 'Jue ', 'Ba ', 'Qin ', 'Zhen ', 'Zheng ', 'Yun ', 'Wan ', 'Nu ', 'Yi ', 'Shu ', 'Zhua ', 'Pou ', 'Tou ', 'Dou ', 'Kang ', 'Zhe ', 'Pou ', 'Fu ', 'Pao ', 'Ba ', 'Ao ', 'Ze ', 'Tuan ', 'Kou ', 'Lun ', 'Qiang ', '[?] ', 'Hu ', 'Bao ', 'Bing ', 'Zhi ', 'Peng ', 'Tan ', 'Pu ', 'Pi ', 'Tai ', 'Yao ', 'Zhen ', 'Zha ', 'Yang ', 'Bao ', 'He ', 'Ni ', 'Yi ', 'Di ', 'Chi ', 'Pi ', 'Za ', 'Mo ', 'Mo ', 'Shen ', 'Ya ', 'Chou ', 'Qu ', 'Min ', 'Chu ', 'Jia ', 'Fu ', 'Zhan ', 'Zhu ', 'Dan ', 'Chai ', 'Mu ', 'Nian ', 'La ', 'Fu ', 'Pao ', 'Ban ', 'Pai ', 'Ling ', 'Na ', 'Guai ', 'Qian ', 'Ju ', 'Tuo ', 'Ba ', 'Tuo ', 'Tuo ', 'Ao ', 'Ju ', 'Zhuo ', 'Pan ', 'Zhao ', 'Bai ', 'Bai ', 'Di ', 'Ni ', 'Ju ', 'Kuo ', 'Long ', 'Jian ', '[?] ', 'Yong ', 'Lan ', 'Ning ', 'Bo ', 'Ze ', 'Qian ', 'Hen ', 'Gua ', 'Shi ', 'Jie ', 'Zheng ', 'Nin ', 'Gong ', 'Gong ', 'Quan ', 'Shuan ', 'Cun ', 'Zan ', 'Kao ', 'Chi ', 'Xie ', 'Ce ', 'Hui ', 'Pin ', 'Zhuai ', 'Shi ', 'Na '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x063.php b/vendor/voku/portable-ascii/src/voku/helper/data/x063.php
new file mode 100644
index 000000000..5702c45cc
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x063.php
@@ -0,0 +1 @@
+<?php return ['Bo ', 'Chi ', 'Gua ', 'Zhi ', 'Kuo ', 'Duo ', 'Duo ', 'Zhi ', 'Qie ', 'An ', 'Nong ', 'Zhen ', 'Ge ', 'Jiao ', 'Ku ', 'Dong ', 'Ru ', 'Tiao ', 'Lie ', 'Zha ', 'Lu ', 'Die ', 'Wa ', 'Jue ', 'Mushiru ', 'Ju ', 'Zhi ', 'Luan ', 'Ya ', 'Zhua ', 'Ta ', 'Xie ', 'Nao ', 'Dang ', 'Jiao ', 'Zheng ', 'Ji ', 'Hui ', 'Xun ', 'Ku ', 'Ai ', 'Tuo ', 'Nuo ', 'Cuo ', 'Bo ', 'Geng ', 'Ti ', 'Zhen ', 'Cheng ', 'Suo ', 'Suo ', 'Keng ', 'Mei ', 'Long ', 'Ju ', 'Peng ', 'Jian ', 'Yi ', 'Ting ', 'Shan ', 'Nuo ', 'Wan ', 'Xie ', 'Cha ', 'Feng ', 'Jiao ', 'Wu ', 'Jun ', 'Jiu ', 'Tong ', 'Kun ', 'Huo ', 'Tu ', 'Zhuo ', 'Pou ', 'Le ', 'Ba ', 'Han ', 'Shao ', 'Nie ', 'Juan ', 'Ze ', 'Song ', 'Ye ', 'Jue ', 'Bu ', 'Huan ', 'Bu ', 'Zun ', 'Yi ', 'Zhai ', 'Lu ', 'Sou ', 'Tuo ', 'Lao ', 'Sun ', 'Bang ', 'Jian ', 'Huan ', 'Dao ', '[?] ', 'Wan ', 'Qin ', 'Peng ', 'She ', 'Lie ', 'Min ', 'Men ', 'Fu ', 'Bai ', 'Ju ', 'Dao ', 'Wo ', 'Ai ', 'Juan ', 'Yue ', 'Zong ', 'Chen ', 'Chui ', 'Jie ', 'Tu ', 'Ben ', 'Na ', 'Nian ', 'Nuo ', 'Zu ', 'Wo ', 'Xi ', 'Xian ', 'Cheng ', 'Dian ', 'Sao ', 'Lun ', 'Qing ', 'Gang ', 'Duo ', 'Shou ', 'Diao ', 'Pou ', 'Di ', 'Zhang ', 'Gun ', 'Ji ', 'Tao ', 'Qia ', 'Qi ', 'Pai ', 'Shu ', 'Qian ', 'Ling ', 'Yi ', 'Ya ', 'Jue ', 'Zheng ', 'Liang ', 'Gua ', 'Yi ', 'Huo ', 'Shan ', 'Zheng ', 'Lue ', 'Cai ', 'Tan ', 'Che ', 'Bing ', 'Jie ', 'Ti ', 'Kong ', 'Tui ', 'Yan ', 'Cuo ', 'Zou ', 'Ju ', 'Tian ', 'Qian ', 'Ken ', 'Bai ', 'Shou ', 'Jie ', 'Lu ', 'Guo ', 'Haba ', '[?] ', 'Zhi ', 'Dan ', 'Mang ', 'Xian ', 'Sao ', 'Guan ', 'Peng ', 'Yuan ', 'Nuo ', 'Jian ', 'Zhen ', 'Jiu ', 'Jian ', 'Yu ', 'Yan ', 'Kui ', 'Nan ', 'Hong ', 'Rou ', 'Pi ', 'Wei ', 'Sai ', 'Zou ', 'Xuan ', 'Miao ', 'Ti ', 'Nie ', 'Cha ', 'Shi ', 'Zong ', 'Zhen ', 'Yi ', 'Shun ', 'Heng ', 'Bian ', 'Yang ', 'Huan ', 'Yan ', 'Zuan ', 'An ', 'Xu ', 'Ya ', 'Wo ', 'Ke ', 'Chuai ', 'Ji ', 'Ti ', 'La ', 'La ', 'Cheng ', 'Kai ', 'Jiu ', 'Jiu ', 'Tu ', 'Jie ', 'Hui ', 'Geng ', 'Chong ', 'Shuo ', 'She ', 'Xie ', 'Yuan ', 'Qian ', 'Ye ', 'Cha ', 'Zha ', 'Bei ', 'Yao ', '[?] ', '[?] ', 'Lan ', 'Wen ', 'Qin '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x064.php b/vendor/voku/portable-ascii/src/voku/helper/data/x064.php
new file mode 100644
index 000000000..ceaefdc88
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x064.php
@@ -0,0 +1 @@
+<?php return ['Chan ', 'Ge ', 'Lou ', 'Zong ', 'Geng ', 'Jiao ', 'Gou ', 'Qin ', 'Yong ', 'Que ', 'Chou ', 'Chi ', 'Zhan ', 'Sun ', 'Sun ', 'Bo ', 'Chu ', 'Rong ', 'Beng ', 'Cuo ', 'Sao ', 'Ke ', 'Yao ', 'Dao ', 'Zhi ', 'Nu ', 'Xie ', 'Jian ', 'Sou ', 'Qiu ', 'Gao ', 'Xian ', 'Shuo ', 'Sang ', 'Jin ', 'Mie ', 'E ', 'Chui ', 'Nuo ', 'Shan ', 'Ta ', 'Jie ', 'Tang ', 'Pan ', 'Ban ', 'Da ', 'Li ', 'Tao ', 'Hu ', 'Zhi ', 'Wa ', 'Xia ', 'Qian ', 'Wen ', 'Qiang ', 'Tian ', 'Zhen ', 'E ', 'Xi ', 'Nuo ', 'Quan ', 'Cha ', 'Zha ', 'Ge ', 'Wu ', 'En ', 'She ', 'Kang ', 'She ', 'Shu ', 'Bai ', 'Yao ', 'Bin ', 'Sou ', 'Tan ', 'Sa ', 'Chan ', 'Suo ', 'Liao ', 'Chong ', 'Chuang ', 'Guo ', 'Bing ', 'Feng ', 'Shuai ', 'Di ', 'Qi ', 'Sou ', 'Zhai ', 'Lian ', 'Tang ', 'Chi ', 'Guan ', 'Lu ', 'Luo ', 'Lou ', 'Zong ', 'Gai ', 'Hu ', 'Zha ', 'Chuang ', 'Tang ', 'Hua ', 'Cui ', 'Nai ', 'Mo ', 'Jiang ', 'Gui ', 'Ying ', 'Zhi ', 'Ao ', 'Zhi ', 'Nie ', 'Man ', 'Shan ', 'Kou ', 'Shu ', 'Suo ', 'Tuan ', 'Jiao ', 'Mo ', 'Mo ', 'Zhe ', 'Xian ', 'Keng ', 'Piao ', 'Jiang ', 'Yin ', 'Gou ', 'Qian ', 'Lue ', 'Ji ', 'Ying ', 'Jue ', 'Pie ', 'Pie ', 'Lao ', 'Dun ', 'Xian ', 'Ruan ', 'Kui ', 'Zan ', 'Yi ', 'Xun ', 'Cheng ', 'Cheng ', 'Sa ', 'Nao ', 'Heng ', 'Si ', 'Qian ', 'Huang ', 'Da ', 'Zun ', 'Nian ', 'Lin ', 'Zheng ', 'Hui ', 'Zhuang ', 'Jiao ', 'Ji ', 'Cao ', 'Dan ', 'Dan ', 'Che ', 'Bo ', 'Che ', 'Jue ', 'Xiao ', 'Liao ', 'Ben ', 'Fu ', 'Qiao ', 'Bo ', 'Cuo ', 'Zhuo ', 'Zhuan ', 'Tuo ', 'Pu ', 'Qin ', 'Dun ', 'Nian ', '[?] ', 'Xie ', 'Lu ', 'Jiao ', 'Cuan ', 'Ta ', 'Han ', 'Qiao ', 'Zhua ', 'Jian ', 'Gan ', 'Yong ', 'Lei ', 'Kuo ', 'Lu ', 'Shan ', 'Zhuo ', 'Ze ', 'Pu ', 'Chuo ', 'Ji ', 'Dang ', 'Suo ', 'Cao ', 'Qing ', 'Jing ', 'Huan ', 'Jie ', 'Qin ', 'Kuai ', 'Dan ', 'Xi ', 'Ge ', 'Pi ', 'Bo ', 'Ao ', 'Ju ', 'Ye ', '[?] ', 'Mang ', 'Sou ', 'Mi ', 'Ji ', 'Tai ', 'Zhuo ', 'Dao ', 'Xing ', 'Lan ', 'Ca ', 'Ju ', 'Ye ', 'Ru ', 'Ye ', 'Ye ', 'Ni ', 'Hu ', 'Ji ', 'Bin ', 'Ning ', 'Ge ', 'Zhi ', 'Jie ', 'Kuo ', 'Mo ', 'Jian ', 'Xie ', 'Lie ', 'Tan ', 'Bai ', 'Sou ', 'Lu ', 'Lue ', 'Rao ', 'Zhi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x065.php b/vendor/voku/portable-ascii/src/voku/helper/data/x065.php
new file mode 100644
index 000000000..da927615a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x065.php
@@ -0,0 +1 @@
+<?php return ['Pan ', 'Yang ', 'Lei ', 'Sa ', 'Shu ', 'Zan ', 'Nian ', 'Xian ', 'Jun ', 'Huo ', 'Li ', 'La ', 'Han ', 'Ying ', 'Lu ', 'Long ', 'Qian ', 'Qian ', 'Zan ', 'Qian ', 'Lan ', 'San ', 'Ying ', 'Mei ', 'Rang ', 'Chan ', '[?] ', 'Cuan ', 'Xi ', 'She ', 'Luo ', 'Jun ', 'Mi ', 'Li ', 'Zan ', 'Luan ', 'Tan ', 'Zuan ', 'Li ', 'Dian ', 'Wa ', 'Dang ', 'Jiao ', 'Jue ', 'Lan ', 'Li ', 'Nang ', 'Zhi ', 'Gui ', 'Gui ', 'Qi ', 'Xin ', 'Pu ', 'Sui ', 'Shou ', 'Kao ', 'You ', 'Gai ', 'Yi ', 'Gong ', 'Gan ', 'Ban ', 'Fang ', 'Zheng ', 'Bo ', 'Dian ', 'Kou ', 'Min ', 'Wu ', 'Gu ', 'He ', 'Ce ', 'Xiao ', 'Mi ', 'Chu ', 'Ge ', 'Di ', 'Xu ', 'Jiao ', 'Min ', 'Chen ', 'Jiu ', 'Zhen ', 'Duo ', 'Yu ', 'Chi ', 'Ao ', 'Bai ', 'Xu ', 'Jiao ', 'Duo ', 'Lian ', 'Nie ', 'Bi ', 'Chang ', 'Dian ', 'Duo ', 'Yi ', 'Gan ', 'San ', 'Ke ', 'Yan ', 'Dun ', 'Qi ', 'Dou ', 'Xiao ', 'Duo ', 'Jiao ', 'Jing ', 'Yang ', 'Xia ', 'Min ', 'Shu ', 'Ai ', 'Qiao ', 'Ai ', 'Zheng ', 'Di ', 'Zhen ', 'Fu ', 'Shu ', 'Liao ', 'Qu ', 'Xiong ', 'Xi ', 'Jiao ', 'Sen ', 'Jiao ', 'Zhuo ', 'Yi ', 'Lian ', 'Bi ', 'Li ', 'Xiao ', 'Xiao ', 'Wen ', 'Xue ', 'Qi ', 'Qi ', 'Zhai ', 'Bin ', 'Jue ', 'Zhai ', '[?] ', 'Fei ', 'Ban ', 'Ban ', 'Lan ', 'Yu ', 'Lan ', 'Wei ', 'Dou ', 'Sheng ', 'Liao ', 'Jia ', 'Hu ', 'Xie ', 'Jia ', 'Yu ', 'Zhen ', 'Jiao ', 'Wo ', 'Tou ', 'Chu ', 'Jin ', 'Chi ', 'Yin ', 'Fu ', 'Qiang ', 'Zhan ', 'Qu ', 'Zhuo ', 'Zhan ', 'Duan ', 'Zhuo ', 'Si ', 'Xin ', 'Zhuo ', 'Zhuo ', 'Qin ', 'Lin ', 'Zhuo ', 'Chu ', 'Duan ', 'Zhu ', 'Fang ', 'Xie ', 'Hang ', 'Yu ', 'Shi ', 'Pei ', 'You ', 'Mye ', 'Pang ', 'Qi ', 'Zhan ', 'Mao ', 'Lu ', 'Pei ', 'Pi ', 'Liu ', 'Fu ', 'Fang ', 'Xuan ', 'Jing ', 'Jing ', 'Ni ', 'Zu ', 'Zhao ', 'Yi ', 'Liu ', 'Shao ', 'Jian ', 'Es ', 'Yi ', 'Qi ', 'Zhi ', 'Fan ', 'Piao ', 'Fan ', 'Zhan ', 'Guai ', 'Sui ', 'Yu ', 'Wu ', 'Ji ', 'Ji ', 'Ji ', 'Huo ', 'Ri ', 'Dan ', 'Jiu ', 'Zhi ', 'Zao ', 'Xie ', 'Tiao ', 'Xun ', 'Xu ', 'Xu ', 'Xu ', 'Gan ', 'Han ', 'Tai ', 'Di ', 'Xu ', 'Chan ', 'Shi ', 'Kuang ', 'Yang ', 'Shi ', 'Wang ', 'Min ', 'Min ', 'Tun ', 'Chun ', 'Wu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x066.php b/vendor/voku/portable-ascii/src/voku/helper/data/x066.php
new file mode 100644
index 000000000..dfae09bad
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x066.php
@@ -0,0 +1 @@
+<?php return ['Yun ', 'Bei ', 'Ang ', 'Ze ', 'Ban ', 'Jie ', 'Kun ', 'Sheng ', 'Hu ', 'Fang ', 'Hao ', 'Gui ', 'Chang ', 'Xuan ', 'Ming ', 'Hun ', 'Fen ', 'Qin ', 'Hu ', 'Yi ', 'Xi ', 'Xin ', 'Yan ', 'Ze ', 'Fang ', 'Tan ', 'Shen ', 'Ju ', 'Yang ', 'Zan ', 'Bing ', 'Xing ', 'Ying ', 'Xuan ', 'Pei ', 'Zhen ', 'Ling ', 'Chun ', 'Hao ', 'Mei ', 'Zuo ', 'Mo ', 'Bian ', 'Xu ', 'Hun ', 'Zhao ', 'Zong ', 'Shi ', 'Shi ', 'Yu ', 'Fei ', 'Die ', 'Mao ', 'Ni ', 'Chang ', 'Wen ', 'Dong ', 'Ai ', 'Bing ', 'Ang ', 'Zhou ', 'Long ', 'Xian ', 'Kuang ', 'Tiao ', 'Chao ', 'Shi ', 'Huang ', 'Huang ', 'Xuan ', 'Kui ', 'Xu ', 'Jiao ', 'Jin ', 'Zhi ', 'Jin ', 'Shang ', 'Tong ', 'Hong ', 'Yan ', 'Gai ', 'Xiang ', 'Shai ', 'Xiao ', 'Ye ', 'Yun ', 'Hui ', 'Han ', 'Han ', 'Jun ', 'Wan ', 'Xian ', 'Kun ', 'Zhou ', 'Xi ', 'Cheng ', 'Sheng ', 'Bu ', 'Zhe ', 'Zhe ', 'Wu ', 'Han ', 'Hui ', 'Hao ', 'Chen ', 'Wan ', 'Tian ', 'Zhuo ', 'Zui ', 'Zhou ', 'Pu ', 'Jing ', 'Xi ', 'Shan ', 'Yi ', 'Xi ', 'Qing ', 'Qi ', 'Jing ', 'Gui ', 'Zhen ', 'Yi ', 'Zhi ', 'An ', 'Wan ', 'Lin ', 'Liang ', 'Chang ', 'Wang ', 'Xiao ', 'Zan ', 'Hi ', 'Xuan ', 'Xuan ', 'Yi ', 'Xia ', 'Yun ', 'Hui ', 'Fu ', 'Min ', 'Kui ', 'He ', 'Ying ', 'Du ', 'Wei ', 'Shu ', 'Qing ', 'Mao ', 'Nan ', 'Jian ', 'Nuan ', 'An ', 'Yang ', 'Chun ', 'Yao ', 'Suo ', 'Jin ', 'Ming ', 'Jiao ', 'Kai ', 'Gao ', 'Weng ', 'Chang ', 'Qi ', 'Hao ', 'Yan ', 'Li ', 'Ai ', 'Ji ', 'Gui ', 'Men ', 'Zan ', 'Xie ', 'Hao ', 'Mu ', 'Mo ', 'Cong ', 'Ni ', 'Zhang ', 'Hui ', 'Bao ', 'Han ', 'Xuan ', 'Chuan ', 'Liao ', 'Xian ', 'Dan ', 'Jing ', 'Pie ', 'Lin ', 'Tun ', 'Xi ', 'Yi ', 'Ji ', 'Huang ', 'Tai ', 'Ye ', 'Ye ', 'Li ', 'Tan ', 'Tong ', 'Xiao ', 'Fei ', 'Qin ', 'Zhao ', 'Hao ', 'Yi ', 'Xiang ', 'Xing ', 'Sen ', 'Jiao ', 'Bao ', 'Jing ', 'Yian ', 'Ai ', 'Ye ', 'Ru ', 'Shu ', 'Meng ', 'Xun ', 'Yao ', 'Pu ', 'Li ', 'Chen ', 'Kuang ', 'Die ', '[?] ', 'Yan ', 'Huo ', 'Lu ', 'Xi ', 'Rong ', 'Long ', 'Nang ', 'Luo ', 'Luan ', 'Shai ', 'Tang ', 'Yan ', 'Chu ', 'Yue ', 'Yue ', 'Qu ', 'Yi ', 'Geng ', 'Ye ', 'Hu ', 'He ', 'Shu ', 'Cao ', 'Cao ', 'Noboru ', 'Man ', 'Ceng ', 'Ceng ', 'Ti '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x067.php b/vendor/voku/portable-ascii/src/voku/helper/data/x067.php
new file mode 100644
index 000000000..01bedf802
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x067.php
@@ -0,0 +1 @@
+<?php return ['Zui ', 'Can ', 'Xu ', 'Hui ', 'Yin ', 'Qie ', 'Fen ', 'Pi ', 'Yue ', 'You ', 'Ruan ', 'Peng ', 'Ban ', 'Fu ', 'Ling ', 'Fei ', 'Qu ', '[?] ', 'Nu ', 'Tiao ', 'Shuo ', 'Zhen ', 'Lang ', 'Lang ', 'Juan ', 'Ming ', 'Huang ', 'Wang ', 'Tun ', 'Zhao ', 'Ji ', 'Qi ', 'Ying ', 'Zong ', 'Wang ', 'Tong ', 'Lang ', '[?] ', 'Meng ', 'Long ', 'Mu ', 'Deng ', 'Wei ', 'Mo ', 'Ben ', 'Zha ', 'Zhu ', 'Zhu ', '[?] ', 'Zhu ', 'Ren ', 'Ba ', 'Po ', 'Duo ', 'Duo ', 'Dao ', 'Li ', 'Qiu ', 'Ji ', 'Jiu ', 'Bi ', 'Xiu ', 'Ting ', 'Ci ', 'Sha ', 'Eburi ', 'Za ', 'Quan ', 'Qian ', 'Yu ', 'Gan ', 'Wu ', 'Cha ', 'Shan ', 'Xun ', 'Fan ', 'Wu ', 'Zi ', 'Li ', 'Xing ', 'Cai ', 'Cun ', 'Ren ', 'Shao ', 'Tuo ', 'Di ', 'Zhang ', 'Mang ', 'Chi ', 'Yi ', 'Gu ', 'Gong ', 'Du ', 'Yi ', 'Qi ', 'Shu ', 'Gang ', 'Tiao ', 'Moku ', 'Soma ', 'Tochi ', 'Lai ', 'Sugi ', 'Mang ', 'Yang ', 'Ma ', 'Miao ', 'Si ', 'Yuan ', 'Hang ', 'Fei ', 'Bei ', 'Jie ', 'Dong ', 'Gao ', 'Yao ', 'Xian ', 'Chu ', 'Qun ', 'Pa ', 'Shu ', 'Hua ', 'Xin ', 'Chou ', 'Zhu ', 'Chou ', 'Song ', 'Ban ', 'Song ', 'Ji ', 'Yue ', 'Jin ', 'Gou ', 'Ji ', 'Mao ', 'Pi ', 'Bi ', 'Wang ', 'Ang ', 'Fang ', 'Fen ', 'Yi ', 'Fu ', 'Nan ', 'Xi ', 'Hu ', 'Ya ', 'Dou ', 'Xun ', 'Zhen ', 'Yao ', 'Lin ', 'Rui ', 'E ', 'Mei ', 'Zhao ', 'Guo ', 'Zhi ', 'Cong ', 'Yun ', 'Waku ', 'Dou ', 'Shu ', 'Zao ', '[?] ', 'Li ', 'Haze ', 'Jian ', 'Cheng ', 'Matsu ', 'Qiang ', 'Feng ', 'Nan ', 'Xiao ', 'Xian ', 'Ku ', 'Ping ', 'Yi ', 'Xi ', 'Zhi ', 'Guai ', 'Xiao ', 'Jia ', 'Jia ', 'Gou ', 'Fu ', 'Mo ', 'Yi ', 'Ye ', 'Ye ', 'Shi ', 'Nie ', 'Bi ', 'Duo ', 'Yi ', 'Ling ', 'Bing ', 'Ni ', 'La ', 'He ', 'Pan ', 'Fan ', 'Zhong ', 'Dai ', 'Ci ', 'Yang ', 'Fu ', 'Bo ', 'Mou ', 'Gan ', 'Qi ', 'Ran ', 'Rou ', 'Mao ', 'Zhao ', 'Song ', 'Zhe ', 'Xia ', 'You ', 'Shen ', 'Ju ', 'Tuo ', 'Zuo ', 'Nan ', 'Ning ', 'Yong ', 'Di ', 'Zhi ', 'Zha ', 'Cha ', 'Dan ', 'Gu ', 'Pu ', 'Jiu ', 'Ao ', 'Fu ', 'Jian ', 'Bo ', 'Duo ', 'Ke ', 'Nai ', 'Zhu ', 'Bi ', 'Liu ', 'Chai ', 'Zha ', 'Si ', 'Zhu ', 'Pei ', 'Shi ', 'Guai ', 'Cha ', 'Yao ', 'Jue ', 'Jiu ', 'Shi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x068.php b/vendor/voku/portable-ascii/src/voku/helper/data/x068.php
new file mode 100644
index 000000000..eee5c80dc
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x068.php
@@ -0,0 +1 @@
+<?php return ['Zhi ', 'Liu ', 'Mei ', 'Hoy ', 'Rong ', 'Zha ', '[?] ', 'Biao ', 'Zhan ', 'Jie ', 'Long ', 'Dong ', 'Lu ', 'Sayng ', 'Li ', 'Lan ', 'Yong ', 'Shu ', 'Xun ', 'Shuan ', 'Qi ', 'Zhen ', 'Qi ', 'Li ', 'Yi ', 'Xiang ', 'Zhen ', 'Li ', 'Su ', 'Gua ', 'Kan ', 'Bing ', 'Ren ', 'Xiao ', 'Bo ', 'Ren ', 'Bing ', 'Zi ', 'Chou ', 'Yi ', 'Jie ', 'Xu ', 'Zhu ', 'Jian ', 'Zui ', 'Er ', 'Er ', 'You ', 'Fa ', 'Gong ', 'Kao ', 'Lao ', 'Zhan ', 'Li ', 'Yin ', 'Yang ', 'He ', 'Gen ', 'Zhi ', 'Chi ', 'Ge ', 'Zai ', 'Luan ', 'Fu ', 'Jie ', 'Hang ', 'Gui ', 'Tao ', 'Guang ', 'Wei ', 'Kuang ', 'Ru ', 'An ', 'An ', 'Juan ', 'Yi ', 'Zhuo ', 'Ku ', 'Zhi ', 'Qiong ', 'Tong ', 'Sang ', 'Sang ', 'Huan ', 'Jie ', 'Jiu ', 'Xue ', 'Duo ', 'Zhui ', 'Yu ', 'Zan ', 'Kasei ', 'Ying ', 'Masu ', '[?] ', 'Zhan ', 'Ya ', 'Nao ', 'Zhen ', 'Dang ', 'Qi ', 'Qiao ', 'Hua ', 'Kuai ', 'Jiang ', 'Zhuang ', 'Xun ', 'Suo ', 'Sha ', 'Zhen ', 'Bei ', 'Ting ', 'Gua ', 'Jing ', 'Bo ', 'Ben ', 'Fu ', 'Rui ', 'Tong ', 'Jue ', 'Xi ', 'Lang ', 'Liu ', 'Feng ', 'Qi ', 'Wen ', 'Jun ', 'Gan ', 'Cu ', 'Liang ', 'Qiu ', 'Ting ', 'You ', 'Mei ', 'Bang ', 'Long ', 'Peng ', 'Zhuang ', 'Di ', 'Xuan ', 'Tu ', 'Zao ', 'Ao ', 'Gu ', 'Bi ', 'Di ', 'Han ', 'Zi ', 'Zhi ', 'Ren ', 'Bei ', 'Geng ', 'Jian ', 'Huan ', 'Wan ', 'Nuo ', 'Jia ', 'Tiao ', 'Ji ', 'Xiao ', 'Lu ', 'Huan ', 'Shao ', 'Cen ', 'Fen ', 'Song ', 'Meng ', 'Wu ', 'Li ', 'Li ', 'Dou ', 'Cen ', 'Ying ', 'Suo ', 'Ju ', 'Ti ', 'Jie ', 'Kun ', 'Zhuo ', 'Shu ', 'Chan ', 'Fan ', 'Wei ', 'Jing ', 'Li ', 'Bing ', 'Fumoto ', 'Shikimi ', 'Tao ', 'Zhi ', 'Lai ', 'Lian ', 'Jian ', 'Zhuo ', 'Ling ', 'Li ', 'Qi ', 'Bing ', 'Zhun ', 'Cong ', 'Qian ', 'Mian ', 'Qi ', 'Qi ', 'Cai ', 'Gun ', 'Chan ', 'Te ', 'Fei ', 'Pai ', 'Bang ', 'Pou ', 'Hun ', 'Zong ', 'Cheng ', 'Zao ', 'Ji ', 'Li ', 'Peng ', 'Yu ', 'Yu ', 'Gu ', 'Hun ', 'Dong ', 'Tang ', 'Gang ', 'Wang ', 'Di ', 'Xi ', 'Fan ', 'Cheng ', 'Zhan ', 'Qi ', 'Yuan ', 'Yan ', 'Yu ', 'Quan ', 'Yi ', 'Sen ', 'Ren ', 'Chui ', 'Leng ', 'Qi ', 'Zhuo ', 'Fu ', 'Ke ', 'Lai ', 'Zou ', 'Zou ', 'Zhuo ', 'Guan ', 'Fen ', 'Fen ', 'Chen ', 'Qiong ', 'Nie '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x069.php b/vendor/voku/portable-ascii/src/voku/helper/data/x069.php
new file mode 100644
index 000000000..cf8d1d2e3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x069.php
@@ -0,0 +1 @@
+<?php return ['Wan ', 'Guo ', 'Lu ', 'Hao ', 'Jie ', 'Yi ', 'Chou ', 'Ju ', 'Ju ', 'Cheng ', 'Zuo ', 'Liang ', 'Qiang ', 'Zhi ', 'Zhui ', 'Ya ', 'Ju ', 'Bei ', 'Jiao ', 'Zhuo ', 'Zi ', 'Bin ', 'Peng ', 'Ding ', 'Chu ', 'Chang ', 'Kunugi ', 'Momiji ', 'Jian ', 'Gui ', 'Xi ', 'Du ', 'Qian ', 'Kunugi ', 'Soko ', 'Shide ', 'Luo ', 'Zhi ', 'Ken ', 'Myeng ', 'Tafu ', '[?] ', 'Peng ', 'Zhan ', '[?] ', 'Tuo ', 'Sen ', 'Duo ', 'Ye ', 'Fou ', 'Wei ', 'Wei ', 'Duan ', 'Jia ', 'Zong ', 'Jian ', 'Yi ', 'Shen ', 'Xi ', 'Yan ', 'Yan ', 'Chuan ', 'Zhan ', 'Chun ', 'Yu ', 'He ', 'Zha ', 'Wo ', 'Pian ', 'Bi ', 'Yao ', 'Huo ', 'Xu ', 'Ruo ', 'Yang ', 'La ', 'Yan ', 'Ben ', 'Hun ', 'Kui ', 'Jie ', 'Kui ', 'Si ', 'Feng ', 'Xie ', 'Tuo ', 'Zhi ', 'Jian ', 'Mu ', 'Mao ', 'Chu ', 'Hu ', 'Hu ', 'Lian ', 'Leng ', 'Ting ', 'Nan ', 'Yu ', 'You ', 'Mei ', 'Song ', 'Xuan ', 'Xuan ', 'Ying ', 'Zhen ', 'Pian ', 'Ye ', 'Ji ', 'Jie ', 'Ye ', 'Chu ', 'Shun ', 'Yu ', 'Cou ', 'Wei ', 'Mei ', 'Di ', 'Ji ', 'Jie ', 'Kai ', 'Qiu ', 'Ying ', 'Rou ', 'Heng ', 'Lou ', 'Le ', 'Hazou ', 'Katsura ', 'Pin ', 'Muro ', 'Gai ', 'Tan ', 'Lan ', 'Yun ', 'Yu ', 'Chen ', 'Lu ', 'Ju ', 'Sakaki ', '[?] ', 'Pi ', 'Xie ', 'Jia ', 'Yi ', 'Zhan ', 'Fu ', 'Nai ', 'Mi ', 'Lang ', 'Rong ', 'Gu ', 'Jian ', 'Ju ', 'Ta ', 'Yao ', 'Zhen ', 'Bang ', 'Sha ', 'Yuan ', 'Zi ', 'Ming ', 'Su ', 'Jia ', 'Yao ', 'Jie ', 'Huang ', 'Gan ', 'Fei ', 'Zha ', 'Qian ', 'Ma ', 'Sun ', 'Yuan ', 'Xie ', 'Rong ', 'Shi ', 'Zhi ', 'Cui ', 'Yun ', 'Ting ', 'Liu ', 'Rong ', 'Tang ', 'Que ', 'Zhai ', 'Si ', 'Sheng ', 'Ta ', 'Ke ', 'Xi ', 'Gu ', 'Qi ', 'Kao ', 'Gao ', 'Sun ', 'Pan ', 'Tao ', 'Ge ', 'Xun ', 'Dian ', 'Nou ', 'Ji ', 'Shuo ', 'Gou ', 'Chui ', 'Qiang ', 'Cha ', 'Qian ', 'Huai ', 'Mei ', 'Xu ', 'Gang ', 'Gao ', 'Zhuo ', 'Tuo ', 'Hashi ', 'Yang ', 'Dian ', 'Jia ', 'Jian ', 'Zui ', 'Kashi ', 'Ori ', 'Bin ', 'Zhu ', '[?] ', 'Xi ', 'Qi ', 'Lian ', 'Hui ', 'Yong ', 'Qian ', 'Guo ', 'Gai ', 'Gai ', 'Tuan ', 'Hua ', 'Cu ', 'Sen ', 'Cui ', 'Beng ', 'You ', 'Hu ', 'Jiang ', 'Hu ', 'Huan ', 'Kui ', 'Yi ', 'Nie ', 'Gao ', 'Kang ', 'Gui ', 'Gui ', 'Cao ', 'Man ', 'Jin '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php
new file mode 100644
index 000000000..07aa2ec48
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php
@@ -0,0 +1 @@
+<?php return ['Di ', 'Zhuang ', 'Le ', 'Lang ', 'Chen ', 'Cong ', 'Li ', 'Xiu ', 'Qing ', 'Shuang ', 'Fan ', 'Tong ', 'Guan ', 'Ji ', 'Suo ', 'Lei ', 'Lu ', 'Liang ', 'Mi ', 'Lou ', 'Chao ', 'Su ', 'Ke ', 'Shu ', 'Tang ', 'Biao ', 'Lu ', 'Jiu ', 'Shu ', 'Zha ', 'Shu ', 'Zhang ', 'Men ', 'Mo ', 'Niao ', 'Yang ', 'Tiao ', 'Peng ', 'Zhu ', 'Sha ', 'Xi ', 'Quan ', 'Heng ', 'Jian ', 'Cong ', '[?] ', 'Hokuso ', 'Qiang ', 'Tara ', 'Ying ', 'Er ', 'Xin ', 'Zhi ', 'Qiao ', 'Zui ', 'Cong ', 'Pu ', 'Shu ', 'Hua ', 'Kui ', 'Zhen ', 'Zun ', 'Yue ', 'Zhan ', 'Xi ', 'Xun ', 'Dian ', 'Fa ', 'Gan ', 'Mo ', 'Wu ', 'Qiao ', 'Nao ', 'Lin ', 'Liu ', 'Qiao ', 'Xian ', 'Run ', 'Fan ', 'Zhan ', 'Tuo ', 'Lao ', 'Yun ', 'Shun ', 'Tui ', 'Cheng ', 'Tang ', 'Meng ', 'Ju ', 'Cheng ', 'Su ', 'Jue ', 'Jue ', 'Tan ', 'Hui ', 'Ji ', 'Nuo ', 'Xiang ', 'Tuo ', 'Ning ', 'Rui ', 'Zhu ', 'Chuang ', 'Zeng ', 'Fen ', 'Qiong ', 'Ran ', 'Heng ', 'Cen ', 'Gu ', 'Liu ', 'Lao ', 'Gao ', 'Chu ', 'Zusa ', 'Nude ', 'Ca ', 'San ', 'Ji ', 'Dou ', 'Shou ', 'Lu ', '[?] ', '[?] ', 'Yuan ', 'Ta ', 'Shu ', 'Jiang ', 'Tan ', 'Lin ', 'Nong ', 'Yin ', 'Xi ', 'Sui ', 'Shan ', 'Zui ', 'Xuan ', 'Cheng ', 'Gan ', 'Ju ', 'Zui ', 'Yi ', 'Qin ', 'Pu ', 'Yan ', 'Lei ', 'Feng ', 'Hui ', 'Dang ', 'Ji ', 'Sui ', 'Bo ', 'Bi ', 'Ding ', 'Chu ', 'Zhua ', 'Kuai ', 'Ji ', 'Jie ', 'Jia ', 'Qing ', 'Zhe ', 'Jian ', 'Qiang ', 'Dao ', 'Yi ', 'Biao ', 'Song ', 'She ', 'Lin ', 'Kunugi ', 'Cha ', 'Meng ', 'Yin ', 'Tao ', 'Tai ', 'Mian ', 'Qi ', 'Toan ', 'Bin ', 'Huo ', 'Ji ', 'Qian ', 'Mi ', 'Ning ', 'Yi ', 'Gao ', 'Jian ', 'Yin ', 'Er ', 'Qing ', 'Yan ', 'Qi ', 'Mi ', 'Zhao ', 'Gui ', 'Chun ', 'Ji ', 'Kui ', 'Po ', 'Deng ', 'Chu ', '[?] ', 'Mian ', 'You ', 'Zhi ', 'Guang ', 'Qian ', 'Lei ', 'Lei ', 'Sa ', 'Lu ', 'Li ', 'Cuan ', 'Lu ', 'Mie ', 'Hui ', 'Ou ', 'Lu ', 'Jie ', 'Gao ', 'Du ', 'Yuan ', 'Li ', 'Fei ', 'Zhuo ', 'Sou ', 'Lian ', 'Tamo ', 'Chu ', '[?] ', 'Zhu ', 'Lu ', 'Yan ', 'Li ', 'Zhu ', 'Chen ', 'Jie ', 'E ', 'Su ', 'Huai ', 'Nie ', 'Yu ', 'Long ', 'Lai ', '[?] ', 'Xian ', 'Kwi ', 'Ju ', 'Xiao ', 'Ling ', 'Ying ', 'Jian ', 'Yin ', 'You ', 'Ying '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php
new file mode 100644
index 000000000..560afa370
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php
@@ -0,0 +1 @@
+<?php return ['Xiang ', 'Nong ', 'Bo ', 'Chan ', 'Lan ', 'Ju ', 'Shuang ', 'She ', 'Wei ', 'Cong ', 'Quan ', 'Qu ', 'Cang ', '[?] ', 'Yu ', 'Luo ', 'Li ', 'Zan ', 'Luan ', 'Dang ', 'Jue ', 'Em ', 'Lan ', 'Lan ', 'Zhu ', 'Lei ', 'Li ', 'Ba ', 'Nang ', 'Yu ', 'Ling ', 'Tsuki ', 'Qian ', 'Ci ', 'Huan ', 'Xin ', 'Yu ', 'Yu ', 'Qian ', 'Ou ', 'Xu ', 'Chao ', 'Chu ', 'Chi ', 'Kai ', 'Yi ', 'Jue ', 'Xi ', 'Xu ', 'Xia ', 'Yu ', 'Kuai ', 'Lang ', 'Kuan ', 'Shuo ', 'Xi ', 'Ai ', 'Yi ', 'Qi ', 'Hu ', 'Chi ', 'Qin ', 'Kuan ', 'Kan ', 'Kuan ', 'Kan ', 'Chuan ', 'Sha ', 'Gua ', 'Yin ', 'Xin ', 'Xie ', 'Yu ', 'Qian ', 'Xiao ', 'Yi ', 'Ge ', 'Wu ', 'Tan ', 'Jin ', 'Ou ', 'Hu ', 'Ti ', 'Huan ', 'Xu ', 'Pen ', 'Xi ', 'Xiao ', 'Xu ', 'Xi ', 'Sen ', 'Lian ', 'Chu ', 'Yi ', 'Kan ', 'Yu ', 'Chuo ', 'Huan ', 'Zhi ', 'Zheng ', 'Ci ', 'Bu ', 'Wu ', 'Qi ', 'Bu ', 'Bu ', 'Wai ', 'Ju ', 'Qian ', 'Chi ', 'Se ', 'Chi ', 'Se ', 'Zhong ', 'Sui ', 'Sui ', 'Li ', 'Cuo ', 'Yu ', 'Li ', 'Gui ', 'Dai ', 'Dai ', 'Si ', 'Jian ', 'Zhe ', 'Mo ', 'Mo ', 'Yao ', 'Mo ', 'Cu ', 'Yang ', 'Tian ', 'Sheng ', 'Dai ', 'Shang ', 'Xu ', 'Xun ', 'Shu ', 'Can ', 'Jue ', 'Piao ', 'Qia ', 'Qiu ', 'Su ', 'Qing ', 'Yun ', 'Lian ', 'Yi ', 'Fou ', 'Zhi ', 'Ye ', 'Can ', 'Hun ', 'Dan ', 'Ji ', 'Ye ', 'Zhen ', 'Yun ', 'Wen ', 'Chou ', 'Bin ', 'Ti ', 'Jin ', 'Shang ', 'Yin ', 'Diao ', 'Cu ', 'Hui ', 'Cuan ', 'Yi ', 'Dan ', 'Du ', 'Jiang ', 'Lian ', 'Bin ', 'Du ', 'Tsukusu ', 'Jian ', 'Shu ', 'Ou ', 'Duan ', 'Zhu ', 'Yin ', 'Qing ', 'Yi ', 'Sha ', 'Que ', 'Ke ', 'Yao ', 'Jun ', 'Dian ', 'Hui ', 'Hui ', 'Gu ', 'Que ', 'Ji ', 'Yi ', 'Ou ', 'Hui ', 'Duan ', 'Yi ', 'Xiao ', 'Wu ', 'Guan ', 'Mu ', 'Mei ', 'Mei ', 'Ai ', 'Zuo ', 'Du ', 'Yu ', 'Bi ', 'Bi ', 'Bi ', 'Pi ', 'Pi ', 'Bi ', 'Chan ', 'Mao ', '[?] ', '[?] ', 'Pu ', 'Mushiru ', 'Jia ', 'Zhan ', 'Sai ', 'Mu ', 'Tuo ', 'Xun ', 'Er ', 'Rong ', 'Xian ', 'Ju ', 'Mu ', 'Hao ', 'Qiu ', 'Dou ', 'Mushiru ', 'Tan ', 'Pei ', 'Ju ', 'Duo ', 'Cui ', 'Bi ', 'San ', '[?] ', 'Mao ', 'Sui ', 'Yu ', 'Yu ', 'Tuo ', 'He ', 'Jian ', 'Ta ', 'San '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php
new file mode 100644
index 000000000..78f502caf
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php
@@ -0,0 +1 @@
+<?php return ['Lu ', 'Mu ', 'Li ', 'Tong ', 'Rong ', 'Chang ', 'Pu ', 'Luo ', 'Zhan ', 'Sao ', 'Zhan ', 'Meng ', 'Luo ', 'Qu ', 'Die ', 'Shi ', 'Di ', 'Min ', 'Jue ', 'Mang ', 'Qi ', 'Pie ', 'Nai ', 'Qi ', 'Dao ', 'Xian ', 'Chuan ', 'Fen ', 'Ri ', 'Nei ', '[?] ', 'Fu ', 'Shen ', 'Dong ', 'Qing ', 'Qi ', 'Yin ', 'Xi ', 'Hai ', 'Yang ', 'An ', 'Ya ', 'Ke ', 'Qing ', 'Ya ', 'Dong ', 'Dan ', 'Lu ', 'Qing ', 'Yang ', 'Yun ', 'Yun ', 'Shui ', 'San ', 'Zheng ', 'Bing ', 'Yong ', 'Dang ', 'Shitamizu ', 'Le ', 'Ni ', 'Tun ', 'Fan ', 'Gui ', 'Ting ', 'Zhi ', 'Qiu ', 'Bin ', 'Ze ', 'Mian ', 'Cuan ', 'Hui ', 'Diao ', 'Yi ', 'Cha ', 'Zhuo ', 'Chuan ', 'Wan ', 'Fan ', 'Dai ', 'Xi ', 'Tuo ', 'Mang ', 'Qiu ', 'Qi ', 'Shan ', 'Pai ', 'Han ', 'Qian ', 'Wu ', 'Wu ', 'Xun ', 'Si ', 'Ru ', 'Gong ', 'Jiang ', 'Chi ', 'Wu ', 'Tsuchi ', '[?] ', 'Tang ', 'Zhi ', 'Chi ', 'Qian ', 'Mi ', 'Yu ', 'Wang ', 'Qing ', 'Jing ', 'Rui ', 'Jun ', 'Hong ', 'Tai ', 'Quan ', 'Ji ', 'Bian ', 'Bian ', 'Gan ', 'Wen ', 'Zhong ', 'Fang ', 'Xiong ', 'Jue ', 'Hang ', 'Niou ', 'Qi ', 'Fen ', 'Xu ', 'Xu ', 'Qin ', 'Yi ', 'Wo ', 'Yun ', 'Yuan ', 'Hang ', 'Yan ', 'Chen ', 'Chen ', 'Dan ', 'You ', 'Dun ', 'Hu ', 'Huo ', 'Qie ', 'Mu ', 'Rou ', 'Mei ', 'Ta ', 'Mian ', 'Wu ', 'Chong ', 'Tian ', 'Bi ', 'Sha ', 'Zhi ', 'Pei ', 'Pan ', 'Zhui ', 'Za ', 'Gou ', 'Liu ', 'Mei ', 'Ze ', 'Feng ', 'Ou ', 'Li ', 'Lun ', 'Cang ', 'Feng ', 'Wei ', 'Hu ', 'Mo ', 'Mei ', 'Shu ', 'Ju ', 'Zan ', 'Tuo ', 'Tuo ', 'Tuo ', 'He ', 'Li ', 'Mi ', 'Yi ', 'Fa ', 'Fei ', 'You ', 'Tian ', 'Zhi ', 'Zhao ', 'Gu ', 'Zhan ', 'Yan ', 'Si ', 'Kuang ', 'Jiong ', 'Ju ', 'Xie ', 'Qiu ', 'Yi ', 'Jia ', 'Zhong ', 'Quan ', 'Bo ', 'Hui ', 'Mi ', 'Ben ', 'Zhuo ', 'Chu ', 'Le ', 'You ', 'Gu ', 'Hong ', 'Gan ', 'Fa ', 'Mao ', 'Si ', 'Hu ', 'Ping ', 'Ci ', 'Fan ', 'Chi ', 'Su ', 'Ning ', 'Cheng ', 'Ling ', 'Pao ', 'Bo ', 'Qi ', 'Si ', 'Ni ', 'Ju ', 'Yue ', 'Zhu ', 'Sheng ', 'Lei ', 'Xuan ', 'Xue ', 'Fu ', 'Pan ', 'Min ', 'Tai ', 'Yang ', 'Ji ', 'Yong ', 'Guan ', 'Beng ', 'Xue ', 'Long ', 'Lu ', '[?] ', 'Bo ', 'Xie ', 'Po ', 'Ze ', 'Jing ', 'Yin '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php
new file mode 100644
index 000000000..799cb252a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php
@@ -0,0 +1 @@
+<?php return ['Zhou ', 'Ji ', 'Yi ', 'Hui ', 'Hui ', 'Zui ', 'Cheng ', 'Yin ', 'Wei ', 'Hou ', 'Jian ', 'Yang ', 'Lie ', 'Si ', 'Ji ', 'Er ', 'Xing ', 'Fu ', 'Sa ', 'Suo ', 'Zhi ', 'Yin ', 'Wu ', 'Xi ', 'Kao ', 'Zhu ', 'Jiang ', 'Luo ', '[?] ', 'An ', 'Dong ', 'Yi ', 'Mou ', 'Lei ', 'Yi ', 'Mi ', 'Quan ', 'Jin ', 'Mo ', 'Wei ', 'Xiao ', 'Xie ', 'Hong ', 'Xu ', 'Shuo ', 'Kuang ', 'Tao ', 'Qie ', 'Ju ', 'Er ', 'Zhou ', 'Ru ', 'Ping ', 'Xun ', 'Xiong ', 'Zhi ', 'Guang ', 'Huan ', 'Ming ', 'Huo ', 'Wa ', 'Qia ', 'Pai ', 'Wu ', 'Qu ', 'Liu ', 'Yi ', 'Jia ', 'Jing ', 'Qian ', 'Jiang ', 'Jiao ', 'Cheng ', 'Shi ', 'Zhuo ', 'Ce ', 'Pal ', 'Kuai ', 'Ji ', 'Liu ', 'Chan ', 'Hun ', 'Hu ', 'Nong ', 'Xun ', 'Jin ', 'Lie ', 'Qiu ', 'Wei ', 'Zhe ', 'Jun ', 'Han ', 'Bang ', 'Mang ', 'Zhuo ', 'You ', 'Xi ', 'Bo ', 'Dou ', 'Wan ', 'Hong ', 'Yi ', 'Pu ', 'Ying ', 'Lan ', 'Hao ', 'Lang ', 'Han ', 'Li ', 'Geng ', 'Fu ', 'Wu ', 'Lian ', 'Chun ', 'Feng ', 'Yi ', 'Yu ', 'Tong ', 'Lao ', 'Hai ', 'Jin ', 'Jia ', 'Chong ', 'Weng ', 'Mei ', 'Sui ', 'Cheng ', 'Pei ', 'Xian ', 'Shen ', 'Tu ', 'Kun ', 'Pin ', 'Nie ', 'Han ', 'Jing ', 'Xiao ', 'She ', 'Nian ', 'Tu ', 'Yong ', 'Xiao ', 'Xian ', 'Ting ', 'E ', 'Su ', 'Tun ', 'Juan ', 'Cen ', 'Ti ', 'Li ', 'Shui ', 'Si ', 'Lei ', 'Shui ', 'Tao ', 'Du ', 'Lao ', 'Lai ', 'Lian ', 'Wei ', 'Wo ', 'Yun ', 'Huan ', 'Di ', '[?] ', 'Run ', 'Jian ', 'Zhang ', 'Se ', 'Fu ', 'Guan ', 'Xing ', 'Shou ', 'Shuan ', 'Ya ', 'Chuo ', 'Zhang ', 'Ye ', 'Kong ', 'Wo ', 'Han ', 'Tuo ', 'Dong ', 'He ', 'Wo ', 'Ju ', 'Gan ', 'Liang ', 'Hun ', 'Ta ', 'Zhuo ', 'Dian ', 'Qie ', 'De ', 'Juan ', 'Zi ', 'Xi ', 'Yao ', 'Qi ', 'Gu ', 'Guo ', 'Han ', 'Lin ', 'Tang ', 'Zhou ', 'Peng ', 'Hao ', 'Chang ', 'Shu ', 'Qi ', 'Fang ', 'Chi ', 'Lu ', 'Nao ', 'Ju ', 'Tao ', 'Cong ', 'Lei ', 'Zhi ', 'Peng ', 'Fei ', 'Song ', 'Tian ', 'Pi ', 'Dan ', 'Yu ', 'Ni ', 'Yu ', 'Lu ', 'Gan ', 'Mi ', 'Jing ', 'Ling ', 'Lun ', 'Yin ', 'Cui ', 'Qu ', 'Huai ', 'Yu ', 'Nian ', 'Shen ', 'Piao ', 'Chun ', 'Wa ', 'Yuan ', 'Lai ', 'Hun ', 'Qing ', 'Yan ', 'Qian ', 'Tian ', 'Miao ', 'Zhi ', 'Yin ', 'Mi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php
new file mode 100644
index 000000000..3f0f40147
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php
@@ -0,0 +1 @@
+<?php return ['Ben ', 'Yuan ', 'Wen ', 'Re ', 'Fei ', 'Qing ', 'Yuan ', 'Ke ', 'Ji ', 'She ', 'Yuan ', 'Shibui ', 'Lu ', 'Zi ', 'Du ', '[?] ', 'Jian ', 'Min ', 'Pi ', 'Tani ', 'Yu ', 'Yuan ', 'Shen ', 'Shen ', 'Rou ', 'Huan ', 'Zhu ', 'Jian ', 'Nuan ', 'Yu ', 'Qiu ', 'Ting ', 'Qu ', 'Du ', 'Feng ', 'Zha ', 'Bo ', 'Wo ', 'Wo ', 'Di ', 'Wei ', 'Wen ', 'Ru ', 'Xie ', 'Ce ', 'Wei ', 'Ge ', 'Gang ', 'Yan ', 'Hong ', 'Xuan ', 'Mi ', 'Ke ', 'Mao ', 'Ying ', 'Yan ', 'You ', 'Hong ', 'Miao ', 'Xing ', 'Mei ', 'Zai ', 'Hun ', 'Nai ', 'Kui ', 'Shi ', 'E ', 'Pai ', 'Mei ', 'Lian ', 'Qi ', 'Qi ', 'Mei ', 'Tian ', 'Cou ', 'Wei ', 'Can ', 'Tuan ', 'Mian ', 'Hui ', 'Mo ', 'Xu ', 'Ji ', 'Pen ', 'Jian ', 'Jian ', 'Hu ', 'Feng ', 'Xiang ', 'Yi ', 'Yin ', 'Zhan ', 'Shi ', 'Jie ', 'Cheng ', 'Huang ', 'Tan ', 'Yu ', 'Bi ', 'Min ', 'Shi ', 'Tu ', 'Sheng ', 'Yong ', 'Qu ', 'Zhong ', 'Suei ', 'Jiu ', 'Jiao ', 'Qiou ', 'Yin ', 'Tang ', 'Long ', 'Huo ', 'Yuan ', 'Nan ', 'Ban ', 'You ', 'Quan ', 'Chui ', 'Liang ', 'Chan ', 'Yan ', 'Chun ', 'Nie ', 'Zi ', 'Wan ', 'Shi ', 'Man ', 'Ying ', 'Ratsu ', 'Kui ', '[?] ', 'Jian ', 'Xu ', 'Lu ', 'Gui ', 'Gai ', '[?] ', '[?] ', 'Po ', 'Jin ', 'Gui ', 'Tang ', 'Yuan ', 'Suo ', 'Yuan ', 'Lian ', 'Yao ', 'Meng ', 'Zhun ', 'Sheng ', 'Ke ', 'Tai ', 'Da ', 'Wa ', 'Liu ', 'Gou ', 'Sao ', 'Ming ', 'Zha ', 'Shi ', 'Yi ', 'Lun ', 'Ma ', 'Pu ', 'Wei ', 'Li ', 'Cai ', 'Wu ', 'Xi ', 'Wen ', 'Qiang ', 'Ze ', 'Shi ', 'Su ', 'Yi ', 'Zhen ', 'Sou ', 'Yun ', 'Xiu ', 'Yin ', 'Rong ', 'Hun ', 'Su ', 'Su ', 'Ni ', 'Ta ', 'Shi ', 'Ru ', 'Wei ', 'Pan ', 'Chu ', 'Chu ', 'Pang ', 'Weng ', 'Cang ', 'Mie ', 'He ', 'Dian ', 'Hao ', 'Huang ', 'Xi ', 'Zi ', 'Di ', 'Zhi ', 'Ying ', 'Fu ', 'Jie ', 'Hua ', 'Ge ', 'Zi ', 'Tao ', 'Teng ', 'Sui ', 'Bi ', 'Jiao ', 'Hui ', 'Gun ', 'Yin ', 'Gao ', 'Long ', 'Zhi ', 'Yan ', 'She ', 'Man ', 'Ying ', 'Chun ', 'Lu ', 'Lan ', 'Luan ', '[?] ', 'Bin ', 'Tan ', 'Yu ', 'Sou ', 'Hu ', 'Bi ', 'Biao ', 'Zhi ', 'Jiang ', 'Kou ', 'Shen ', 'Shang ', 'Di ', 'Mi ', 'Ao ', 'Lu ', 'Hu ', 'Hu ', 'You ', 'Chan ', 'Fan ', 'Yong ', 'Gun ', 'Man '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php
new file mode 100644
index 000000000..8a824a2e4
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php
@@ -0,0 +1 @@
+<?php return ['Qing ', 'Yu ', 'Piao ', 'Ji ', 'Ya ', 'Jiao ', 'Qi ', 'Xi ', 'Ji ', 'Lu ', 'Lu ', 'Long ', 'Jin ', 'Guo ', 'Cong ', 'Lou ', 'Zhi ', 'Gai ', 'Qiang ', 'Li ', 'Yan ', 'Cao ', 'Jiao ', 'Cong ', 'Qun ', 'Tuan ', 'Ou ', 'Teng ', 'Ye ', 'Xi ', 'Mi ', 'Tang ', 'Mo ', 'Shang ', 'Han ', 'Lian ', 'Lan ', 'Wa ', 'Li ', 'Qian ', 'Feng ', 'Xuan ', 'Yi ', 'Man ', 'Zi ', 'Mang ', 'Kang ', 'Lei ', 'Peng ', 'Shu ', 'Zhang ', 'Zhang ', 'Chong ', 'Xu ', 'Huan ', 'Kuo ', 'Jian ', 'Yan ', 'Chuang ', 'Liao ', 'Cui ', 'Ti ', 'Yang ', 'Jiang ', 'Cong ', 'Ying ', 'Hong ', 'Xun ', 'Shu ', 'Guan ', 'Ying ', 'Xiao ', '[?] ', '[?] ', 'Xu ', 'Lian ', 'Zhi ', 'Wei ', 'Pi ', 'Jue ', 'Jiao ', 'Po ', 'Dang ', 'Hui ', 'Jie ', 'Wu ', 'Pa ', 'Ji ', 'Pan ', 'Gui ', 'Xiao ', 'Qian ', 'Qian ', 'Xi ', 'Lu ', 'Xi ', 'Xuan ', 'Dun ', 'Huang ', 'Min ', 'Run ', 'Su ', 'Liao ', 'Zhen ', 'Zhong ', 'Yi ', 'Di ', 'Wan ', 'Dan ', 'Tan ', 'Chao ', 'Xun ', 'Kui ', 'Yie ', 'Shao ', 'Tu ', 'Zhu ', 'San ', 'Hei ', 'Bi ', 'Shan ', 'Chan ', 'Chan ', 'Shu ', 'Tong ', 'Pu ', 'Lin ', 'Wei ', 'Se ', 'Se ', 'Cheng ', 'Jiong ', 'Cheng ', 'Hua ', 'Jiao ', 'Lao ', 'Che ', 'Gan ', 'Cun ', 'Heng ', 'Si ', 'Shu ', 'Peng ', 'Han ', 'Yun ', 'Liu ', 'Hong ', 'Fu ', 'Hao ', 'He ', 'Xian ', 'Jian ', 'Shan ', 'Xi ', 'Oki ', '[?] ', 'Lan ', '[?] ', 'Yu ', 'Lin ', 'Min ', 'Zao ', 'Dang ', 'Wan ', 'Ze ', 'Xie ', 'Yu ', 'Li ', 'Shi ', 'Xue ', 'Ling ', 'Man ', 'Zi ', 'Yong ', 'Kuai ', 'Can ', 'Lian ', 'Dian ', 'Ye ', 'Ao ', 'Huan ', 'Zhen ', 'Chan ', 'Man ', 'Dan ', 'Dan ', 'Yi ', 'Sui ', 'Pi ', 'Ju ', 'Ta ', 'Qin ', 'Ji ', 'Zhuo ', 'Lian ', 'Nong ', 'Guo ', 'Jin ', 'Fen ', 'Se ', 'Ji ', 'Sui ', 'Hui ', 'Chu ', 'Ta ', 'Song ', 'Ding ', '[?] ', 'Zhu ', 'Lai ', 'Bin ', 'Lian ', 'Mi ', 'Shi ', 'Shu ', 'Mi ', 'Ning ', 'Ying ', 'Ying ', 'Meng ', 'Jin ', 'Qi ', 'Pi ', 'Ji ', 'Hao ', 'Ru ', 'Zui ', 'Wo ', 'Tao ', 'Yin ', 'Yin ', 'Dui ', 'Ci ', 'Huo ', 'Jing ', 'Lan ', 'Jun ', 'Ai ', 'Pu ', 'Zhuo ', 'Wei ', 'Bin ', 'Gu ', 'Qian ', 'Xing ', 'Hama ', 'Kuo ', 'Fei ', '[?] ', 'Boku ', 'Jian ', 'Wei ', 'Luo ', 'Zan ', 'Lu ', 'Li '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x070.php b/vendor/voku/portable-ascii/src/voku/helper/data/x070.php
new file mode 100644
index 000000000..1c9e8d197
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x070.php
@@ -0,0 +1 @@
+<?php return ['You ', 'Yang ', 'Lu ', 'Si ', 'Jie ', 'Ying ', 'Du ', 'Wang ', 'Hui ', 'Xie ', 'Pan ', 'Shen ', 'Biao ', 'Chan ', 'Mo ', 'Liu ', 'Jian ', 'Pu ', 'Se ', 'Cheng ', 'Gu ', 'Bin ', 'Huo ', 'Xian ', 'Lu ', 'Qin ', 'Han ', 'Ying ', 'Yong ', 'Li ', 'Jing ', 'Xiao ', 'Ying ', 'Sui ', 'Wei ', 'Xie ', 'Huai ', 'Hao ', 'Zhu ', 'Long ', 'Lai ', 'Dui ', 'Fan ', 'Hu ', 'Lai ', '[?] ', '[?] ', 'Ying ', 'Mi ', 'Ji ', 'Lian ', 'Jian ', 'Ying ', 'Fen ', 'Lin ', 'Yi ', 'Jian ', 'Yue ', 'Chan ', 'Dai ', 'Rang ', 'Jian ', 'Lan ', 'Fan ', 'Shuang ', 'Yuan ', 'Zhuo ', 'Feng ', 'She ', 'Lei ', 'Lan ', 'Cong ', 'Qu ', 'Yong ', 'Qian ', 'Fa ', 'Guan ', 'Que ', 'Yan ', 'Hao ', 'Hyeng ', 'Sa ', 'Zan ', 'Luan ', 'Yan ', 'Li ', 'Mi ', 'Shan ', 'Tan ', 'Dang ', 'Jiao ', 'Chan ', '[?] ', 'Hao ', 'Ba ', 'Zhu ', 'Lan ', 'Lan ', 'Nang ', 'Wan ', 'Luan ', 'Xun ', 'Xian ', 'Yan ', 'Gan ', 'Yan ', 'Yu ', 'Huo ', 'Si ', 'Mie ', 'Guang ', 'Deng ', 'Hui ', 'Xiao ', 'Xiao ', 'Hu ', 'Hong ', 'Ling ', 'Zao ', 'Zhuan ', 'Jiu ', 'Zha ', 'Xie ', 'Chi ', 'Zhuo ', 'Zai ', 'Zai ', 'Can ', 'Yang ', 'Qi ', 'Zhong ', 'Fen ', 'Niu ', 'Jiong ', 'Wen ', 'Po ', 'Yi ', 'Lu ', 'Chui ', 'Pi ', 'Kai ', 'Pan ', 'Yan ', 'Kai ', 'Pang ', 'Mu ', 'Chao ', 'Liao ', 'Gui ', 'Kang ', 'Tun ', 'Guang ', 'Xin ', 'Zhi ', 'Guang ', 'Guang ', 'Wei ', 'Qiang ', '[?] ', 'Da ', 'Xia ', 'Zheng ', 'Zhu ', 'Ke ', 'Zhao ', 'Fu ', 'Ba ', 'Duo ', 'Duo ', 'Ling ', 'Zhuo ', 'Xuan ', 'Ju ', 'Tan ', 'Pao ', 'Jiong ', 'Pao ', 'Tai ', 'Tai ', 'Bing ', 'Yang ', 'Tong ', 'Han ', 'Zhu ', 'Zha ', 'Dian ', 'Wei ', 'Shi ', 'Lian ', 'Chi ', 'Huang ', '[?] ', 'Hu ', 'Shuo ', 'Lan ', 'Jing ', 'Jiao ', 'Xu ', 'Xing ', 'Quan ', 'Lie ', 'Huan ', 'Yang ', 'Xiao ', 'Xiu ', 'Xian ', 'Yin ', 'Wu ', 'Zhou ', 'Yao ', 'Shi ', 'Wei ', 'Tong ', 'Xue ', 'Zai ', 'Kai ', 'Hong ', 'Luo ', 'Xia ', 'Zhu ', 'Xuan ', 'Zheng ', 'Po ', 'Yan ', 'Hui ', 'Guang ', 'Zhe ', 'Hui ', 'Kao ', '[?] ', 'Fan ', 'Shao ', 'Ye ', 'Hui ', '[?] ', 'Tang ', 'Jin ', 'Re ', '[?] ', 'Xi ', 'Fu ', 'Jiong ', 'Che ', 'Pu ', 'Jing ', 'Zhuo ', 'Ting ', 'Wan ', 'Hai ', 'Peng ', 'Lang ', 'Shan ', 'Hu ', 'Feng ', 'Chi ', 'Rong '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x071.php b/vendor/voku/portable-ascii/src/voku/helper/data/x071.php
new file mode 100644
index 000000000..daadfe81d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x071.php
@@ -0,0 +1 @@
+<?php return ['Hu ', 'Xi ', 'Shu ', 'He ', 'Xun ', 'Ku ', 'Jue ', 'Xiao ', 'Xi ', 'Yan ', 'Han ', 'Zhuang ', 'Jun ', 'Di ', 'Xie ', 'Ji ', 'Wu ', '[?] ', '[?] ', 'Han ', 'Yan ', 'Huan ', 'Men ', 'Ju ', 'Chou ', 'Bei ', 'Fen ', 'Lin ', 'Kun ', 'Hun ', 'Tun ', 'Xi ', 'Cui ', 'Wu ', 'Hong ', 'Ju ', 'Fu ', 'Wo ', 'Jiao ', 'Cong ', 'Feng ', 'Ping ', 'Qiong ', 'Ruo ', 'Xi ', 'Qiong ', 'Xin ', 'Zhuo ', 'Yan ', 'Yan ', 'Yi ', 'Jue ', 'Yu ', 'Gang ', 'Ran ', 'Pi ', 'Gu ', '[?] ', 'Sheng ', 'Chang ', 'Shao ', '[?] ', '[?] ', '[?] ', '[?] ', 'Chen ', 'He ', 'Kui ', 'Zhong ', 'Duan ', 'Xia ', 'Hui ', 'Feng ', 'Lian ', 'Xuan ', 'Xing ', 'Huang ', 'Jiao ', 'Jian ', 'Bi ', 'Ying ', 'Zhu ', 'Wei ', 'Tuan ', 'Tian ', 'Xi ', 'Nuan ', 'Nuan ', 'Chan ', 'Yan ', 'Jiong ', 'Jiong ', 'Yu ', 'Mei ', 'Sha ', 'Wei ', 'Ye ', 'Xin ', 'Qiong ', 'Rou ', 'Mei ', 'Huan ', 'Xu ', 'Zhao ', 'Wei ', 'Fan ', 'Qiu ', 'Sui ', 'Yang ', 'Lie ', 'Zhu ', 'Jie ', 'Gao ', 'Gua ', 'Bao ', 'Hu ', 'Yun ', 'Xia ', '[?] ', '[?] ', 'Bian ', 'Gou ', 'Tui ', 'Tang ', 'Chao ', 'Shan ', 'N ', 'Bo ', 'Huang ', 'Xie ', 'Xi ', 'Wu ', 'Xi ', 'Yun ', 'He ', 'He ', 'Xi ', 'Yun ', 'Xiong ', 'Nai ', 'Shan ', 'Qiong ', 'Yao ', 'Xun ', 'Mi ', 'Lian ', 'Ying ', 'Wen ', 'Rong ', 'Oozutsu ', '[?] ', 'Qiang ', 'Liu ', 'Xi ', 'Bi ', 'Biao ', 'Zong ', 'Lu ', 'Jian ', 'Shou ', 'Yi ', 'Lou ', 'Feng ', 'Sui ', 'Yi ', 'Tong ', 'Jue ', 'Zong ', 'Yun ', 'Hu ', 'Yi ', 'Zhi ', 'Ao ', 'Wei ', 'Liao ', 'Han ', 'Ou ', 'Re ', 'Jiong ', 'Man ', '[?] ', 'Shang ', 'Cuan ', 'Zeng ', 'Jian ', 'Xi ', 'Xi ', 'Xi ', 'Yi ', 'Xiao ', 'Chi ', 'Huang ', 'Chan ', 'Ye ', 'Qian ', 'Ran ', 'Yan ', 'Xian ', 'Qiao ', 'Zun ', 'Deng ', 'Dun ', 'Shen ', 'Jiao ', 'Fen ', 'Si ', 'Liao ', 'Yu ', 'Lin ', 'Tong ', 'Shao ', 'Fen ', 'Fan ', 'Yan ', 'Xun ', 'Lan ', 'Mei ', 'Tang ', 'Yi ', 'Jing ', 'Men ', '[?] ', '[?] ', 'Ying ', 'Yu ', 'Yi ', 'Xue ', 'Lan ', 'Tai ', 'Zao ', 'Can ', 'Sui ', 'Xi ', 'Que ', 'Cong ', 'Lian ', 'Hui ', 'Zhu ', 'Xie ', 'Ling ', 'Wei ', 'Yi ', 'Xie ', 'Zhao ', 'Hui ', 'Tatsu ', 'Nung ', 'Lan ', 'Ru ', 'Xian ', 'Kao ', 'Xun ', 'Jin ', 'Chou ', 'Chou ', 'Yao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x072.php b/vendor/voku/portable-ascii/src/voku/helper/data/x072.php
new file mode 100644
index 000000000..f62cfcac0
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x072.php
@@ -0,0 +1 @@
+<?php return ['He ', 'Lan ', 'Biao ', 'Rong ', 'Li ', 'Mo ', 'Bao ', 'Ruo ', 'Lu ', 'La ', 'Ao ', 'Xun ', 'Kuang ', 'Shuo ', '[?] ', 'Li ', 'Lu ', 'Jue ', 'Liao ', 'Yan ', 'Xi ', 'Xie ', 'Long ', 'Ye ', '[?] ', 'Rang ', 'Yue ', 'Lan ', 'Cong ', 'Jue ', 'Tong ', 'Guan ', '[?] ', 'Che ', 'Mi ', 'Tang ', 'Lan ', 'Zhu ', '[?] ', 'Ling ', 'Cuan ', 'Yu ', 'Zhua ', 'Tsumekanmuri ', 'Pa ', 'Zheng ', 'Pao ', 'Cheng ', 'Yuan ', 'Ai ', 'Wei ', '[?] ', 'Jue ', 'Jue ', 'Fu ', 'Ye ', 'Ba ', 'Die ', 'Ye ', 'Yao ', 'Zu ', 'Shuang ', 'Er ', 'Qiang ', 'Chuang ', 'Ge ', 'Zang ', 'Die ', 'Qiang ', 'Yong ', 'Qiang ', 'Pian ', 'Ban ', 'Pan ', 'Shao ', 'Jian ', 'Pai ', 'Du ', 'Chuang ', 'Tou ', 'Zha ', 'Bian ', 'Die ', 'Bang ', 'Bo ', 'Chuang ', 'You ', '[?] ', 'Du ', 'Ya ', 'Cheng ', 'Niu ', 'Ushihen ', 'Pin ', 'Jiu ', 'Mou ', 'Tuo ', 'Mu ', 'Lao ', 'Ren ', 'Mang ', 'Fang ', 'Mao ', 'Mu ', 'Gang ', 'Wu ', 'Yan ', 'Ge ', 'Bei ', 'Si ', 'Jian ', 'Gu ', 'You ', 'Ge ', 'Sheng ', 'Mu ', 'Di ', 'Qian ', 'Quan ', 'Quan ', 'Zi ', 'Te ', 'Xi ', 'Mang ', 'Keng ', 'Qian ', 'Wu ', 'Gu ', 'Xi ', 'Li ', 'Li ', 'Pou ', 'Ji ', 'Gang ', 'Zhi ', 'Ben ', 'Quan ', 'Run ', 'Du ', 'Ju ', 'Jia ', 'Jian ', 'Feng ', 'Pian ', 'Ke ', 'Ju ', 'Kao ', 'Chu ', 'Xi ', 'Bei ', 'Luo ', 'Jie ', 'Ma ', 'San ', 'Wei ', 'Li ', 'Dun ', 'Tong ', '[?] ', 'Jiang ', 'Ikenie ', 'Li ', 'Du ', 'Lie ', 'Pi ', 'Piao ', 'Bao ', 'Xi ', 'Chou ', 'Wei ', 'Kui ', 'Chou ', 'Quan ', 'Fan ', 'Ba ', 'Fan ', 'Qiu ', 'Ji ', 'Cai ', 'Chuo ', 'An ', 'Jie ', 'Zhuang ', 'Guang ', 'Ma ', 'You ', 'Kang ', 'Bo ', 'Hou ', 'Ya ', 'Yin ', 'Huan ', 'Zhuang ', 'Yun ', 'Kuang ', 'Niu ', 'Di ', 'Qing ', 'Zhong ', 'Mu ', 'Bei ', 'Pi ', 'Ju ', 'Ni ', 'Sheng ', 'Pao ', 'Xia ', 'Tuo ', 'Hu ', 'Ling ', 'Fei ', 'Pi ', 'Ni ', 'Ao ', 'You ', 'Gou ', 'Yue ', 'Ju ', 'Dan ', 'Po ', 'Gu ', 'Xian ', 'Ning ', 'Huan ', 'Hen ', 'Jiao ', 'He ', 'Zhao ', 'Ji ', 'Xun ', 'Shan ', 'Ta ', 'Rong ', 'Shou ', 'Tong ', 'Lao ', 'Du ', 'Xia ', 'Shi ', 'Hua ', 'Zheng ', 'Yu ', 'Sun ', 'Yu ', 'Bi ', 'Mang ', 'Xi ', 'Juan ', 'Li ', 'Xia ', 'Yin ', 'Suan ', 'Lang ', 'Bei ', 'Zhi ', 'Yan '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x073.php b/vendor/voku/portable-ascii/src/voku/helper/data/x073.php
new file mode 100644
index 000000000..d276c6cc8
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x073.php
@@ -0,0 +1 @@
+<?php return ['Sha ', 'Li ', 'Han ', 'Xian ', 'Jing ', 'Pai ', 'Fei ', 'Yao ', 'Ba ', 'Qi ', 'Ni ', 'Biao ', 'Yin ', 'Lai ', 'Xi ', 'Jian ', 'Qiang ', 'Kun ', 'Yan ', 'Guo ', 'Zong ', 'Mi ', 'Chang ', 'Yi ', 'Zhi ', 'Zheng ', 'Ya ', 'Meng ', 'Cai ', 'Cu ', 'She ', 'Kari ', 'Cen ', 'Luo ', 'Hu ', 'Zong ', 'Ji ', 'Wei ', 'Feng ', 'Wo ', 'Yuan ', 'Xing ', 'Zhu ', 'Mao ', 'Wei ', 'Yuan ', 'Xian ', 'Tuan ', 'Ya ', 'Nao ', 'Xie ', 'Jia ', 'Hou ', 'Bian ', 'You ', 'You ', 'Mei ', 'Zha ', 'Yao ', 'Sun ', 'Bo ', 'Ming ', 'Hua ', 'Yuan ', 'Sou ', 'Ma ', 'Yuan ', 'Dai ', 'Yu ', 'Shi ', 'Hao ', '[?] ', 'Yi ', 'Zhen ', 'Chuang ', 'Hao ', 'Man ', 'Jing ', 'Jiang ', 'Mu ', 'Zhang ', 'Chan ', 'Ao ', 'Ao ', 'Hao ', 'Cui ', 'Fen ', 'Jue ', 'Bi ', 'Bi ', 'Huang ', 'Pu ', 'Lin ', 'Yu ', 'Tong ', 'Yao ', 'Liao ', 'Shuo ', 'Xiao ', 'Swu ', 'Ton ', 'Xi ', 'Ge ', 'Juan ', 'Du ', 'Hui ', 'Kuai ', 'Xian ', 'Xie ', 'Ta ', 'Xian ', 'Xun ', 'Ning ', 'Pin ', 'Huo ', 'Nou ', 'Meng ', 'Lie ', 'Nao ', 'Guang ', 'Shou ', 'Lu ', 'Ta ', 'Xian ', 'Mi ', 'Rang ', 'Huan ', 'Nao ', 'Luo ', 'Xian ', 'Qi ', 'Jue ', 'Xuan ', 'Miao ', 'Zi ', 'Lu ', 'Lu ', 'Yu ', 'Su ', 'Wang ', 'Qiu ', 'Ga ', 'Ding ', 'Le ', 'Ba ', 'Ji ', 'Hong ', 'Di ', 'Quan ', 'Gan ', 'Jiu ', 'Yu ', 'Ji ', 'Yu ', 'Yang ', 'Ma ', 'Gong ', 'Wu ', 'Fu ', 'Wen ', 'Jie ', 'Ya ', 'Fen ', 'Bian ', 'Beng ', 'Yue ', 'Jue ', 'Yun ', 'Jue ', 'Wan ', 'Jian ', 'Mei ', 'Dan ', 'Pi ', 'Wei ', 'Huan ', 'Xian ', 'Qiang ', 'Ling ', 'Dai ', 'Yi ', 'An ', 'Ping ', 'Dian ', 'Fu ', 'Xuan ', 'Xi ', 'Bo ', 'Ci ', 'Gou ', 'Jia ', 'Shao ', 'Po ', 'Ci ', 'Ke ', 'Ran ', 'Sheng ', 'Shen ', 'Yi ', 'Zu ', 'Jia ', 'Min ', 'Shan ', 'Liu ', 'Bi ', 'Zhen ', 'Zhen ', 'Jue ', 'Fa ', 'Long ', 'Jin ', 'Jiao ', 'Jian ', 'Li ', 'Guang ', 'Xian ', 'Zhou ', 'Gong ', 'Yan ', 'Xiu ', 'Yang ', 'Xu ', 'Luo ', 'Su ', 'Zhu ', 'Qin ', 'Ken ', 'Xun ', 'Bao ', 'Er ', 'Xiang ', 'Yao ', 'Xia ', 'Heng ', 'Gui ', 'Chong ', 'Xu ', 'Ban ', 'Pei ', '[?] ', 'Dang ', 'Ei ', 'Hun ', 'Wen ', 'E ', 'Cheng ', 'Ti ', 'Wu ', 'Wu ', 'Cheng ', 'Jun ', 'Mei ', 'Bei ', 'Ting ', 'Xian ', 'Chuo '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x074.php b/vendor/voku/portable-ascii/src/voku/helper/data/x074.php
new file mode 100644
index 000000000..70ed06807
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x074.php
@@ -0,0 +1 @@
+<?php return ['Han ', 'Xuan ', 'Yan ', 'Qiu ', 'Quan ', 'Lang ', 'Li ', 'Xiu ', 'Fu ', 'Liu ', 'Ye ', 'Xi ', 'Ling ', 'Li ', 'Jin ', 'Lian ', 'Suo ', 'Chiisai ', '[?] ', 'Wan ', 'Dian ', 'Pin ', 'Zhan ', 'Cui ', 'Min ', 'Yu ', 'Ju ', 'Chen ', 'Lai ', 'Wen ', 'Sheng ', 'Wei ', 'Dian ', 'Chu ', 'Zhuo ', 'Pei ', 'Cheng ', 'Hu ', 'Qi ', 'E ', 'Kun ', 'Chang ', 'Qi ', 'Beng ', 'Wan ', 'Lu ', 'Cong ', 'Guan ', 'Yan ', 'Diao ', 'Bei ', 'Lin ', 'Qin ', 'Pi ', 'Pa ', 'Que ', 'Zhuo ', 'Qin ', 'Fa ', '[?] ', 'Qiong ', 'Du ', 'Jie ', 'Hun ', 'Yu ', 'Mao ', 'Mei ', 'Chun ', 'Xuan ', 'Ti ', 'Xing ', 'Dai ', 'Rou ', 'Min ', 'Zhen ', 'Wei ', 'Ruan ', 'Huan ', 'Jie ', 'Chuan ', 'Jian ', 'Zhuan ', 'Yang ', 'Lian ', 'Quan ', 'Xia ', 'Duan ', 'Yuan ', 'Ye ', 'Nao ', 'Hu ', 'Ying ', 'Yu ', 'Huang ', 'Rui ', 'Se ', 'Liu ', 'Shi ', 'Rong ', 'Suo ', 'Yao ', 'Wen ', 'Wu ', 'Jin ', 'Jin ', 'Ying ', 'Ma ', 'Tao ', 'Liu ', 'Tang ', 'Li ', 'Lang ', 'Gui ', 'Zhen ', 'Qiang ', 'Cuo ', 'Jue ', 'Zhao ', 'Yao ', 'Ai ', 'Bin ', 'Tu ', 'Chang ', 'Kun ', 'Zhuan ', 'Cong ', 'Jin ', 'Yi ', 'Cui ', 'Cong ', 'Qi ', 'Li ', 'Ying ', 'Suo ', 'Qiu ', 'Xuan ', 'Ao ', 'Lian ', 'Man ', 'Zhang ', 'Yin ', '[?] ', 'Ying ', 'Zhi ', 'Lu ', 'Wu ', 'Deng ', 'Xiou ', 'Zeng ', 'Xun ', 'Qu ', 'Dang ', 'Lin ', 'Liao ', 'Qiong ', 'Su ', 'Huang ', 'Gui ', 'Pu ', 'Jing ', 'Fan ', 'Jin ', 'Liu ', 'Ji ', '[?] ', 'Jing ', 'Ai ', 'Bi ', 'Can ', 'Qu ', 'Zao ', 'Dang ', 'Jiao ', 'Gun ', 'Tan ', 'Hui ', 'Huan ', 'Se ', 'Sui ', 'Tian ', '[?] ', 'Yu ', 'Jin ', 'Lu ', 'Bin ', 'Shou ', 'Wen ', 'Zui ', 'Lan ', 'Xi ', 'Ji ', 'Xuan ', 'Ruan ', 'Huo ', 'Gai ', 'Lei ', 'Du ', 'Li ', 'Zhi ', 'Rou ', 'Li ', 'Zan ', 'Qiong ', 'Zhe ', 'Gui ', 'Sui ', 'La ', 'Long ', 'Lu ', 'Li ', 'Zan ', 'Lan ', 'Ying ', 'Mi ', 'Xiang ', 'Xi ', 'Guan ', 'Dao ', 'Zan ', 'Huan ', 'Gua ', 'Bo ', 'Die ', 'Bao ', 'Hu ', 'Zhi ', 'Piao ', 'Ban ', 'Rang ', 'Li ', 'Wa ', 'Dekaguramu ', 'Jiang ', 'Qian ', 'Fan ', 'Pen ', 'Fang ', 'Dan ', 'Weng ', 'Ou ', 'Deshiguramu ', 'Miriguramu ', 'Thon ', 'Hu ', 'Ling ', 'Yi ', 'Ping ', 'Ci ', 'Hekutogura ', 'Juan ', 'Chang ', 'Chi ', 'Sarake ', 'Dang ', 'Meng ', 'Pou '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x075.php b/vendor/voku/portable-ascii/src/voku/helper/data/x075.php
new file mode 100644
index 000000000..e20463390
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x075.php
@@ -0,0 +1 @@
+<?php return ['Zhui ', 'Ping ', 'Bian ', 'Zhou ', 'Zhen ', 'Senchigura ', 'Ci ', 'Ying ', 'Qi ', 'Xian ', 'Lou ', 'Di ', 'Ou ', 'Meng ', 'Zhuan ', 'Peng ', 'Lin ', 'Zeng ', 'Wu ', 'Pi ', 'Dan ', 'Weng ', 'Ying ', 'Yan ', 'Gan ', 'Dai ', 'Shen ', 'Tian ', 'Tian ', 'Han ', 'Chang ', 'Sheng ', 'Qing ', 'Sheng ', 'Chan ', 'Chan ', 'Rui ', 'Sheng ', 'Su ', 'Sen ', 'Yong ', 'Shuai ', 'Lu ', 'Fu ', 'Yong ', 'Beng ', 'Feng ', 'Ning ', 'Tian ', 'You ', 'Jia ', 'Shen ', 'Zha ', 'Dian ', 'Fu ', 'Nan ', 'Dian ', 'Ping ', 'Ting ', 'Hua ', 'Ting ', 'Quan ', 'Zi ', 'Meng ', 'Bi ', 'Qi ', 'Liu ', 'Xun ', 'Liu ', 'Chang ', 'Mu ', 'Yun ', 'Fan ', 'Fu ', 'Geng ', 'Tian ', 'Jie ', 'Jie ', 'Quan ', 'Wei ', 'Fu ', 'Tian ', 'Mu ', 'Tap ', 'Pan ', 'Jiang ', 'Wa ', 'Da ', 'Nan ', 'Liu ', 'Ben ', 'Zhen ', 'Chu ', 'Mu ', 'Mu ', 'Ce ', 'Cen ', 'Gai ', 'Bi ', 'Da ', 'Zhi ', 'Lue ', 'Qi ', 'Lue ', 'Pan ', 'Kesa ', 'Fan ', 'Hua ', 'Yu ', 'Yu ', 'Mu ', 'Jun ', 'Yi ', 'Liu ', 'Yu ', 'Die ', 'Chou ', 'Hua ', 'Dang ', 'Chuo ', 'Ji ', 'Wan ', 'Jiang ', 'Sheng ', 'Chang ', 'Tuan ', 'Lei ', 'Ji ', 'Cha ', 'Liu ', 'Tatamu ', 'Tuan ', 'Lin ', 'Jiang ', 'Jiang ', 'Chou ', 'Bo ', 'Die ', 'Die ', 'Pi ', 'Nie ', 'Dan ', 'Shu ', 'Shu ', 'Zhi ', 'Yi ', 'Chuang ', 'Nai ', 'Ding ', 'Bi ', 'Jie ', 'Liao ', 'Gong ', 'Ge ', 'Jiu ', 'Zhou ', 'Xia ', 'Shan ', 'Xu ', 'Nue ', 'Li ', 'Yang ', 'Chen ', 'You ', 'Ba ', 'Jie ', 'Jue ', 'Zhi ', 'Xia ', 'Cui ', 'Bi ', 'Yi ', 'Li ', 'Zong ', 'Chuang ', 'Feng ', 'Zhu ', 'Pao ', 'Pi ', 'Gan ', 'Ke ', 'Ci ', 'Xie ', 'Qi ', 'Dan ', 'Zhen ', 'Fa ', 'Zhi ', 'Teng ', 'Ju ', 'Ji ', 'Fei ', 'Qu ', 'Dian ', 'Jia ', 'Xian ', 'Cha ', 'Bing ', 'Ni ', 'Zheng ', 'Yong ', 'Jing ', 'Quan ', 'Chong ', 'Tong ', 'Yi ', 'Kai ', 'Wei ', 'Hui ', 'Duo ', 'Yang ', 'Chi ', 'Zhi ', 'Hen ', 'Ya ', 'Mei ', 'Dou ', 'Jing ', 'Xiao ', 'Tong ', 'Tu ', 'Mang ', 'Pi ', 'Xiao ', 'Suan ', 'Pu ', 'Li ', 'Zhi ', 'Cuo ', 'Duo ', 'Wu ', 'Sha ', 'Lao ', 'Shou ', 'Huan ', 'Xian ', 'Yi ', 'Peng ', 'Zhang ', 'Guan ', 'Tan ', 'Fei ', 'Ma ', 'Lin ', 'Chi ', 'Ji ', 'Dian ', 'An ', 'Chi ', 'Bi ', 'Bei ', 'Min ', 'Gu ', 'Dui ', 'E ', 'Wei '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x076.php b/vendor/voku/portable-ascii/src/voku/helper/data/x076.php
new file mode 100644
index 000000000..f55cb583f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x076.php
@@ -0,0 +1 @@
+<?php return ['Yu ', 'Cui ', 'Ya ', 'Zhu ', 'Cu ', 'Dan ', 'Shen ', 'Zhung ', 'Ji ', 'Yu ', 'Hou ', 'Feng ', 'La ', 'Yang ', 'Shen ', 'Tu ', 'Yu ', 'Gua ', 'Wen ', 'Huan ', 'Ku ', 'Jia ', 'Yin ', 'Yi ', 'Lu ', 'Sao ', 'Jue ', 'Chi ', 'Xi ', 'Guan ', 'Yi ', 'Wen ', 'Ji ', 'Chuang ', 'Ban ', 'Lei ', 'Liu ', 'Chai ', 'Shou ', 'Nue ', 'Dian ', 'Da ', 'Pie ', 'Tan ', 'Zhang ', 'Biao ', 'Shen ', 'Cu ', 'Luo ', 'Yi ', 'Zong ', 'Chou ', 'Zhang ', 'Zhai ', 'Sou ', 'Suo ', 'Que ', 'Diao ', 'Lou ', 'Lu ', 'Mo ', 'Jin ', 'Yin ', 'Ying ', 'Huang ', 'Fu ', 'Liao ', 'Long ', 'Qiao ', 'Liu ', 'Lao ', 'Xian ', 'Fei ', 'Dan ', 'Yin ', 'He ', 'Yan ', 'Ban ', 'Xian ', 'Guan ', 'Guai ', 'Nong ', 'Yu ', 'Wei ', 'Yi ', 'Yong ', 'Pi ', 'Lei ', 'Li ', 'Shu ', 'Dan ', 'Lin ', 'Dian ', 'Lin ', 'Lai ', 'Pie ', 'Ji ', 'Chi ', 'Yang ', 'Xian ', 'Jie ', 'Zheng ', '[?] ', 'Li ', 'Huo ', 'Lai ', 'Shaku ', 'Dian ', 'Xian ', 'Ying ', 'Yin ', 'Qu ', 'Yong ', 'Tan ', 'Dian ', 'Luo ', 'Luan ', 'Luan ', 'Bo ', '[?] ', 'Gui ', 'Po ', 'Fa ', 'Deng ', 'Fa ', 'Bai ', 'Bai ', 'Qie ', 'Bi ', 'Zao ', 'Zao ', 'Mao ', 'De ', 'Pa ', 'Jie ', 'Huang ', 'Gui ', 'Ci ', 'Ling ', 'Gao ', 'Mo ', 'Ji ', 'Jiao ', 'Peng ', 'Gao ', 'Ai ', 'E ', 'Hao ', 'Han ', 'Bi ', 'Wan ', 'Chou ', 'Qian ', 'Xi ', 'Ai ', 'Jiong ', 'Hao ', 'Huang ', 'Hao ', 'Ze ', 'Cui ', 'Hao ', 'Xiao ', 'Ye ', 'Po ', 'Hao ', 'Jiao ', 'Ai ', 'Xing ', 'Huang ', 'Li ', 'Piao ', 'He ', 'Jiao ', 'Pi ', 'Gan ', 'Pao ', 'Zhou ', 'Jun ', 'Qiu ', 'Cun ', 'Que ', 'Zha ', 'Gu ', 'Jun ', 'Jun ', 'Zhou ', 'Zha ', 'Gu ', 'Zhan ', 'Du ', 'Min ', 'Qi ', 'Ying ', 'Yu ', 'Bei ', 'Zhao ', 'Zhong ', 'Pen ', 'He ', 'Ying ', 'He ', 'Yi ', 'Bo ', 'Wan ', 'He ', 'Ang ', 'Zhan ', 'Yan ', 'Jian ', 'He ', 'Yu ', 'Kui ', 'Fan ', 'Gai ', 'Dao ', 'Pan ', 'Fu ', 'Qiu ', 'Sheng ', 'Dao ', 'Lu ', 'Zhan ', 'Meng ', 'Li ', 'Jin ', 'Xu ', 'Jian ', 'Pan ', 'Guan ', 'An ', 'Lu ', 'Shu ', 'Zhou ', 'Dang ', 'An ', 'Gu ', 'Li ', 'Mu ', 'Cheng ', 'Gan ', 'Xu ', 'Mang ', 'Mang ', 'Zhi ', 'Qi ', 'Ruan ', 'Tian ', 'Xiang ', 'Dun ', 'Xin ', 'Xi ', 'Pan ', 'Feng ', 'Dun ', 'Min '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x077.php b/vendor/voku/portable-ascii/src/voku/helper/data/x077.php
new file mode 100644
index 000000000..4b3bdb427
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x077.php
@@ -0,0 +1 @@
+<?php return ['Ming ', 'Sheng ', 'Shi ', 'Yun ', 'Mian ', 'Pan ', 'Fang ', 'Miao ', 'Dan ', 'Mei ', 'Mao ', 'Kan ', 'Xian ', 'Ou ', 'Shi ', 'Yang ', 'Zheng ', 'Yao ', 'Shen ', 'Huo ', 'Da ', 'Zhen ', 'Kuang ', 'Ju ', 'Shen ', 'Chi ', 'Sheng ', 'Mei ', 'Mo ', 'Zhu ', 'Zhen ', 'Zhen ', 'Mian ', 'Di ', 'Yuan ', 'Die ', 'Yi ', 'Zi ', 'Zi ', 'Chao ', 'Zha ', 'Xuan ', 'Bing ', 'Mi ', 'Long ', 'Sui ', 'Dong ', 'Mi ', 'Die ', 'Yi ', 'Er ', 'Ming ', 'Xuan ', 'Chi ', 'Kuang ', 'Juan ', 'Mou ', 'Zhen ', 'Tiao ', 'Yang ', 'Yan ', 'Mo ', 'Zhong ', 'Mai ', 'Zhao ', 'Zheng ', 'Mei ', 'Jun ', 'Shao ', 'Han ', 'Huan ', 'Di ', 'Cheng ', 'Cuo ', 'Juan ', 'E ', 'Wan ', 'Xian ', 'Xi ', 'Kun ', 'Lai ', 'Jian ', 'Shan ', 'Tian ', 'Hun ', 'Wan ', 'Ling ', 'Shi ', 'Qiong ', 'Lie ', 'Yai ', 'Jing ', 'Zheng ', 'Li ', 'Lai ', 'Sui ', 'Juan ', 'Shui ', 'Sui ', 'Du ', 'Bi ', 'Bi ', 'Mu ', 'Hun ', 'Ni ', 'Lu ', 'Yi ', 'Jie ', 'Cai ', 'Zhou ', 'Yu ', 'Hun ', 'Ma ', 'Xia ', 'Xing ', 'Xi ', 'Gun ', 'Cai ', 'Chun ', 'Jian ', 'Mei ', 'Du ', 'Hou ', 'Xuan ', 'Ti ', 'Kui ', 'Gao ', 'Rui ', 'Mou ', 'Xu ', 'Fa ', 'Wen ', 'Miao ', 'Chou ', 'Kui ', 'Mi ', 'Weng ', 'Kou ', 'Dang ', 'Chen ', 'Ke ', 'Sou ', 'Xia ', 'Qiong ', 'Mao ', 'Ming ', 'Man ', 'Shui ', 'Ze ', 'Zhang ', 'Yi ', 'Diao ', 'Ou ', 'Mo ', 'Shun ', 'Cong ', 'Lou ', 'Chi ', 'Man ', 'Piao ', 'Cheng ', 'Ji ', 'Meng ', '[?] ', 'Run ', 'Pie ', 'Xi ', 'Qiao ', 'Pu ', 'Zhu ', 'Deng ', 'Shen ', 'Shun ', 'Liao ', 'Che ', 'Xian ', 'Kan ', 'Ye ', 'Xu ', 'Tong ', 'Mou ', 'Lin ', 'Kui ', 'Xian ', 'Ye ', 'Ai ', 'Hui ', 'Zhan ', 'Jian ', 'Gu ', 'Zhao ', 'Qu ', 'Wei ', 'Chou ', 'Sao ', 'Ning ', 'Xun ', 'Yao ', 'Huo ', 'Meng ', 'Mian ', 'Bin ', 'Mian ', 'Li ', 'Kuang ', 'Jue ', 'Xuan ', 'Mian ', 'Huo ', 'Lu ', 'Meng ', 'Long ', 'Guan ', 'Man ', 'Xi ', 'Chu ', 'Tang ', 'Kan ', 'Zhu ', 'Mao ', 'Jin ', 'Lin ', 'Yu ', 'Shuo ', 'Ce ', 'Jue ', 'Shi ', 'Yi ', 'Shen ', 'Zhi ', 'Hou ', 'Shen ', 'Ying ', 'Ju ', 'Zhou ', 'Jiao ', 'Cuo ', 'Duan ', 'Ai ', 'Jiao ', 'Zeng ', 'Huo ', 'Bai ', 'Shi ', 'Ding ', 'Qi ', 'Ji ', 'Zi ', 'Gan ', 'Wu ', 'Tuo ', 'Ku ', 'Qiang ', 'Xi ', 'Fan ', 'Kuang '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x078.php b/vendor/voku/portable-ascii/src/voku/helper/data/x078.php
new file mode 100644
index 000000000..27597fce6
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x078.php
@@ -0,0 +1 @@
+<?php return ['Dang ', 'Ma ', 'Sha ', 'Dan ', 'Jue ', 'Li ', 'Fu ', 'Min ', 'Nuo ', 'Huo ', 'Kang ', 'Zhi ', 'Qi ', 'Kan ', 'Jie ', 'Fen ', 'E ', 'Ya ', 'Pi ', 'Zhe ', 'Yan ', 'Sui ', 'Zhuan ', 'Che ', 'Dun ', 'Pan ', 'Yan ', '[?] ', 'Feng ', 'Fa ', 'Mo ', 'Zha ', 'Qu ', 'Yu ', 'Luo ', 'Tuo ', 'Tuo ', 'Di ', 'Zhai ', 'Zhen ', 'Ai ', 'Fei ', 'Mu ', 'Zhu ', 'Li ', 'Bian ', 'Nu ', 'Ping ', 'Peng ', 'Ling ', 'Pao ', 'Le ', 'Po ', 'Bo ', 'Po ', 'Shen ', 'Za ', 'Nuo ', 'Li ', 'Long ', 'Tong ', '[?] ', 'Li ', 'Aragane ', 'Chu ', 'Keng ', 'Quan ', 'Zhu ', 'Kuang ', 'Huo ', 'E ', 'Nao ', 'Jia ', 'Lu ', 'Wei ', 'Ai ', 'Luo ', 'Ken ', 'Xing ', 'Yan ', 'Tong ', 'Peng ', 'Xi ', '[?] ', 'Hong ', 'Shuo ', 'Xia ', 'Qiao ', '[?] ', 'Wei ', 'Qiao ', '[?] ', 'Keng ', 'Xiao ', 'Que ', 'Chan ', 'Lang ', 'Hong ', 'Yu ', 'Xiao ', 'Xia ', 'Mang ', 'Long ', 'Iong ', 'Che ', 'Che ', 'E ', 'Liu ', 'Ying ', 'Mang ', 'Que ', 'Yan ', 'Sha ', 'Kun ', 'Yu ', '[?] ', 'Kaki ', 'Lu ', 'Chen ', 'Jian ', 'Nue ', 'Song ', 'Zhuo ', 'Keng ', 'Peng ', 'Yan ', 'Zhui ', 'Kong ', 'Ceng ', 'Qi ', 'Zong ', 'Qing ', 'Lin ', 'Jun ', 'Bo ', 'Ding ', 'Min ', 'Diao ', 'Jian ', 'He ', 'Lu ', 'Ai ', 'Sui ', 'Que ', 'Ling ', 'Bei ', 'Yin ', 'Dui ', 'Wu ', 'Qi ', 'Lun ', 'Wan ', 'Dian ', 'Gang ', 'Pei ', 'Qi ', 'Chen ', 'Ruan ', 'Yan ', 'Die ', 'Ding ', 'Du ', 'Tuo ', 'Jie ', 'Ying ', 'Bian ', 'Ke ', 'Bi ', 'Wei ', 'Shuo ', 'Zhen ', 'Duan ', 'Xia ', 'Dang ', 'Ti ', 'Nao ', 'Peng ', 'Jian ', 'Di ', 'Tan ', 'Cha ', 'Seki ', 'Qi ', '[?] ', 'Feng ', 'Xuan ', 'Que ', 'Que ', 'Ma ', 'Gong ', 'Nian ', 'Su ', 'E ', 'Ci ', 'Liu ', 'Si ', 'Tang ', 'Bang ', 'Hua ', 'Pi ', 'Wei ', 'Sang ', 'Lei ', 'Cuo ', 'Zhen ', 'Xia ', 'Qi ', 'Lian ', 'Pan ', 'Wei ', 'Yun ', 'Dui ', 'Zhe ', 'Ke ', 'La ', '[?] ', 'Qing ', 'Gun ', 'Zhuan ', 'Chan ', 'Qi ', 'Ao ', 'Peng ', 'Lu ', 'Lu ', 'Kan ', 'Qiang ', 'Chen ', 'Yin ', 'Lei ', 'Biao ', 'Qi ', 'Mo ', 'Qi ', 'Cui ', 'Zong ', 'Qing ', 'Chuo ', '[?] ', 'Ji ', 'Shan ', 'Lao ', 'Qu ', 'Zeng ', 'Deng ', 'Jian ', 'Xi ', 'Lin ', 'Ding ', 'Dian ', 'Huang ', 'Pan ', 'Za ', 'Qiao ', 'Di ', 'Li '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x079.php b/vendor/voku/portable-ascii/src/voku/helper/data/x079.php
new file mode 100644
index 000000000..f8beeecb9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x079.php
@@ -0,0 +1 @@
+<?php return ['Tani ', 'Jiao ', '[?] ', 'Zhang ', 'Qiao ', 'Dun ', 'Xian ', 'Yu ', 'Zhui ', 'He ', 'Huo ', 'Zhai ', 'Lei ', 'Ke ', 'Chu ', 'Ji ', 'Que ', 'Dang ', 'Yi ', 'Jiang ', 'Pi ', 'Pi ', 'Yu ', 'Pin ', 'Qi ', 'Ai ', 'Kai ', 'Jian ', 'Yu ', 'Ruan ', 'Meng ', 'Pao ', 'Ci ', '[?] ', '[?] ', 'Mie ', 'Ca ', 'Xian ', 'Kuang ', 'Lei ', 'Lei ', 'Zhi ', 'Li ', 'Li ', 'Fan ', 'Que ', 'Pao ', 'Ying ', 'Li ', 'Long ', 'Long ', 'Mo ', 'Bo ', 'Shuang ', 'Guan ', 'Lan ', 'Zan ', 'Yan ', 'Shi ', 'Shi ', 'Li ', 'Reng ', 'She ', 'Yue ', 'Si ', 'Qi ', 'Ta ', 'Ma ', 'Xie ', 'Xian ', 'Xian ', 'Zhi ', 'Qi ', 'Zhi ', 'Beng ', 'Dui ', 'Zhong ', '[?] ', 'Yi ', 'Shi ', 'You ', 'Zhi ', 'Tiao ', 'Fu ', 'Fu ', 'Mi ', 'Zu ', 'Zhi ', 'Suan ', 'Mei ', 'Zuo ', 'Qu ', 'Hu ', 'Zhu ', 'Shen ', 'Sui ', 'Ci ', 'Chai ', 'Mi ', 'Lu ', 'Yu ', 'Xiang ', 'Wu ', 'Tiao ', 'Piao ', 'Zhu ', 'Gui ', 'Xia ', 'Zhi ', 'Ji ', 'Gao ', 'Zhen ', 'Gao ', 'Shui ', 'Jin ', 'Chen ', 'Gai ', 'Kun ', 'Di ', 'Dao ', 'Huo ', 'Tao ', 'Qi ', 'Gu ', 'Guan ', 'Zui ', 'Ling ', 'Lu ', 'Bing ', 'Jin ', 'Dao ', 'Zhi ', 'Lu ', 'Shan ', 'Bei ', 'Zhe ', 'Hui ', 'You ', 'Xi ', 'Yin ', 'Zi ', 'Huo ', 'Zhen ', 'Fu ', 'Yuan ', 'Wu ', 'Xian ', 'Yang ', 'Ti ', 'Yi ', 'Mei ', 'Si ', 'Di ', '[?] ', 'Zhuo ', 'Zhen ', 'Yong ', 'Ji ', 'Gao ', 'Tang ', 'Si ', 'Ma ', 'Ta ', '[?] ', 'Xuan ', 'Qi ', 'Yu ', 'Xi ', 'Ji ', 'Si ', 'Chan ', 'Tan ', 'Kuai ', 'Sui ', 'Li ', 'Nong ', 'Ni ', 'Dao ', 'Li ', 'Rang ', 'Yue ', 'Ti ', 'Zan ', 'Lei ', 'Rou ', 'Yu ', 'Yu ', 'Chi ', 'Xie ', 'Qin ', 'He ', 'Tu ', 'Xiu ', 'Si ', 'Ren ', 'Tu ', 'Zi ', 'Cha ', 'Gan ', 'Yi ', 'Xian ', 'Bing ', 'Nian ', 'Qiu ', 'Qiu ', 'Chong ', 'Fen ', 'Hao ', 'Yun ', 'Ke ', 'Miao ', 'Zhi ', 'Geng ', 'Bi ', 'Zhi ', 'Yu ', 'Mi ', 'Ku ', 'Ban ', 'Pi ', 'Ni ', 'Li ', 'You ', 'Zu ', 'Pi ', 'Ba ', 'Ling ', 'Mo ', 'Cheng ', 'Nian ', 'Qin ', 'Yang ', 'Zuo ', 'Zhi ', 'Zhi ', 'Shu ', 'Ju ', 'Zi ', 'Huo ', 'Ji ', 'Cheng ', 'Tong ', 'Zhi ', 'Huo ', 'He ', 'Yin ', 'Zi ', 'Zhi ', 'Jie ', 'Ren ', 'Du ', 'Yi ', 'Zhu ', 'Hui ', 'Nong ', 'Fu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php
new file mode 100644
index 000000000..0017baf99
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php
@@ -0,0 +1 @@
+<?php return ['Xi ', 'Kao ', 'Lang ', 'Fu ', 'Ze ', 'Shui ', 'Lu ', 'Kun ', 'Gan ', 'Geng ', 'Ti ', 'Cheng ', 'Tu ', 'Shao ', 'Shui ', 'Ya ', 'Lun ', 'Lu ', 'Gu ', 'Zuo ', 'Ren ', 'Zhun ', 'Bang ', 'Bai ', 'Ji ', 'Zhi ', 'Zhi ', 'Kun ', 'Leng ', 'Peng ', 'Ke ', 'Bing ', 'Chou ', 'Zu ', 'Yu ', 'Su ', 'Lue ', '[?] ', 'Yi ', 'Xi ', 'Bian ', 'Ji ', 'Fu ', 'Bi ', 'Nuo ', 'Jie ', 'Zhong ', 'Zong ', 'Xu ', 'Cheng ', 'Dao ', 'Wen ', 'Lian ', 'Zi ', 'Yu ', 'Ji ', 'Xu ', 'Zhen ', 'Zhi ', 'Dao ', 'Jia ', 'Ji ', 'Gao ', 'Gao ', 'Gu ', 'Rong ', 'Sui ', 'You ', 'Ji ', 'Kang ', 'Mu ', 'Shan ', 'Men ', 'Zhi ', 'Ji ', 'Lu ', 'Su ', 'Ji ', 'Ying ', 'Wen ', 'Qiu ', 'Se ', '[?] ', 'Yi ', 'Huang ', 'Qie ', 'Ji ', 'Sui ', 'Xiao ', 'Pu ', 'Jiao ', 'Zhuo ', 'Tong ', 'Sai ', 'Lu ', 'Sui ', 'Nong ', 'Se ', 'Hui ', 'Rang ', 'Nuo ', 'Yu ', 'Bin ', 'Ji ', 'Tui ', 'Wen ', 'Cheng ', 'Huo ', 'Gong ', 'Lu ', 'Biao ', '[?] ', 'Rang ', 'Zhuo ', 'Li ', 'Zan ', 'Xue ', 'Wa ', 'Jiu ', 'Qiong ', 'Xi ', 'Qiong ', 'Kong ', 'Yu ', 'Sen ', 'Jing ', 'Yao ', 'Chuan ', 'Zhun ', 'Tu ', 'Lao ', 'Qie ', 'Zhai ', 'Yao ', 'Bian ', 'Bao ', 'Yao ', 'Bing ', 'Wa ', 'Zhu ', 'Jiao ', 'Qiao ', 'Diao ', 'Wu ', 'Gui ', 'Yao ', 'Zhi ', 'Chuang ', 'Yao ', 'Tiao ', 'Jiao ', 'Chuang ', 'Jiong ', 'Xiao ', 'Cheng ', 'Kou ', 'Cuan ', 'Wo ', 'Dan ', 'Ku ', 'Ke ', 'Zhui ', 'Xu ', 'Su ', 'Guan ', 'Kui ', 'Dou ', '[?] ', 'Yin ', 'Wo ', 'Wa ', 'Ya ', 'Yu ', 'Ju ', 'Qiong ', 'Yao ', 'Yao ', 'Tiao ', 'Chao ', 'Yu ', 'Tian ', 'Diao ', 'Ju ', 'Liao ', 'Xi ', 'Wu ', 'Kui ', 'Chuang ', 'Zhao ', '[?] ', 'Kuan ', 'Long ', 'Cheng ', 'Cui ', 'Piao ', 'Zao ', 'Cuan ', 'Qiao ', 'Qiong ', 'Dou ', 'Zao ', 'Long ', 'Qie ', 'Li ', 'Chu ', 'Shi ', 'Fou ', 'Qian ', 'Chu ', 'Hong ', 'Qi ', 'Qian ', 'Gong ', 'Shi ', 'Shu ', 'Miao ', 'Ju ', 'Zhan ', 'Zhu ', 'Ling ', 'Long ', 'Bing ', 'Jing ', 'Jing ', 'Zhang ', 'Yi ', 'Si ', 'Jun ', 'Hong ', 'Tong ', 'Song ', 'Jing ', 'Diao ', 'Yi ', 'Shu ', 'Jing ', 'Qu ', 'Jie ', 'Ping ', 'Duan ', 'Shao ', 'Zhuan ', 'Ceng ', 'Deng ', 'Cui ', 'Huai ', 'Jing ', 'Kan ', 'Jing ', 'Zhu ', 'Zhu ', 'Le ', 'Peng ', 'Yu ', 'Chi ', 'Gan '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php
new file mode 100644
index 000000000..6f74b80ef
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php
@@ -0,0 +1 @@
+<?php return ['Mang ', 'Zhu ', 'Utsubo ', 'Du ', 'Ji ', 'Xiao ', 'Ba ', 'Suan ', 'Ji ', 'Zhen ', 'Zhao ', 'Sun ', 'Ya ', 'Zhui ', 'Yuan ', 'Hu ', 'Gang ', 'Xiao ', 'Cen ', 'Pi ', 'Bi ', 'Jian ', 'Yi ', 'Dong ', 'Shan ', 'Sheng ', 'Xia ', 'Di ', 'Zhu ', 'Na ', 'Chi ', 'Gu ', 'Li ', 'Qie ', 'Min ', 'Bao ', 'Tiao ', 'Si ', 'Fu ', 'Ce ', 'Ben ', 'Pei ', 'Da ', 'Zi ', 'Di ', 'Ling ', 'Ze ', 'Nu ', 'Fu ', 'Gou ', 'Fan ', 'Jia ', 'Ge ', 'Fan ', 'Shi ', 'Mao ', 'Po ', 'Sey ', 'Jian ', 'Qiong ', 'Long ', 'Souke ', 'Bian ', 'Luo ', 'Gui ', 'Qu ', 'Chi ', 'Yin ', 'Yao ', 'Xian ', 'Bi ', 'Qiong ', 'Gua ', 'Deng ', 'Jiao ', 'Jin ', 'Quan ', 'Sun ', 'Ru ', 'Fa ', 'Kuang ', 'Zhu ', 'Tong ', 'Ji ', 'Da ', 'Xing ', 'Ce ', 'Zhong ', 'Kou ', 'Lai ', 'Bi ', 'Shai ', 'Dang ', 'Zheng ', 'Ce ', 'Fu ', 'Yun ', 'Tu ', 'Pa ', 'Li ', 'Lang ', 'Ju ', 'Guan ', 'Jian ', 'Han ', 'Tong ', 'Xia ', 'Zhi ', 'Cheng ', 'Suan ', 'Shi ', 'Zhu ', 'Zuo ', 'Xiao ', 'Shao ', 'Ting ', 'Ce ', 'Yan ', 'Gao ', 'Kuai ', 'Gan ', 'Chou ', 'Kago ', 'Gang ', 'Yun ', 'O ', 'Qian ', 'Xiao ', 'Jian ', 'Pu ', 'Lai ', 'Zou ', 'Bi ', 'Bi ', 'Bi ', 'Ge ', 'Chi ', 'Guai ', 'Yu ', 'Jian ', 'Zhao ', 'Gu ', 'Chi ', 'Zheng ', 'Jing ', 'Sha ', 'Zhou ', 'Lu ', 'Bo ', 'Ji ', 'Lin ', 'Suan ', 'Jun ', 'Fu ', 'Zha ', 'Gu ', 'Kong ', 'Qian ', 'Quan ', 'Jun ', 'Chui ', 'Guan ', 'Yuan ', 'Ce ', 'Ju ', 'Bo ', 'Ze ', 'Qie ', 'Tuo ', 'Luo ', 'Dan ', 'Xiao ', 'Ruo ', 'Jian ', 'Xuan ', 'Bian ', 'Sun ', 'Xiang ', 'Xian ', 'Ping ', 'Zhen ', 'Sheng ', 'Hu ', 'Shi ', 'Zhu ', 'Yue ', 'Chun ', 'Lu ', 'Wu ', 'Dong ', 'Xiao ', 'Ji ', 'Jie ', 'Huang ', 'Xing ', 'Mei ', 'Fan ', 'Chui ', 'Zhuan ', 'Pian ', 'Feng ', 'Zhu ', 'Hong ', 'Qie ', 'Hou ', 'Qiu ', 'Miao ', 'Qian ', '[?] ', 'Kui ', 'Sik ', 'Lou ', 'Yun ', 'He ', 'Tang ', 'Yue ', 'Chou ', 'Gao ', 'Fei ', 'Ruo ', 'Zheng ', 'Gou ', 'Nie ', 'Qian ', 'Xiao ', 'Cuan ', 'Gong ', 'Pang ', 'Du ', 'Li ', 'Bi ', 'Zhuo ', 'Chu ', 'Shai ', 'Chi ', 'Zhu ', 'Qiang ', 'Long ', 'Lan ', 'Jian ', 'Bu ', 'Li ', 'Hui ', 'Bi ', 'Di ', 'Cong ', 'Yan ', 'Peng ', 'Sen ', 'Zhuan ', 'Pai ', 'Piao ', 'Dou ', 'Yu ', 'Mie ', 'Zhuan '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php
new file mode 100644
index 000000000..93321f844
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php
@@ -0,0 +1 @@
+<?php return ['Ze ', 'Xi ', 'Guo ', 'Yi ', 'Hu ', 'Chan ', 'Kou ', 'Cu ', 'Ping ', 'Chou ', 'Ji ', 'Gui ', 'Su ', 'Lou ', 'Zha ', 'Lu ', 'Nian ', 'Suo ', 'Cuan ', 'Sasara ', 'Suo ', 'Le ', 'Duan ', 'Yana ', 'Xiao ', 'Bo ', 'Mi ', 'Si ', 'Dang ', 'Liao ', 'Dan ', 'Dian ', 'Fu ', 'Jian ', 'Min ', 'Kui ', 'Dai ', 'Qiao ', 'Deng ', 'Huang ', 'Sun ', 'Lao ', 'Zan ', 'Xiao ', 'Du ', 'Shi ', 'Zan ', '[?] ', 'Pai ', 'Hata ', 'Pai ', 'Gan ', 'Ju ', 'Du ', 'Lu ', 'Yan ', 'Bo ', 'Dang ', 'Sai ', 'Ke ', 'Long ', 'Qian ', 'Lian ', 'Bo ', 'Zhou ', 'Lai ', '[?] ', 'Lan ', 'Kui ', 'Yu ', 'Yue ', 'Hao ', 'Zhen ', 'Tai ', 'Ti ', 'Mi ', 'Chou ', 'Ji ', '[?] ', 'Hata ', 'Teng ', 'Zhuan ', 'Zhou ', 'Fan ', 'Sou ', 'Zhou ', 'Kuji ', 'Zhuo ', 'Teng ', 'Lu ', 'Lu ', 'Jian ', 'Tuo ', 'Ying ', 'Yu ', 'Lai ', 'Long ', 'Shinshi ', 'Lian ', 'Lan ', 'Qian ', 'Yue ', 'Zhong ', 'Qu ', 'Lian ', 'Bian ', 'Duan ', 'Zuan ', 'Li ', 'Si ', 'Luo ', 'Ying ', 'Yue ', 'Zhuo ', 'Xu ', 'Mi ', 'Di ', 'Fan ', 'Shen ', 'Zhe ', 'Shen ', 'Nu ', 'Xie ', 'Lei ', 'Xian ', 'Zi ', 'Ni ', 'Cun ', '[?] ', 'Qian ', 'Kume ', 'Bi ', 'Ban ', 'Wu ', 'Sha ', 'Kang ', 'Rou ', 'Fen ', 'Bi ', 'Cui ', '[?] ', 'Li ', 'Chi ', 'Nukamiso ', 'Ro ', 'Ba ', 'Li ', 'Gan ', 'Ju ', 'Po ', 'Mo ', 'Cu ', 'Nian ', 'Zhou ', 'Li ', 'Su ', 'Tiao ', 'Li ', 'Qi ', 'Su ', 'Hong ', 'Tong ', 'Zi ', 'Ce ', 'Yue ', 'Zhou ', 'Lin ', 'Zhuang ', 'Bai ', '[?] ', 'Fen ', 'Ji ', '[?] ', 'Sukumo ', 'Liang ', 'Xian ', 'Fu ', 'Liang ', 'Can ', 'Geng ', 'Li ', 'Yue ', 'Lu ', 'Ju ', 'Qi ', 'Cui ', 'Bai ', 'Zhang ', 'Lin ', 'Zong ', 'Jing ', 'Guo ', 'Kouji ', 'San ', 'San ', 'Tang ', 'Bian ', 'Rou ', 'Mian ', 'Hou ', 'Xu ', 'Zong ', 'Hu ', 'Jian ', 'Zan ', 'Ci ', 'Li ', 'Xie ', 'Fu ', 'Ni ', 'Bei ', 'Gu ', 'Xiu ', 'Gao ', 'Tang ', 'Qiu ', 'Sukumo ', 'Cao ', 'Zhuang ', 'Tang ', 'Mi ', 'San ', 'Fen ', 'Zao ', 'Kang ', 'Jiang ', 'Mo ', 'San ', 'San ', 'Nuo ', 'Xi ', 'Liang ', 'Jiang ', 'Kuai ', 'Bo ', 'Huan ', '[?] ', 'Zong ', 'Xian ', 'Nuo ', 'Tuan ', 'Nie ', 'Li ', 'Zuo ', 'Di ', 'Nie ', 'Tiao ', 'Lan ', 'Mi ', 'Jiao ', 'Jiu ', 'Xi ', 'Gong ', 'Zheng ', 'Jiu ', 'You '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php
new file mode 100644
index 000000000..6d05a298a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php
@@ -0,0 +1 @@
+<?php return ['Ji ', 'Cha ', 'Zhou ', 'Xun ', 'Yue ', 'Hong ', 'Yu ', 'He ', 'Wan ', 'Ren ', 'Wen ', 'Wen ', 'Qiu ', 'Na ', 'Zi ', 'Tou ', 'Niu ', 'Fou ', 'Jie ', 'Shu ', 'Chun ', 'Pi ', 'Yin ', 'Sha ', 'Hong ', 'Zhi ', 'Ji ', 'Fen ', 'Yun ', 'Ren ', 'Dan ', 'Jin ', 'Su ', 'Fang ', 'Suo ', 'Cui ', 'Jiu ', 'Zha ', 'Kinu ', 'Jin ', 'Fu ', 'Zhi ', 'Ci ', 'Zi ', 'Chou ', 'Hong ', 'Zha ', 'Lei ', 'Xi ', 'Fu ', 'Xie ', 'Shen ', 'Bei ', 'Zhu ', 'Qu ', 'Ling ', 'Zhu ', 'Shao ', 'Gan ', 'Yang ', 'Fu ', 'Tuo ', 'Zhen ', 'Dai ', 'Zhuo ', 'Shi ', 'Zhong ', 'Xian ', 'Zu ', 'Jiong ', 'Ban ', 'Ju ', 'Mo ', 'Shu ', 'Zui ', 'Wata ', 'Jing ', 'Ren ', 'Heng ', 'Xie ', 'Jie ', 'Zhu ', 'Chou ', 'Gua ', 'Bai ', 'Jue ', 'Kuang ', 'Hu ', 'Ci ', 'Geng ', 'Geng ', 'Tao ', 'Xie ', 'Ku ', 'Jiao ', 'Quan ', 'Gai ', 'Luo ', 'Xuan ', 'Bing ', 'Xian ', 'Fu ', 'Gei ', 'Tong ', 'Rong ', 'Tiao ', 'Yin ', 'Lei ', 'Xie ', 'Quan ', 'Xu ', 'Lun ', 'Die ', 'Tong ', 'Si ', 'Jiang ', 'Xiang ', 'Hui ', 'Jue ', 'Zhi ', 'Jian ', 'Juan ', 'Chi ', 'Mian ', 'Zhen ', 'Lu ', 'Cheng ', 'Qiu ', 'Shu ', 'Bang ', 'Tong ', 'Xiao ', 'Wan ', 'Qin ', 'Geng ', 'Xiu ', 'Ti ', 'Xiu ', 'Xie ', 'Hong ', 'Xi ', 'Fu ', 'Ting ', 'Sui ', 'Dui ', 'Kun ', 'Fu ', 'Jing ', 'Hu ', 'Zhi ', 'Yan ', 'Jiong ', 'Feng ', 'Ji ', 'Sok ', 'Kase ', 'Zong ', 'Lin ', 'Duo ', 'Li ', 'Lu ', 'Liang ', 'Chou ', 'Quan ', 'Shao ', 'Qi ', 'Qi ', 'Zhun ', 'Qi ', 'Wan ', 'Qian ', 'Xian ', 'Shou ', 'Wei ', 'Qi ', 'Tao ', 'Wan ', 'Gang ', 'Wang ', 'Beng ', 'Zhui ', 'Cai ', 'Guo ', 'Cui ', 'Lun ', 'Liu ', 'Qi ', 'Zhan ', 'Bei ', 'Chuo ', 'Ling ', 'Mian ', 'Qi ', 'Qie ', 'Tan ', 'Zong ', 'Gun ', 'Zou ', 'Yi ', 'Zi ', 'Xing ', 'Liang ', 'Jin ', 'Fei ', 'Rui ', 'Min ', 'Yu ', 'Zong ', 'Fan ', 'Lu ', 'Xu ', 'Yingl ', 'Zhang ', 'Kasuri ', 'Xu ', 'Xiang ', 'Jian ', 'Ke ', 'Xian ', 'Ruan ', 'Mian ', 'Qi ', 'Duan ', 'Zhong ', 'Di ', 'Min ', 'Miao ', 'Yuan ', 'Xie ', 'Bao ', 'Si ', 'Qiu ', 'Bian ', 'Huan ', 'Geng ', 'Cong ', 'Mian ', 'Wei ', 'Fu ', 'Wei ', 'Yu ', 'Gou ', 'Miao ', 'Xie ', 'Lian ', 'Zong ', 'Bian ', 'Yun ', 'Yin ', 'Ti ', 'Gua ', 'Zhi ', 'Yun ', 'Cheng ', 'Chan ', 'Dai '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php
new file mode 100644
index 000000000..83a776fbd
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php
@@ -0,0 +1 @@
+<?php return ['Xia ', 'Yuan ', 'Zong ', 'Xu ', 'Nawa ', 'Odoshi ', 'Geng ', 'Sen ', 'Ying ', 'Jin ', 'Yi ', 'Zhui ', 'Ni ', 'Bang ', 'Gu ', 'Pan ', 'Zhou ', 'Jian ', 'Cuo ', 'Quan ', 'Shuang ', 'Yun ', 'Xia ', 'Shuai ', 'Xi ', 'Rong ', 'Tao ', 'Fu ', 'Yun ', 'Zhen ', 'Gao ', 'Ru ', 'Hu ', 'Zai ', 'Teng ', 'Xian ', 'Su ', 'Zhen ', 'Zong ', 'Tao ', 'Horo ', 'Cai ', 'Bi ', 'Feng ', 'Cu ', 'Li ', 'Suo ', 'Yin ', 'Xi ', 'Zong ', 'Lei ', 'Zhuan ', 'Qian ', 'Man ', 'Zhi ', 'Lu ', 'Mo ', 'Piao ', 'Lian ', 'Mi ', 'Xuan ', 'Zong ', 'Ji ', 'Shan ', 'Sui ', 'Fan ', 'Shuai ', 'Beng ', 'Yi ', 'Sao ', 'Mou ', 'Zhou ', 'Qiang ', 'Hun ', 'Sem ', 'Xi ', 'Jung ', 'Xiu ', 'Ran ', 'Xuan ', 'Hui ', 'Qiao ', 'Zeng ', 'Zuo ', 'Zhi ', 'Shan ', 'San ', 'Lin ', 'Yu ', 'Fan ', 'Liao ', 'Chuo ', 'Zun ', 'Jian ', 'Rao ', 'Chan ', 'Rui ', 'Xiu ', 'Hui ', 'Hua ', 'Zuan ', 'Xi ', 'Qiang ', 'Un ', 'Da ', 'Sheng ', 'Hui ', 'Xi ', 'Se ', 'Jian ', 'Jiang ', 'Huan ', 'Zao ', 'Cong ', 'Jie ', 'Jiao ', 'Bo ', 'Chan ', 'Yi ', 'Nao ', 'Sui ', 'Yi ', 'Shai ', 'Xu ', 'Ji ', 'Bin ', 'Qian ', 'Lan ', 'Pu ', 'Xun ', 'Zuan ', 'Qi ', 'Peng ', 'Li ', 'Mo ', 'Lei ', 'Xie ', 'Zuan ', 'Kuang ', 'You ', 'Xu ', 'Lei ', 'Xian ', 'Chan ', 'Kou ', 'Lu ', 'Chan ', 'Ying ', 'Cai ', 'Xiang ', 'Xian ', 'Zui ', 'Zuan ', 'Luo ', 'Xi ', 'Dao ', 'Lan ', 'Lei ', 'Lian ', 'Si ', 'Jiu ', 'Yu ', 'Hong ', 'Zhou ', 'Xian ', 'He ', 'Yue ', 'Ji ', 'Wan ', 'Kuang ', 'Ji ', 'Ren ', 'Wei ', 'Yun ', 'Hong ', 'Chun ', 'Pi ', 'Sha ', 'Gang ', 'Na ', 'Ren ', 'Zong ', 'Lun ', 'Fen ', 'Zhi ', 'Wen ', 'Fang ', 'Zhu ', 'Yin ', 'Niu ', 'Shu ', 'Xian ', 'Gan ', 'Xie ', 'Fu ', 'Lian ', 'Zu ', 'Shen ', 'Xi ', 'Zhi ', 'Zhong ', 'Zhou ', 'Ban ', 'Fu ', 'Zhuo ', 'Shao ', 'Yi ', 'Jing ', 'Dai ', 'Bang ', 'Rong ', 'Jie ', 'Ku ', 'Rao ', 'Die ', 'Heng ', 'Hui ', 'Gei ', 'Xuan ', 'Jiang ', 'Luo ', 'Jue ', 'Jiao ', 'Tong ', 'Geng ', 'Xiao ', 'Juan ', 'Xiu ', 'Xi ', 'Sui ', 'Tao ', 'Ji ', 'Ti ', 'Ji ', 'Xu ', 'Ling ', '[?] ', 'Xu ', 'Qi ', 'Fei ', 'Chuo ', 'Zhang ', 'Gun ', 'Sheng ', 'Wei ', 'Mian ', 'Shou ', 'Beng ', 'Chou ', 'Tao ', 'Liu ', 'Quan ', 'Zong ', 'Zhan ', 'Wan ', 'Lu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php
new file mode 100644
index 000000000..22e58a9da
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php
@@ -0,0 +1 @@
+<?php return ['Zhui ', 'Zi ', 'Ke ', 'Xiang ', 'Jian ', 'Mian ', 'Lan ', 'Ti ', 'Miao ', 'Qi ', 'Yun ', 'Hui ', 'Si ', 'Duo ', 'Duan ', 'Bian ', 'Xian ', 'Gou ', 'Zhui ', 'Huan ', 'Di ', 'Lu ', 'Bian ', 'Min ', 'Yuan ', 'Jin ', 'Fu ', 'Ru ', 'Zhen ', 'Feng ', 'Shuai ', 'Gao ', 'Chan ', 'Li ', 'Yi ', 'Jian ', 'Bin ', 'Piao ', 'Man ', 'Lei ', 'Ying ', 'Suo ', 'Mou ', 'Sao ', 'Xie ', 'Liao ', 'Shan ', 'Zeng ', 'Jiang ', 'Qian ', 'Zao ', 'Huan ', 'Jiao ', 'Zuan ', 'Fou ', 'Xie ', 'Gang ', 'Fou ', 'Que ', 'Fou ', 'Kaakeru ', 'Bo ', 'Ping ', 'Hou ', '[?] ', 'Gang ', 'Ying ', 'Ying ', 'Qing ', 'Xia ', 'Guan ', 'Zun ', 'Tan ', 'Chang ', 'Qi ', 'Weng ', 'Ying ', 'Lei ', 'Tan ', 'Lu ', 'Guan ', 'Wang ', 'Wang ', 'Gang ', 'Wang ', 'Han ', '[?] ', 'Luo ', 'Fu ', 'Mi ', 'Fa ', 'Gu ', 'Zhu ', 'Ju ', 'Mao ', 'Gu ', 'Min ', 'Gang ', 'Ba ', 'Gua ', 'Ti ', 'Juan ', 'Fu ', 'Lin ', 'Yan ', 'Zhao ', 'Zui ', 'Gua ', 'Zhuo ', 'Yu ', 'Zhi ', 'An ', 'Fa ', 'Nan ', 'Shu ', 'Si ', 'Pi ', 'Ma ', 'Liu ', 'Ba ', 'Fa ', 'Li ', 'Chao ', 'Wei ', 'Bi ', 'Ji ', 'Zeng ', 'Tong ', 'Liu ', 'Ji ', 'Juan ', 'Mi ', 'Zhao ', 'Luo ', 'Pi ', 'Ji ', 'Ji ', 'Luan ', 'Yang ', 'Mie ', 'Qiang ', 'Ta ', 'Mei ', 'Yang ', 'You ', 'You ', 'Fen ', 'Ba ', 'Gao ', 'Yang ', 'Gu ', 'Qiang ', 'Zang ', 'Gao ', 'Ling ', 'Yi ', 'Zhu ', 'Di ', 'Xiu ', 'Qian ', 'Yi ', 'Xian ', 'Rong ', 'Qun ', 'Qun ', 'Qian ', 'Huan ', 'Zui ', 'Xian ', 'Yi ', 'Yashinau ', 'Qiang ', 'Xian ', 'Yu ', 'Geng ', 'Jie ', 'Tang ', 'Yuan ', 'Xi ', 'Fan ', 'Shan ', 'Fen ', 'Shan ', 'Lian ', 'Lei ', 'Geng ', 'Nou ', 'Qiang ', 'Chan ', 'Yu ', 'Gong ', 'Yi ', 'Chong ', 'Weng ', 'Fen ', 'Hong ', 'Chi ', 'Chi ', 'Cui ', 'Fu ', 'Xia ', 'Pen ', 'Yi ', 'La ', 'Yi ', 'Pi ', 'Ling ', 'Liu ', 'Zhi ', 'Qu ', 'Xi ', 'Xie ', 'Xiang ', 'Xi ', 'Xi ', 'Qi ', 'Qiao ', 'Hui ', 'Hui ', 'Xiao ', 'Se ', 'Hong ', 'Jiang ', 'Di ', 'Cui ', 'Fei ', 'Tao ', 'Sha ', 'Chi ', 'Zhu ', 'Jian ', 'Xuan ', 'Shi ', 'Pian ', 'Zong ', 'Wan ', 'Hui ', 'Hou ', 'He ', 'He ', 'Han ', 'Ao ', 'Piao ', 'Yi ', 'Lian ', 'Qu ', '[?] ', 'Lin ', 'Pen ', 'Qiao ', 'Ao ', 'Fan ', 'Yi ', 'Hui ', 'Xuan ', 'Dao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x080.php b/vendor/voku/portable-ascii/src/voku/helper/data/x080.php
new file mode 100644
index 000000000..8548ed89d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x080.php
@@ -0,0 +1 @@
+<?php return ['Yao ', 'Lao ', '[?] ', 'Kao ', 'Mao ', 'Zhe ', 'Qi ', 'Gou ', 'Gou ', 'Gou ', 'Die ', 'Die ', 'Er ', 'Shua ', 'Ruan ', 'Er ', 'Nai ', 'Zhuan ', 'Lei ', 'Ting ', 'Zi ', 'Geng ', 'Chao ', 'Hao ', 'Yun ', 'Pa ', 'Pi ', 'Chi ', 'Si ', 'Chu ', 'Jia ', 'Ju ', 'He ', 'Chu ', 'Lao ', 'Lun ', 'Ji ', 'Tang ', 'Ou ', 'Lou ', 'Nou ', 'Gou ', 'Pang ', 'Ze ', 'Lou ', 'Ji ', 'Lao ', 'Huo ', 'You ', 'Mo ', 'Huai ', 'Er ', 'Zhe ', 'Ting ', 'Ye ', 'Da ', 'Song ', 'Qin ', 'Yun ', 'Chi ', 'Dan ', 'Dan ', 'Hong ', 'Geng ', 'Zhi ', '[?] ', 'Nie ', 'Dan ', 'Zhen ', 'Che ', 'Ling ', 'Zheng ', 'You ', 'Wa ', 'Liao ', 'Long ', 'Zhi ', 'Ning ', 'Tiao ', 'Er ', 'Ya ', 'Die ', 'Gua ', '[?] ', 'Lian ', 'Hao ', 'Sheng ', 'Lie ', 'Pin ', 'Jing ', 'Ju ', 'Bi ', 'Di ', 'Guo ', 'Wen ', 'Xu ', 'Ping ', 'Cong ', 'Shikato ', '[?] ', 'Ting ', 'Yu ', 'Cong ', 'Kui ', 'Tsuraneru ', 'Kui ', 'Cong ', 'Lian ', 'Weng ', 'Kui ', 'Lian ', 'Lian ', 'Cong ', 'Ao ', 'Sheng ', 'Song ', 'Ting ', 'Kui ', 'Nie ', 'Zhi ', 'Dan ', 'Ning ', 'Qie ', 'Ji ', 'Ting ', 'Ting ', 'Long ', 'Yu ', 'Yu ', 'Zhao ', 'Si ', 'Su ', 'Yi ', 'Su ', 'Si ', 'Zhao ', 'Zhao ', 'Rou ', 'Yi ', 'Le ', 'Ji ', 'Qiu ', 'Ken ', 'Cao ', 'Ge ', 'Di ', 'Huan ', 'Huang ', 'Yi ', 'Ren ', 'Xiao ', 'Ru ', 'Zhou ', 'Yuan ', 'Du ', 'Gang ', 'Rong ', 'Gan ', 'Cha ', 'Wo ', 'Chang ', 'Gu ', 'Zhi ', 'Han ', 'Fu ', 'Fei ', 'Fen ', 'Pei ', 'Pang ', 'Jian ', 'Fang ', 'Zhun ', 'You ', 'Na ', 'Hang ', 'Ken ', 'Ran ', 'Gong ', 'Yu ', 'Wen ', 'Yao ', 'Jin ', 'Pi ', 'Qian ', 'Xi ', 'Xi ', 'Fei ', 'Ken ', 'Jing ', 'Tai ', 'Shen ', 'Zhong ', 'Zhang ', 'Xie ', 'Shen ', 'Wei ', 'Zhou ', 'Die ', 'Dan ', 'Fei ', 'Ba ', 'Bo ', 'Qu ', 'Tian ', 'Bei ', 'Gua ', 'Tai ', 'Zi ', 'Ku ', 'Zhi ', 'Ni ', 'Ping ', 'Zi ', 'Fu ', 'Pang ', 'Zhen ', 'Xian ', 'Zuo ', 'Pei ', 'Jia ', 'Sheng ', 'Zhi ', 'Bao ', 'Mu ', 'Qu ', 'Hu ', 'Ke ', 'Yi ', 'Yin ', 'Xu ', 'Yang ', 'Long ', 'Dong ', 'Ka ', 'Lu ', 'Jing ', 'Nu ', 'Yan ', 'Pang ', 'Kua ', 'Yi ', 'Guang ', 'Gai ', 'Ge ', 'Dong ', 'Zhi ', 'Xiao ', 'Xiong ', 'Xiong ', 'Er ', 'E ', 'Xing ', 'Pian ', 'Neng ', 'Zi ', 'Gui '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x081.php b/vendor/voku/portable-ascii/src/voku/helper/data/x081.php
new file mode 100644
index 000000000..daab08c15
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x081.php
@@ -0,0 +1 @@
+<?php return ['Cheng ', 'Tiao ', 'Zhi ', 'Cui ', 'Mei ', 'Xie ', 'Cui ', 'Xie ', 'Mo ', 'Mai ', 'Ji ', 'Obiyaakasu ', '[?] ', 'Kuai ', 'Sa ', 'Zang ', 'Qi ', 'Nao ', 'Mi ', 'Nong ', 'Luan ', 'Wan ', 'Bo ', 'Wen ', 'Guan ', 'Qiu ', 'Jiao ', 'Jing ', 'Rou ', 'Heng ', 'Cuo ', 'Lie ', 'Shan ', 'Ting ', 'Mei ', 'Chun ', 'Shen ', 'Xie ', 'De ', 'Zui ', 'Cu ', 'Xiu ', 'Xin ', 'Tuo ', 'Pao ', 'Cheng ', 'Nei ', 'Fu ', 'Dou ', 'Tuo ', 'Niao ', 'Noy ', 'Pi ', 'Gu ', 'Gua ', 'Li ', 'Lian ', 'Zhang ', 'Cui ', 'Jie ', 'Liang ', 'Zhou ', 'Pi ', 'Biao ', 'Lun ', 'Pian ', 'Guo ', 'Kui ', 'Chui ', 'Dan ', 'Tian ', 'Nei ', 'Jing ', 'Jie ', 'La ', 'Yi ', 'An ', 'Ren ', 'Shen ', 'Chuo ', 'Fu ', 'Fu ', 'Ju ', 'Fei ', 'Qiang ', 'Wan ', 'Dong ', 'Pi ', 'Guo ', 'Zong ', 'Ding ', 'Wu ', 'Mei ', 'Ruan ', 'Zhuan ', 'Zhi ', 'Cou ', 'Gua ', 'Ou ', 'Di ', 'An ', 'Xing ', 'Nao ', 'Yu ', 'Chuan ', 'Nan ', 'Yun ', 'Zhong ', 'Rou ', 'E ', 'Sai ', 'Tu ', 'Yao ', 'Jian ', 'Wei ', 'Jiao ', 'Yu ', 'Jia ', 'Duan ', 'Bi ', 'Chang ', 'Fu ', 'Xian ', 'Ni ', 'Mian ', 'Wa ', 'Teng ', 'Tui ', 'Bang ', 'Qian ', 'Lu ', 'Wa ', 'Sou ', 'Tang ', 'Su ', 'Zhui ', 'Ge ', 'Yi ', 'Bo ', 'Liao ', 'Ji ', 'Pi ', 'Xie ', 'Gao ', 'Lu ', 'Bin ', 'Ou ', 'Chang ', 'Lu ', 'Guo ', 'Pang ', 'Chuai ', 'Piao ', 'Jiang ', 'Fu ', 'Tang ', 'Mo ', 'Xi ', 'Zhuan ', 'Lu ', 'Jiao ', 'Ying ', 'Lu ', 'Zhi ', 'Tara ', 'Chun ', 'Lian ', 'Tong ', 'Peng ', 'Ni ', 'Zha ', 'Liao ', 'Cui ', 'Gui ', 'Xiao ', 'Teng ', 'Fan ', 'Zhi ', 'Jiao ', 'Shan ', 'Wu ', 'Cui ', 'Run ', 'Xiang ', 'Sui ', 'Fen ', 'Ying ', 'Tan ', 'Zhua ', 'Dan ', 'Kuai ', 'Nong ', 'Tun ', 'Lian ', 'Bi ', 'Yong ', 'Jue ', 'Chu ', 'Yi ', 'Juan ', 'La ', 'Lian ', 'Sao ', 'Tun ', 'Gu ', 'Qi ', 'Cui ', 'Bin ', 'Xun ', 'Ru ', 'Huo ', 'Zang ', 'Xian ', 'Biao ', 'Xing ', 'Kuan ', 'La ', 'Yan ', 'Lu ', 'Huo ', 'Zang ', 'Luo ', 'Qu ', 'Zang ', 'Luan ', 'Ni ', 'Zang ', 'Chen ', 'Qian ', 'Wo ', 'Guang ', 'Zang ', 'Lin ', 'Guang ', 'Zi ', 'Jiao ', 'Nie ', 'Chou ', 'Ji ', 'Gao ', 'Chou ', 'Mian ', 'Nie ', 'Zhi ', 'Zhi ', 'Ge ', 'Jian ', 'Die ', 'Zhi ', 'Xiu ', 'Tai ', 'Zhen ', 'Jiu ', 'Xian ', 'Yu ', 'Cha '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x082.php b/vendor/voku/portable-ascii/src/voku/helper/data/x082.php
new file mode 100644
index 000000000..2ac228991
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x082.php
@@ -0,0 +1 @@
+<?php return ['Yao ', 'Yu ', 'Chong ', 'Xi ', 'Xi ', 'Jiu ', 'Yu ', 'Yu ', 'Xing ', 'Ju ', 'Jiu ', 'Xin ', 'She ', 'She ', 'Yadoru ', 'Jiu ', 'Shi ', 'Tan ', 'Shu ', 'Shi ', 'Tian ', 'Dan ', 'Pu ', 'Pu ', 'Guan ', 'Hua ', 'Tan ', 'Chuan ', 'Shun ', 'Xia ', 'Wu ', 'Zhou ', 'Dao ', 'Gang ', 'Shan ', 'Yi ', '[?] ', 'Pa ', 'Tai ', 'Fan ', 'Ban ', 'Chuan ', 'Hang ', 'Fang ', 'Ban ', 'Que ', 'Hesaki ', 'Zhong ', 'Jian ', 'Cang ', 'Ling ', 'Zhu ', 'Ze ', 'Duo ', 'Bo ', 'Xian ', 'Ge ', 'Chuan ', 'Jia ', 'Lu ', 'Hong ', 'Pang ', 'Xi ', '[?] ', 'Fu ', 'Zao ', 'Feng ', 'Li ', 'Shao ', 'Yu ', 'Lang ', 'Ting ', '[?] ', 'Wei ', 'Bo ', 'Meng ', 'Nian ', 'Ju ', 'Huang ', 'Shou ', 'Zong ', 'Bian ', 'Mao ', 'Die ', '[?] ', 'Bang ', 'Cha ', 'Yi ', 'Sao ', 'Cang ', 'Cao ', 'Lou ', 'Dai ', 'Sori ', 'Yao ', 'Tong ', 'Yofune ', 'Dang ', 'Tan ', 'Lu ', 'Yi ', 'Jie ', 'Jian ', 'Huo ', 'Meng ', 'Qi ', 'Lu ', 'Lu ', 'Chan ', 'Shuang ', 'Gen ', 'Liang ', 'Jian ', 'Jian ', 'Se ', 'Yan ', 'Fu ', 'Ping ', 'Yan ', 'Yan ', 'Cao ', 'Cao ', 'Yi ', 'Le ', 'Ting ', 'Qiu ', 'Ai ', 'Nai ', 'Tiao ', 'Jiao ', 'Jie ', 'Peng ', 'Wan ', 'Yi ', 'Chai ', 'Mian ', 'Mie ', 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Shuo ', 'Qiong ', 'Tu ', 'Xia ', 'Qi ', 'Mang ', 'Zi ', 'Hui ', 'Sui ', 'Zhi ', 'Xiang ', 'Bi ', 'Fu ', 'Tun ', 'Wei ', 'Wu ', 'Zhi ', 'Qi ', 'Shan ', 'Wen ', 'Qian ', 'Ren ', 'Fou ', 'Kou ', 'Jie ', 'Lu ', 'Xu ', 'Ji ', 'Qin ', 'Qi ', 'Yuan ', 'Fen ', 'Ba ', 'Rui ', 'Xin ', 'Ji ', 'Hua ', 'Hua ', 'Fang ', 'Wu ', 'Jue ', 'Gou ', 'Zhi ', 'Yun ', 'Qin ', 'Ao ', 'Chu ', 'Mao ', 'Ya ', 'Fei ', 'Reng ', 'Hang ', 'Cong ', 'Yin ', 'You ', 'Bian ', 'Yi ', 'Susa ', 'Wei ', 'Li ', 'Pi ', 'E ', 'Xian ', 'Chang ', 'Cang ', 'Meng ', 'Su ', 'Yi ', 'Yuan ', 'Ran ', 'Ling ', 'Tai ', 'Tiao ', 'Di ', 'Miao ', 'Qiong ', 'Li ', 'Yong ', 'Ke ', 'Mu ', 'Pei ', 'Bao ', 'Gou ', 'Min ', 'Yi ', 'Yi ', 'Ju ', 'Pi ', 'Ruo ', 'Ku ', 'Zhu ', 'Ni ', 'Bo ', 'Bing ', 'Shan ', 'Qiu ', 'Yao ', 'Xian ', 'Ben ', 'Hong ', 'Ying ', 'Zha ', 'Dong ', 'Ju ', 'Die ', 'Nie ', 'Gan ', 'Hu ', 'Ping ', 'Mei ', 'Fu ', 'Sheng ', 'Gu ', 'Bi ', 'Wei '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x083.php b/vendor/voku/portable-ascii/src/voku/helper/data/x083.php
new file mode 100644
index 000000000..747d5877c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x083.php
@@ -0,0 +1 @@
+<?php return ['Fu ', 'Zhuo ', 'Mao ', 'Fan ', 'Qie ', 'Mao ', 'Mao ', 'Ba ', 'Zi ', 'Mo ', 'Zi ', 'Di ', 'Chi ', 'Ji ', 'Jing ', 'Long ', '[?] ', 'Niao ', '[?] ', 'Xue ', 'Ying ', 'Qiong ', 'Ge ', 'Ming ', 'Li ', 'Rong ', 'Yin ', 'Gen ', 'Qian ', 'Chai ', 'Chen ', 'Yu ', 'Xiu ', 'Zi ', 'Lie ', 'Wu ', 'Ji ', 'Kui ', 'Ce ', 'Chong ', 'Ci ', 'Gou ', 'Guang ', 'Mang ', 'Chi ', 'Jiao ', 'Jiao ', 'Fu ', 'Yu ', 'Zhu ', 'Zi ', 'Jiang ', 'Hui ', 'Yin ', 'Cha ', 'Fa ', 'Rong ', 'Ru ', 'Chong ', 'Mang ', 'Tong ', 'Zhong ', '[?] ', 'Zhu ', 'Xun ', 'Huan ', 'Kua ', 'Quan ', 'Gai ', 'Da ', 'Jing ', 'Xing ', 'Quan ', 'Cao ', 'Jing ', 'Er ', 'An ', 'Shou ', 'Chi ', 'Ren ', 'Jian ', 'Ti ', 'Huang ', 'Ping ', 'Li ', 'Jin ', 'Lao ', 'Shu ', 'Zhuang ', 'Da ', 'Jia ', 'Rao ', 'Bi ', 'Ze ', 'Qiao ', 'Hui ', 'Qi ', 'Dang ', '[?] ', 'Rong ', 'Hun ', 'Ying ', 'Luo ', 'Ying ', 'Xun ', 'Jin ', 'Sun ', 'Yin ', 'Mai ', 'Hong ', 'Zhou ', 'Yao ', 'Du ', 'Wei ', 'Chu ', 'Dou ', 'Fu ', 'Ren ', 'Yin ', 'He ', 'Bi ', 'Bu ', 'Yun ', 'Di ', 'Tu ', 'Sui ', 'Sui ', 'Cheng ', 'Chen ', 'Wu ', 'Bie ', 'Xi ', 'Geng ', 'Li ', 'Fu ', 'Zhu ', 'Mo ', 'Li ', 'Zhuang ', 'Ji ', 'Duo ', 'Qiu ', 'Sha ', 'Suo ', 'Chen ', 'Feng ', 'Ju ', 'Mei ', 'Meng ', 'Xing ', 'Jing ', 'Che ', 'Xin ', 'Jun ', 'Yan ', 'Ting ', 'Diao ', 'Cuo ', 'Wan ', 'Han ', 'You ', 'Cuo ', 'Jia ', 'Wang ', 'You ', 'Niu ', 'Shao ', 'Xian ', 'Lang ', 'Fu ', 'E ', 'Mo ', 'Wen ', 'Jie ', 'Nan ', 'Mu ', 'Kan ', 'Lai ', 'Lian ', 'Shi ', 'Wo ', 'Usagi ', 'Lian ', 'Huo ', 'You ', 'Ying ', 'Ying ', 'Nuc ', 'Chun ', 'Mang ', 'Mang ', 'Ci ', 'Wan ', 'Jing ', 'Di ', 'Qu ', 'Dong ', 'Jian ', 'Zou ', 'Gu ', 'La ', 'Lu ', 'Ju ', 'Wei ', 'Jun ', 'Nie ', 'Kun ', 'He ', 'Pu ', 'Zi ', 'Gao ', 'Guo ', 'Fu ', 'Lun ', 'Chang ', 'Chou ', 'Song ', 'Chui ', 'Zhan ', 'Men ', 'Cai ', 'Ba ', 'Li ', 'Tu ', 'Bo ', 'Han ', 'Bao ', 'Qin ', 'Juan ', 'Xi ', 'Qin ', 'Di ', 'Jie ', 'Pu ', 'Dang ', 'Jin ', 'Zhao ', 'Tai ', 'Geng ', 'Hua ', 'Gu ', 'Ling ', 'Fei ', 'Jin ', 'An ', 'Wang ', 'Beng ', 'Zhou ', 'Yan ', 'Ju ', 'Jian ', 'Lin ', 'Tan ', 'Shu ', 'Tian ', 'Dao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x084.php b/vendor/voku/portable-ascii/src/voku/helper/data/x084.php
new file mode 100644
index 000000000..7fd10559b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x084.php
@@ -0,0 +1 @@
+<?php return ['Hu ', 'Qi ', 'He ', 'Cui ', 'Tao ', 'Chun ', 'Bei ', 'Chang ', 'Huan ', 'Fei ', 'Lai ', 'Qi ', 'Meng ', 'Ping ', 'Wei ', 'Dan ', 'Sha ', 'Huan ', 'Yan ', 'Yi ', 'Tiao ', 'Qi ', 'Wan ', 'Ce ', 'Nai ', 'Kutabireru ', 'Tuo ', 'Jiu ', 'Tie ', 'Luo ', '[?] ', '[?] ', 'Meng ', '[?] ', 'Yaji ', '[?] ', 'Ying ', 'Ying ', 'Ying ', 'Xiao ', 'Sa ', 'Qiu ', 'Ke ', 'Xiang ', 'Wan ', 'Yu ', 'Yu ', 'Fu ', 'Lian ', 'Xuan ', 'Yuan ', 'Nan ', 'Ze ', 'Wo ', 'Chun ', 'Xiao ', 'Yu ', 'Pian ', 'Mao ', 'An ', 'E ', 'Luo ', 'Ying ', 'Huo ', 'Gua ', 'Jiang ', 'Mian ', 'Zuo ', 'Zuo ', 'Ju ', 'Bao ', 'Rou ', 'Xi ', 'Xie ', 'An ', 'Qu ', 'Jian ', 'Fu ', 'Lu ', 'Jing ', 'Pen ', 'Feng ', 'Hong ', 'Hong ', 'Hou ', 'Yan ', 'Tu ', 'Zhu ', 'Zi ', 'Xiang ', 'Shen ', 'Ge ', 'Jie ', 'Jing ', 'Mi ', 'Huang ', 'Shen ', 'Pu ', 'Gai ', 'Dong ', 'Zhou ', 'Qian ', 'Wei ', 'Bo ', 'Wei ', 'Pa ', 'Ji ', 'Hu ', 'Zang ', 'Jia ', 'Duan ', 'Yao ', 'Jun ', 'Cong ', 'Quan ', 'Wei ', 'Xian ', 'Kui ', 'Ting ', 'Hun ', 'Xi ', 'Shi ', 'Qi ', 'Lan ', 'Zong ', 'Yao ', 'Yuan ', 'Mei ', 'Yun ', 'Shu ', 'Di ', 'Zhuan ', 'Guan ', 'Sukumo ', 'Xue ', 'Chan ', 'Kai ', 'Kui ', '[?] ', 'Jiang ', 'Lou ', 'Wei ', 'Pai ', '[?] ', 'Sou ', 'Yin ', 'Shi ', 'Chun ', 'Shi ', 'Yun ', 'Zhen ', 'Lang ', 'Nu ', 'Meng ', 'He ', 'Que ', 'Suan ', 'Yuan ', 'Li ', 'Ju ', 'Xi ', 'Pang ', 'Chu ', 'Xu ', 'Tu ', 'Liu ', 'Wo ', 'Zhen ', 'Qian ', 'Zu ', 'Po ', 'Cuo ', 'Yuan ', 'Chu ', 'Yu ', 'Kuai ', 'Pan ', 'Pu ', 'Pu ', 'Na ', 'Shuo ', 'Xi ', 'Fen ', 'Yun ', 'Zheng ', 'Jian ', 'Ji ', 'Ruo ', 'Cang ', 'En ', 'Mi ', 'Hao ', 'Sun ', 'Zhen ', 'Ming ', 'Sou ', 'Xu ', 'Liu ', 'Xi ', 'Gu ', 'Lang ', 'Rong ', 'Weng ', 'Gai ', 'Cuo ', 'Shi ', 'Tang ', 'Luo ', 'Ru ', 'Suo ', 'Xian ', 'Bei ', 'Yao ', 'Gui ', 'Bi ', 'Zong ', 'Gun ', 'Za ', 'Xiu ', 'Ce ', 'Hai ', 'Lan ', '[?] ', 'Ji ', 'Li ', 'Can ', 'Lang ', 'Yu ', '[?] ', 'Ying ', 'Mo ', 'Diao ', 'Tiao ', 'Mao ', 'Tong ', 'Zhu ', 'Peng ', 'An ', 'Lian ', 'Cong ', 'Xi ', 'Ping ', 'Qiu ', 'Jin ', 'Chun ', 'Jie ', 'Wei ', 'Tui ', 'Cao ', 'Yu ', 'Yi ', 'Ji ', 'Liao ', 'Bi ', 'Lu ', 'Su '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x085.php b/vendor/voku/portable-ascii/src/voku/helper/data/x085.php
new file mode 100644
index 000000000..46459eb62
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x085.php
@@ -0,0 +1 @@
+<?php return ['Bu ', 'Zhang ', 'Luo ', 'Jiang ', 'Man ', 'Yan ', 'Ling ', 'Ji ', 'Piao ', 'Gun ', 'Han ', 'Di ', 'Su ', 'Lu ', 'She ', 'Shang ', 'Di ', 'Mie ', 'Xun ', 'Man ', 'Bo ', 'Di ', 'Cuo ', 'Zhe ', 'Sen ', 'Xuan ', 'Wei ', 'Hu ', 'Ao ', 'Mi ', 'Lou ', 'Cu ', 'Zhong ', 'Cai ', 'Po ', 'Jiang ', 'Mi ', 'Cong ', 'Niao ', 'Hui ', 'Jun ', 'Yin ', 'Jian ', 'Yan ', 'Shu ', 'Yin ', 'Kui ', 'Chen ', 'Hu ', 'Sha ', 'Kou ', 'Qian ', 'Ma ', 'Zang ', 'Sonoko ', 'Qiang ', 'Dou ', 'Lian ', 'Lin ', 'Kou ', 'Ai ', 'Bi ', 'Li ', 'Wei ', 'Ji ', 'Xun ', 'Sheng ', 'Fan ', 'Meng ', 'Ou ', 'Chan ', 'Dian ', 'Xun ', 'Jiao ', 'Rui ', 'Rui ', 'Lei ', 'Yu ', 'Qiao ', 'Chu ', 'Hua ', 'Jian ', 'Mai ', 'Yun ', 'Bao ', 'You ', 'Qu ', 'Lu ', 'Rao ', 'Hui ', 'E ', 'Teng ', 'Fei ', 'Jue ', 'Zui ', 'Fa ', 'Ru ', 'Fen ', 'Kui ', 'Shun ', 'Rui ', 'Ya ', 'Xu ', 'Fu ', 'Jue ', 'Dang ', 'Wu ', 'Tong ', 'Si ', 'Xiao ', 'Xi ', 'Long ', 'Yun ', '[?] ', 'Qi ', 'Jian ', 'Yun ', 'Sun ', 'Ling ', 'Yu ', 'Xia ', 'Yong ', 'Ji ', 'Hong ', 'Si ', 'Nong ', 'Lei ', 'Xuan ', 'Yun ', 'Yu ', 'Xi ', 'Hao ', 'Bo ', 'Hao ', 'Ai ', 'Wei ', 'Hui ', 'Wei ', 'Ji ', 'Ci ', 'Xiang ', 'Luan ', 'Mie ', 'Yi ', 'Leng ', 'Jiang ', 'Can ', 'Shen ', 'Qiang ', 'Lian ', 'Ke ', 'Yuan ', 'Da ', 'Ti ', 'Tang ', 'Xie ', 'Bi ', 'Zhan ', 'Sun ', 'Lian ', 'Fan ', 'Ding ', 'Jie ', 'Gu ', 'Xie ', 'Shu ', 'Jian ', 'Kao ', 'Hong ', 'Sa ', 'Xin ', 'Xun ', 'Yao ', 'Hie ', 'Sou ', 'Shu ', 'Xun ', 'Dui ', 'Pin ', 'Wei ', 'Neng ', 'Chou ', 'Mai ', 'Ru ', 'Piao ', 'Tai ', 'Qi ', 'Zao ', 'Chen ', 'Zhen ', 'Er ', 'Ni ', 'Ying ', 'Gao ', 'Cong ', 'Xiao ', 'Qi ', 'Fa ', 'Jian ', 'Xu ', 'Kui ', 'Jie ', 'Bian ', 'Diao ', 'Mi ', 'Lan ', 'Jin ', 'Cang ', 'Miao ', 'Qiong ', 'Qie ', 'Xian ', '[?] ', 'Ou ', 'Xian ', 'Su ', 'Lu ', 'Yi ', 'Xu ', 'Xie ', 'Li ', 'Yi ', 'La ', 'Lei ', 'Xiao ', 'Di ', 'Zhi ', 'Bei ', 'Teng ', 'Yao ', 'Mo ', 'Huan ', 'Piao ', 'Fan ', 'Sou ', 'Tan ', 'Tui ', 'Qiong ', 'Qiao ', 'Wei ', 'Liu ', 'Hui ', '[?] ', 'Gao ', 'Yun ', '[?] ', 'Li ', 'Shu ', 'Chu ', 'Ai ', 'Lin ', 'Zao ', 'Xuan ', 'Chen ', 'Lai ', 'Huo '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x086.php b/vendor/voku/portable-ascii/src/voku/helper/data/x086.php
new file mode 100644
index 000000000..159aa5c30
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x086.php
@@ -0,0 +1 @@
+<?php return ['Tuo ', 'Wu ', 'Rui ', 'Rui ', 'Qi ', 'Heng ', 'Lu ', 'Su ', 'Tui ', 'Mang ', 'Yun ', 'Pin ', 'Yu ', 'Xun ', 'Ji ', 'Jiong ', 'Xian ', 'Mo ', 'Hagi ', 'Su ', 'Jiong ', '[?] ', 'Nie ', 'Bo ', 'Rang ', 'Yi ', 'Xian ', 'Yu ', 'Ju ', 'Lian ', 'Lian ', 'Yin ', 'Qiang ', 'Ying ', 'Long ', 'Tong ', 'Wei ', 'Yue ', 'Ling ', 'Qu ', 'Yao ', 'Fan ', 'Mi ', 'Lan ', 'Kui ', 'Lan ', 'Ji ', 'Dang ', 'Katsura ', 'Lei ', 'Lei ', 'Hua ', 'Feng ', 'Zhi ', 'Wei ', 'Kui ', 'Zhan ', 'Huai ', 'Li ', 'Ji ', 'Mi ', 'Lei ', 'Huai ', 'Luo ', 'Ji ', 'Kui ', 'Lu ', 'Jian ', 'San ', '[?] ', 'Lei ', 'Quan ', 'Xiao ', 'Yi ', 'Luan ', 'Men ', 'Bie ', 'Hu ', 'Hu ', 'Lu ', 'Nue ', 'Lu ', 'Si ', 'Xiao ', 'Qian ', 'Chu ', 'Hu ', 'Xu ', 'Cuo ', 'Fu ', 'Xu ', 'Xu ', 'Lu ', 'Hu ', 'Yu ', 'Hao ', 'Jiao ', 'Ju ', 'Guo ', 'Bao ', 'Yan ', 'Zhan ', 'Zhan ', 'Kui ', 'Ban ', 'Xi ', 'Shu ', 'Chong ', 'Qiu ', 'Diao ', 'Ji ', 'Qiu ', 'Cheng ', 'Shi ', '[?] ', 'Di ', 'Zhe ', 'She ', 'Yu ', 'Gan ', 'Zi ', 'Hong ', 'Hui ', 'Meng ', 'Ge ', 'Sui ', 'Xia ', 'Chai ', 'Shi ', 'Yi ', 'Ma ', 'Xiang ', 'Fang ', 'E ', 'Pa ', 'Chi ', 'Qian ', 'Wen ', 'Wen ', 'Rui ', 'Bang ', 'Bi ', 'Yue ', 'Yue ', 'Jun ', 'Qi ', 'Ran ', 'Yin ', 'Qi ', 'Tian ', 'Yuan ', 'Jue ', 'Hui ', 'Qin ', 'Qi ', 'Zhong ', 'Ya ', 'Ci ', 'Mu ', 'Wang ', 'Fen ', 'Fen ', 'Hang ', 'Gong ', 'Zao ', 'Fu ', 'Ran ', 'Jie ', 'Fu ', 'Chi ', 'Dou ', 'Piao ', 'Xian ', 'Ni ', 'Te ', 'Qiu ', 'You ', 'Zha ', 'Ping ', 'Chi ', 'You ', 'He ', 'Han ', 'Ju ', 'Li ', 'Fu ', 'Ran ', 'Zha ', 'Gou ', 'Pi ', 'Bo ', 'Xian ', 'Zhu ', 'Diao ', 'Bie ', 'Bing ', 'Gu ', 'Ran ', 'Qu ', 'She ', 'Tie ', 'Ling ', 'Gu ', 'Dan ', 'Gu ', 'Ying ', 'Li ', 'Cheng ', 'Qu ', 'Mou ', 'Ge ', 'Ci ', 'Hui ', 'Hui ', 'Mang ', 'Fu ', 'Yang ', 'Wa ', 'Lie ', 'Zhu ', 'Yi ', 'Xian ', 'Kuo ', 'Jiao ', 'Li ', 'Yi ', 'Ping ', 'Ji ', 'Ha ', 'She ', 'Yi ', 'Wang ', 'Mo ', 'Qiong ', 'Qie ', 'Gui ', 'Gong ', 'Zhi ', 'Man ', 'Ebi ', 'Zhi ', 'Jia ', 'Rao ', 'Si ', 'Qi ', 'Xing ', 'Lie ', 'Qiu ', 'Shao ', 'Yong ', 'Jia ', 'Shui ', 'Che ', 'Bai ', 'E ', 'Han '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x087.php b/vendor/voku/portable-ascii/src/voku/helper/data/x087.php
new file mode 100644
index 000000000..810bbbda7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x087.php
@@ -0,0 +1 @@
+<?php return ['Shu ', 'Xuan ', 'Feng ', 'Shen ', 'Zhen ', 'Fu ', 'Xian ', 'Zhe ', 'Wu ', 'Fu ', 'Li ', 'Lang ', 'Bi ', 'Chu ', 'Yuan ', 'You ', 'Jie ', 'Dan ', 'Yan ', 'Ting ', 'Dian ', 'Shui ', 'Hui ', 'Gua ', 'Zhi ', 'Song ', 'Fei ', 'Ju ', 'Mi ', 'Qi ', 'Qi ', 'Yu ', 'Jun ', 'Zha ', 'Meng ', 'Qiang ', 'Si ', 'Xi ', 'Lun ', 'Li ', 'Die ', 'Tiao ', 'Tao ', 'Kun ', 'Gan ', 'Han ', 'Yu ', 'Bang ', 'Fei ', 'Pi ', 'Wei ', 'Dun ', 'Yi ', 'Yuan ', 'Su ', 'Quan ', 'Qian ', 'Rui ', 'Ni ', 'Qing ', 'Wei ', 'Liang ', 'Guo ', 'Wan ', 'Dong ', 'E ', 'Ban ', 'Di ', 'Wang ', 'Can ', 'Yang ', 'Ying ', 'Guo ', 'Chan ', '[?] ', 'La ', 'Ke ', 'Ji ', 'He ', 'Ting ', 'Mai ', 'Xu ', 'Mian ', 'Yu ', 'Jie ', 'Shi ', 'Xuan ', 'Huang ', 'Yan ', 'Bian ', 'Rou ', 'Wei ', 'Fu ', 'Yuan ', 'Mei ', 'Wei ', 'Fu ', 'Ruan ', 'Xie ', 'You ', 'Qiu ', 'Mao ', 'Xia ', 'Ying ', 'Shi ', 'Chong ', 'Tang ', 'Zhu ', 'Zong ', 'Ti ', 'Fu ', 'Yuan ', 'Hui ', 'Meng ', 'La ', 'Du ', 'Hu ', 'Qiu ', 'Die ', 'Li ', 'Gua ', 'Yun ', 'Ju ', 'Nan ', 'Lou ', 'Qun ', 'Rong ', 'Ying ', 'Jiang ', '[?] ', 'Lang ', 'Pang ', 'Si ', 'Xi ', 'Ci ', 'Xi ', 'Yuan ', 'Weng ', 'Lian ', 'Sou ', 'Ban ', 'Rong ', 'Rong ', 'Ji ', 'Wu ', 'Qiu ', 'Han ', 'Qin ', 'Yi ', 'Bi ', 'Hua ', 'Tang ', 'Yi ', 'Du ', 'Nai ', 'He ', 'Hu ', 'Hui ', 'Ma ', 'Ming ', 'Yi ', 'Wen ', 'Ying ', 'Teng ', 'Yu ', 'Cang ', 'So ', 'Ebi ', 'Man ', '[?] ', 'Shang ', 'Zhe ', 'Cao ', 'Chi ', 'Di ', 'Ao ', 'Lu ', 'Wei ', 'Zhi ', 'Tang ', 'Chen ', 'Piao ', 'Qu ', 'Pi ', 'Yu ', 'Jian ', 'Luo ', 'Lou ', 'Qin ', 'Zhong ', 'Yin ', 'Jiang ', 'Shuai ', 'Wen ', 'Jiao ', 'Wan ', 'Zhi ', 'Zhe ', 'Ma ', 'Ma ', 'Guo ', 'Liu ', 'Mao ', 'Xi ', 'Cong ', 'Li ', 'Man ', 'Xiao ', 'Kamakiri ', 'Zhang ', 'Mang ', 'Xiang ', 'Mo ', 'Zui ', 'Si ', 'Qiu ', 'Te ', 'Zhi ', 'Peng ', 'Peng ', 'Jiao ', 'Qu ', 'Bie ', 'Liao ', 'Pan ', 'Gui ', 'Xi ', 'Ji ', 'Zhuan ', 'Huang ', 'Fei ', 'Lao ', 'Jue ', 'Jue ', 'Hui ', 'Yin ', 'Chan ', 'Jiao ', 'Shan ', 'Rao ', 'Xiao ', 'Mou ', 'Chong ', 'Xun ', 'Si ', '[?] ', 'Cheng ', 'Dang ', 'Li ', 'Xie ', 'Shan ', 'Yi ', 'Jing ', 'Da ', 'Chan ', 'Qi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x088.php b/vendor/voku/portable-ascii/src/voku/helper/data/x088.php
new file mode 100644
index 000000000..1dfa03296
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x088.php
@@ -0,0 +1 @@
+<?php return ['Ci ', 'Xiang ', 'She ', 'Luo ', 'Qin ', 'Ying ', 'Chai ', 'Li ', 'Ze ', 'Xuan ', 'Lian ', 'Zhu ', 'Ze ', 'Xie ', 'Mang ', 'Xie ', 'Qi ', 'Rong ', 'Jian ', 'Meng ', 'Hao ', 'Ruan ', 'Huo ', 'Zhuo ', 'Jie ', 'Bin ', 'He ', 'Mie ', 'Fan ', 'Lei ', 'Jie ', 'La ', 'Mi ', 'Li ', 'Chun ', 'Li ', 'Qiu ', 'Nie ', 'Lu ', 'Du ', 'Xiao ', 'Zhu ', 'Long ', 'Li ', 'Long ', 'Feng ', 'Ye ', 'Beng ', 'Shang ', 'Gu ', 'Juan ', 'Ying ', '[?] ', 'Xi ', 'Can ', 'Qu ', 'Quan ', 'Du ', 'Can ', 'Man ', 'Jue ', 'Jie ', 'Zhu ', 'Zha ', 'Xie ', 'Huang ', 'Niu ', 'Pei ', 'Nu ', 'Xin ', 'Zhong ', 'Mo ', 'Er ', 'Ke ', 'Mie ', 'Xi ', 'Xing ', 'Yan ', 'Kan ', 'Yuan ', '[?] ', 'Ling ', 'Xuan ', 'Shu ', 'Xian ', 'Tong ', 'Long ', 'Jie ', 'Xian ', 'Ya ', 'Hu ', 'Wei ', 'Dao ', 'Chong ', 'Wei ', 'Dao ', 'Zhun ', 'Heng ', 'Qu ', 'Yi ', 'Yi ', 'Bu ', 'Gan ', 'Yu ', 'Biao ', 'Cha ', 'Yi ', 'Shan ', 'Chen ', 'Fu ', 'Gun ', 'Fen ', 'Shuai ', 'Jie ', 'Na ', 'Zhong ', 'Dan ', 'Ri ', 'Zhong ', 'Zhong ', 'Xie ', 'Qi ', 'Xie ', 'Ran ', 'Zhi ', 'Ren ', 'Qin ', 'Jin ', 'Jun ', 'Yuan ', 'Mei ', 'Chai ', 'Ao ', 'Niao ', 'Hui ', 'Ran ', 'Jia ', 'Tuo ', 'Ling ', 'Dai ', 'Bao ', 'Pao ', 'Yao ', 'Zuo ', 'Bi ', 'Shao ', 'Tan ', 'Ju ', 'He ', 'Shu ', 'Xiu ', 'Zhen ', 'Yi ', 'Pa ', 'Bo ', 'Di ', 'Wa ', 'Fu ', 'Gun ', 'Zhi ', 'Zhi ', 'Ran ', 'Pan ', 'Yi ', 'Mao ', 'Tuo ', 'Na ', 'Kou ', 'Xian ', 'Chan ', 'Qu ', 'Bei ', 'Gun ', 'Xi ', 'Ne ', 'Bo ', 'Horo ', 'Fu ', 'Yi ', 'Chi ', 'Ku ', 'Ren ', 'Jiang ', 'Jia ', 'Cun ', 'Mo ', 'Jie ', 'Er ', 'Luo ', 'Ru ', 'Zhu ', 'Gui ', 'Yin ', 'Cai ', 'Lie ', 'Kamishimo ', 'Yuki ', 'Zhuang ', 'Dang ', '[?] ', 'Kun ', 'Ken ', 'Niao ', 'Shu ', 'Jia ', 'Kun ', 'Cheng ', 'Li ', 'Juan ', 'Shen ', 'Pou ', 'Ge ', 'Yi ', 'Yu ', 'Zhen ', 'Liu ', 'Qiu ', 'Qun ', 'Ji ', 'Yi ', 'Bu ', 'Zhuang ', 'Shui ', 'Sha ', 'Qun ', 'Li ', 'Lian ', 'Lian ', 'Ku ', 'Jian ', 'Fou ', 'Chan ', 'Bi ', 'Gun ', 'Tao ', 'Yuan ', 'Ling ', 'Chi ', 'Chang ', 'Chou ', 'Duo ', 'Biao ', 'Liang ', 'Chang ', 'Pei ', 'Pei ', 'Fei ', 'Yuan ', 'Luo ', 'Guo ', 'Yan ', 'Du ', 'Xi ', 'Zhi ', 'Ju ', 'Qi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x089.php b/vendor/voku/portable-ascii/src/voku/helper/data/x089.php
new file mode 100644
index 000000000..5e2856d89
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x089.php
@@ -0,0 +1 @@
+<?php return ['Ji ', 'Zhi ', 'Gua ', 'Ken ', 'Che ', 'Ti ', 'Ti ', 'Fu ', 'Chong ', 'Xie ', 'Bian ', 'Die ', 'Kun ', 'Duan ', 'Xiu ', 'Xiu ', 'He ', 'Yuan ', 'Bao ', 'Bao ', 'Fu ', 'Yu ', 'Tuan ', 'Yan ', 'Hui ', 'Bei ', 'Chu ', 'Lu ', 'Ena ', 'Hitoe ', 'Yun ', 'Da ', 'Gou ', 'Da ', 'Huai ', 'Rong ', 'Yuan ', 'Ru ', 'Nai ', 'Jiong ', 'Suo ', 'Ban ', 'Tun ', 'Chi ', 'Sang ', 'Niao ', 'Ying ', 'Jie ', 'Qian ', 'Huai ', 'Ku ', 'Lian ', 'Bao ', 'Li ', 'Zhe ', 'Shi ', 'Lu ', 'Yi ', 'Die ', 'Xie ', 'Xian ', 'Wei ', 'Biao ', 'Cao ', 'Ji ', 'Jiang ', 'Sen ', 'Bao ', 'Xiang ', 'Chihaya ', 'Pu ', 'Jian ', 'Zhuan ', 'Jian ', 'Zui ', 'Ji ', 'Dan ', 'Za ', 'Fan ', 'Bo ', 'Xiang ', 'Xin ', 'Bie ', 'Rao ', 'Man ', 'Lan ', 'Ao ', 'Duo ', 'Gui ', 'Cao ', 'Sui ', 'Nong ', 'Chan ', 'Lian ', 'Bi ', 'Jin ', 'Dang ', 'Shu ', 'Tan ', 'Bi ', 'Lan ', 'Pu ', 'Ru ', 'Zhi ', '[?] ', 'Shu ', 'Wa ', 'Shi ', 'Bai ', 'Xie ', 'Bo ', 'Chen ', 'Lai ', 'Long ', 'Xi ', 'Xian ', 'Lan ', 'Zhe ', 'Dai ', 'Tasuki ', 'Zan ', 'Shi ', 'Jian ', 'Pan ', 'Yi ', 'Ran ', 'Ya ', 'Xi ', 'Xi ', 'Yao ', 'Feng ', 'Tan ', '[?] ', 'Biao ', 'Fu ', 'Ba ', 'He ', 'Ji ', 'Ji ', 'Jian ', 'Guan ', 'Bian ', 'Yan ', 'Gui ', 'Jue ', 'Pian ', 'Mao ', 'Mi ', 'Mi ', 'Mie ', 'Shi ', 'Si ', 'Zhan ', 'Luo ', 'Jue ', 'Mi ', 'Tiao ', 'Lian ', 'Yao ', 'Zhi ', 'Jun ', 'Xi ', 'Shan ', 'Wei ', 'Xi ', 'Tian ', 'Yu ', 'Lan ', 'E ', 'Du ', 'Qin ', 'Pang ', 'Ji ', 'Ming ', 'Ying ', 'Gou ', 'Qu ', 'Zhan ', 'Jin ', 'Guan ', 'Deng ', 'Jian ', 'Luo ', 'Qu ', 'Jian ', 'Wei ', 'Jue ', 'Qu ', 'Luo ', 'Lan ', 'Shen ', 'Di ', 'Guan ', 'Jian ', 'Guan ', 'Yan ', 'Gui ', 'Mi ', 'Shi ', 'Zhan ', 'Lan ', 'Jue ', 'Ji ', 'Xi ', 'Di ', 'Tian ', 'Yu ', 'Gou ', 'Jin ', 'Qu ', 'Jiao ', 'Jiu ', 'Jin ', 'Cu ', 'Jue ', 'Zhi ', 'Chao ', 'Ji ', 'Gu ', 'Dan ', 'Zui ', 'Di ', 'Shang ', 'Hua ', 'Quan ', 'Ge ', 'Chi ', 'Jie ', 'Gui ', 'Gong ', 'Hong ', 'Jie ', 'Hun ', 'Qiu ', 'Xing ', 'Su ', 'Ni ', 'Ji ', 'Lu ', 'Zhi ', 'Zha ', 'Bi ', 'Xing ', 'Hu ', 'Shang ', 'Gong ', 'Zhi ', 'Xue ', 'Chu ', 'Xi ', 'Yi ', 'Lu ', 'Jue ', 'Xi ', 'Yan ', 'Xi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php
new file mode 100644
index 000000000..826fd753b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php
@@ -0,0 +1 @@
+<?php return ['Yan ', 'Yan ', 'Ding ', 'Fu ', 'Qiu ', 'Qiu ', 'Jiao ', 'Hong ', 'Ji ', 'Fan ', 'Xun ', 'Diao ', 'Hong ', 'Cha ', 'Tao ', 'Xu ', 'Jie ', 'Yi ', 'Ren ', 'Xun ', 'Yin ', 'Shan ', 'Qi ', 'Tuo ', 'Ji ', 'Xun ', 'Yin ', 'E ', 'Fen ', 'Ya ', 'Yao ', 'Song ', 'Shen ', 'Yin ', 'Xin ', 'Jue ', 'Xiao ', 'Ne ', 'Chen ', 'You ', 'Zhi ', 'Xiong ', 'Fang ', 'Xin ', 'Chao ', 'She ', 'Xian ', 'Sha ', 'Tun ', 'Xu ', 'Yi ', 'Yi ', 'Su ', 'Chi ', 'He ', 'Shen ', 'He ', 'Xu ', 'Zhen ', 'Zhu ', 'Zheng ', 'Gou ', 'Zi ', 'Zi ', 'Zhan ', 'Gu ', 'Fu ', 'Quan ', 'Die ', 'Ling ', 'Di ', 'Yang ', 'Li ', 'Nao ', 'Pan ', 'Zhou ', 'Gan ', 'Yi ', 'Ju ', 'Ao ', 'Zha ', 'Tuo ', 'Yi ', 'Qu ', 'Zhao ', 'Ping ', 'Bi ', 'Xiong ', 'Qu ', 'Ba ', 'Da ', 'Zu ', 'Tao ', 'Zhu ', 'Ci ', 'Zhe ', 'Yong ', 'Xu ', 'Xun ', 'Yi ', 'Huang ', 'He ', 'Shi ', 'Cha ', 'Jiao ', 'Shi ', 'Hen ', 'Cha ', 'Gou ', 'Gui ', 'Quan ', 'Hui ', 'Jie ', 'Hua ', 'Gai ', 'Xiang ', 'Wei ', 'Shen ', 'Chou ', 'Tong ', 'Mi ', 'Zhan ', 'Ming ', 'E ', 'Hui ', 'Yan ', 'Xiong ', 'Gua ', 'Er ', 'Beng ', 'Tiao ', 'Chi ', 'Lei ', 'Zhu ', 'Kuang ', 'Kua ', 'Wu ', 'Yu ', 'Teng ', 'Ji ', 'Zhi ', 'Ren ', 'Su ', 'Lang ', 'E ', 'Kuang ', 'E ', 'Shi ', 'Ting ', 'Dan ', 'Bo ', 'Chan ', 'You ', 'Heng ', 'Qiao ', 'Qin ', 'Shua ', 'An ', 'Yu ', 'Xiao ', 'Cheng ', 'Jie ', 'Xian ', 'Wu ', 'Wu ', 'Gao ', 'Song ', 'Pu ', 'Hui ', 'Jing ', 'Shuo ', 'Zhen ', 'Shuo ', 'Du ', 'Yasashi ', 'Chang ', 'Shui ', 'Jie ', 'Ke ', 'Qu ', 'Cong ', 'Xiao ', 'Sui ', 'Wang ', 'Xuan ', 'Fei ', 'Chi ', 'Ta ', 'Yi ', 'Na ', 'Yin ', 'Diao ', 'Pi ', 'Chuo ', 'Chan ', 'Chen ', 'Zhun ', 'Ji ', 'Qi ', 'Tan ', 'Zhui ', 'Wei ', 'Ju ', 'Qing ', 'Jian ', 'Zheng ', 'Ze ', 'Zou ', 'Qian ', 'Zhuo ', 'Liang ', 'Jian ', 'Zhu ', 'Hao ', 'Lun ', 'Shen ', 'Biao ', 'Huai ', 'Pian ', 'Yu ', 'Die ', 'Xu ', 'Pian ', 'Shi ', 'Xuan ', 'Shi ', 'Hun ', 'Hua ', 'E ', 'Zhong ', 'Di ', 'Xie ', 'Fu ', 'Pu ', 'Ting ', 'Jian ', 'Qi ', 'Yu ', 'Zi ', 'Chuan ', 'Xi ', 'Hui ', 'Yin ', 'An ', 'Xian ', 'Nan ', 'Chen ', 'Feng ', 'Zhu ', 'Yang ', 'Yan ', 'Heng ', 'Xuan ', 'Ge ', 'Nuo ', 'Qi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php
new file mode 100644
index 000000000..540258e10
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php
@@ -0,0 +1 @@
+<?php return ['Mou ', 'Ye ', 'Wei ', '[?] ', 'Teng ', 'Zou ', 'Shan ', 'Jian ', 'Bo ', 'Ku ', 'Huang ', 'Huo ', 'Ge ', 'Ying ', 'Mi ', 'Xiao ', 'Mi ', 'Xi ', 'Qiang ', 'Chen ', 'Nue ', 'Ti ', 'Su ', 'Bang ', 'Chi ', 'Qian ', 'Shi ', 'Jiang ', 'Yuan ', 'Xie ', 'Xue ', 'Tao ', 'Yao ', 'Yao ', '[?] ', 'Yu ', 'Biao ', 'Cong ', 'Qing ', 'Li ', 'Mo ', 'Mo ', 'Shang ', 'Zhe ', 'Miu ', 'Jian ', 'Ze ', 'Jie ', 'Lian ', 'Lou ', 'Can ', 'Ou ', 'Guan ', 'Xi ', 'Zhuo ', 'Ao ', 'Ao ', 'Jin ', 'Zhe ', 'Yi ', 'Hu ', 'Jiang ', 'Man ', 'Chao ', 'Han ', 'Hua ', 'Chan ', 'Xu ', 'Zeng ', 'Se ', 'Xi ', 'She ', 'Dui ', 'Zheng ', 'Nao ', 'Lan ', 'E ', 'Ying ', 'Jue ', 'Ji ', 'Zun ', 'Jiao ', 'Bo ', 'Hui ', 'Zhuan ', 'Mu ', 'Zen ', 'Zha ', 'Shi ', 'Qiao ', 'Tan ', 'Zen ', 'Pu ', 'Sheng ', 'Xuan ', 'Zao ', 'Tan ', 'Dang ', 'Sui ', 'Qian ', 'Ji ', 'Jiao ', 'Jing ', 'Lian ', 'Nou ', 'Yi ', 'Ai ', 'Zhan ', 'Pi ', 'Hui ', 'Hua ', 'Yi ', 'Yi ', 'Shan ', 'Rang ', 'Nou ', 'Qian ', 'Zhui ', 'Ta ', 'Hu ', 'Zhou ', 'Hao ', 'Ye ', 'Ying ', 'Jian ', 'Yu ', 'Jian ', 'Hui ', 'Du ', 'Zhe ', 'Xuan ', 'Zan ', 'Lei ', 'Shen ', 'Wei ', 'Chan ', 'Li ', 'Yi ', 'Bian ', 'Zhe ', 'Yan ', 'E ', 'Chou ', 'Wei ', 'Chou ', 'Yao ', 'Chan ', 'Rang ', 'Yin ', 'Lan ', 'Chen ', 'Huo ', 'Zhe ', 'Huan ', 'Zan ', 'Yi ', 'Dang ', 'Zhan ', 'Yan ', 'Du ', 'Yan ', 'Ji ', 'Ding ', 'Fu ', 'Ren ', 'Ji ', 'Jie ', 'Hong ', 'Tao ', 'Rang ', 'Shan ', 'Qi ', 'Tuo ', 'Xun ', 'Yi ', 'Xun ', 'Ji ', 'Ren ', 'Jiang ', 'Hui ', 'Ou ', 'Ju ', 'Ya ', 'Ne ', 'Xu ', 'E ', 'Lun ', 'Xiong ', 'Song ', 'Feng ', 'She ', 'Fang ', 'Jue ', 'Zheng ', 'Gu ', 'He ', 'Ping ', 'Zu ', 'Shi ', 'Xiong ', 'Zha ', 'Su ', 'Zhen ', 'Di ', 'Zou ', 'Ci ', 'Qu ', 'Zhao ', 'Bi ', 'Yi ', 'Yi ', 'Kuang ', 'Lei ', 'Shi ', 'Gua ', 'Shi ', 'Jie ', 'Hui ', 'Cheng ', 'Zhu ', 'Shen ', 'Hua ', 'Dan ', 'Gou ', 'Quan ', 'Gui ', 'Xun ', 'Yi ', 'Zheng ', 'Gai ', 'Xiang ', 'Cha ', 'Hun ', 'Xu ', 'Zhou ', 'Jie ', 'Wu ', 'Yu ', 'Qiao ', 'Wu ', 'Gao ', 'You ', 'Hui ', 'Kuang ', 'Shuo ', 'Song ', 'Ai ', 'Qing ', 'Zhu ', 'Zou ', 'Nuo ', 'Du ', 'Zhuo ', 'Fei ', 'Ke ', 'Wei '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php
new file mode 100644
index 000000000..1f4a849ff
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php
@@ -0,0 +1 @@
+<?php return ['Yu ', 'Shui ', 'Shen ', 'Diao ', 'Chan ', 'Liang ', 'Zhun ', 'Sui ', 'Tan ', 'Shen ', 'Yi ', 'Mou ', 'Chen ', 'Die ', 'Huang ', 'Jian ', 'Xie ', 'Nue ', 'Ye ', 'Wei ', 'E ', 'Yu ', 'Xuan ', 'Chan ', 'Zi ', 'An ', 'Yan ', 'Di ', 'Mi ', 'Pian ', 'Xu ', 'Mo ', 'Dang ', 'Su ', 'Xie ', 'Yao ', 'Bang ', 'Shi ', 'Qian ', 'Mi ', 'Jin ', 'Man ', 'Zhe ', 'Jian ', 'Miu ', 'Tan ', 'Zen ', 'Qiao ', 'Lan ', 'Pu ', 'Jue ', 'Yan ', 'Qian ', 'Zhan ', 'Chen ', 'Gu ', 'Qian ', 'Hong ', 'Xia ', 'Jue ', 'Hong ', 'Han ', 'Hong ', 'Xi ', 'Xi ', 'Huo ', 'Liao ', 'Han ', 'Du ', 'Long ', 'Dou ', 'Jiang ', 'Qi ', 'Shi ', 'Li ', 'Deng ', 'Wan ', 'Bi ', 'Shu ', 'Xian ', 'Feng ', 'Zhi ', 'Zhi ', 'Yan ', 'Yan ', 'Shi ', 'Chu ', 'Hui ', 'Tun ', 'Yi ', 'Tun ', 'Yi ', 'Jian ', 'Ba ', 'Hou ', 'E ', 'Cu ', 'Xiang ', 'Huan ', 'Jian ', 'Ken ', 'Gai ', 'Qu ', 'Fu ', 'Xi ', 'Bin ', 'Hao ', 'Yu ', 'Zhu ', 'Jia ', '[?] ', 'Xi ', 'Bo ', 'Wen ', 'Huan ', 'Bin ', 'Di ', 'Zong ', 'Fen ', 'Yi ', 'Zhi ', 'Bao ', 'Chai ', 'Han ', 'Pi ', 'Na ', 'Pi ', 'Gou ', 'Na ', 'You ', 'Diao ', 'Mo ', 'Si ', 'Xiu ', 'Huan ', 'Kun ', 'He ', 'He ', 'Mo ', 'Han ', 'Mao ', 'Li ', 'Ni ', 'Bi ', 'Yu ', 'Jia ', 'Tuan ', 'Mao ', 'Pi ', 'Xi ', 'E ', 'Ju ', 'Mo ', 'Chu ', 'Tan ', 'Huan ', 'Jue ', 'Bei ', 'Zhen ', 'Yuan ', 'Fu ', 'Cai ', 'Gong ', 'Te ', 'Yi ', 'Hang ', 'Wan ', 'Pin ', 'Huo ', 'Fan ', 'Tan ', 'Guan ', 'Ze ', 'Zhi ', 'Er ', 'Zhu ', 'Shi ', 'Bi ', 'Zi ', 'Er ', 'Gui ', 'Pian ', 'Bian ', 'Mai ', 'Dai ', 'Sheng ', 'Kuang ', 'Fei ', 'Tie ', 'Yi ', 'Chi ', 'Mao ', 'He ', 'Bi ', 'Lu ', 'Ren ', 'Hui ', 'Gai ', 'Pian ', 'Zi ', 'Jia ', 'Xu ', 'Zei ', 'Jiao ', 'Gai ', 'Zang ', 'Jian ', 'Ying ', 'Xun ', 'Zhen ', 'She ', 'Bin ', 'Bin ', 'Qiu ', 'She ', 'Chuan ', 'Zang ', 'Zhou ', 'Lai ', 'Zan ', 'Si ', 'Chen ', 'Shang ', 'Tian ', 'Pei ', 'Geng ', 'Xian ', 'Mai ', 'Jian ', 'Sui ', 'Fu ', 'Tan ', 'Cong ', 'Cong ', 'Zhi ', 'Ji ', 'Zhang ', 'Du ', 'Jin ', 'Xiong ', 'Shun ', 'Yun ', 'Bao ', 'Zai ', 'Lai ', 'Feng ', 'Cang ', 'Ji ', 'Sheng ', 'Ai ', 'Zhuan ', 'Fu ', 'Gou ', 'Sai ', 'Ze ', 'Liao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php
new file mode 100644
index 000000000..44b0c62cf
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php
@@ -0,0 +1 @@
+<?php return ['Wei ', 'Bai ', 'Chen ', 'Zhuan ', 'Zhi ', 'Zhui ', 'Biao ', 'Yun ', 'Zeng ', 'Tan ', 'Zan ', 'Yan ', '[?] ', 'Shan ', 'Wan ', 'Ying ', 'Jin ', 'Gan ', 'Xian ', 'Zang ', 'Bi ', 'Du ', 'Shu ', 'Yan ', '[?] ', 'Xuan ', 'Long ', 'Gan ', 'Zang ', 'Bei ', 'Zhen ', 'Fu ', 'Yuan ', 'Gong ', 'Cai ', 'Ze ', 'Xian ', 'Bai ', 'Zhang ', 'Huo ', 'Zhi ', 'Fan ', 'Tan ', 'Pin ', 'Bian ', 'Gou ', 'Zhu ', 'Guan ', 'Er ', 'Jian ', 'Bi ', 'Shi ', 'Tie ', 'Gui ', 'Kuang ', 'Dai ', 'Mao ', 'Fei ', 'He ', 'Yi ', 'Zei ', 'Zhi ', 'Jia ', 'Hui ', 'Zi ', 'Ren ', 'Lu ', 'Zang ', 'Zi ', 'Gai ', 'Jin ', 'Qiu ', 'Zhen ', 'Lai ', 'She ', 'Fu ', 'Du ', 'Ji ', 'Shu ', 'Shang ', 'Si ', 'Bi ', 'Zhou ', 'Geng ', 'Pei ', 'Tan ', 'Lai ', 'Feng ', 'Zhui ', 'Fu ', 'Zhuan ', 'Sai ', 'Ze ', 'Yan ', 'Zan ', 'Yun ', 'Zeng ', 'Shan ', 'Ying ', 'Gan ', 'Chi ', 'Xi ', 'She ', 'Nan ', 'Xiong ', 'Xi ', 'Cheng ', 'He ', 'Cheng ', 'Zhe ', 'Xia ', 'Tang ', 'Zou ', 'Zou ', 'Li ', 'Jiu ', 'Fu ', 'Zhao ', 'Gan ', 'Qi ', 'Shan ', 'Qiong ', 'Qin ', 'Xian ', 'Ci ', 'Jue ', 'Qin ', 'Chi ', 'Ci ', 'Chen ', 'Chen ', 'Die ', 'Ju ', 'Chao ', 'Di ', 'Se ', 'Zhan ', 'Zhu ', 'Yue ', 'Qu ', 'Jie ', 'Chi ', 'Chu ', 'Gua ', 'Xue ', 'Ci ', 'Tiao ', 'Duo ', 'Lie ', 'Gan ', 'Suo ', 'Cu ', 'Xi ', 'Zhao ', 'Su ', 'Yin ', 'Ju ', 'Jian ', 'Que ', 'Tang ', 'Chuo ', 'Cui ', 'Lu ', 'Qu ', 'Dang ', 'Qiu ', 'Zi ', 'Ti ', 'Qu ', 'Chi ', 'Huang ', 'Qiao ', 'Qiao ', 'Yao ', 'Zao ', 'Ti ', '[?] ', 'Zan ', 'Zan ', 'Zu ', 'Pa ', 'Bao ', 'Ku ', 'Ke ', 'Dun ', 'Jue ', 'Fu ', 'Chen ', 'Jian ', 'Fang ', 'Zhi ', 'Sa ', 'Yue ', 'Pa ', 'Qi ', 'Yue ', 'Qiang ', 'Tuo ', 'Tai ', 'Yi ', 'Nian ', 'Ling ', 'Mei ', 'Ba ', 'Die ', 'Ku ', 'Tuo ', 'Jia ', 'Ci ', 'Pao ', 'Qia ', 'Zhu ', 'Ju ', 'Die ', 'Zhi ', 'Fu ', 'Pan ', 'Ju ', 'Shan ', 'Bo ', 'Ni ', 'Ju ', 'Li ', 'Gen ', 'Yi ', 'Ji ', 'Dai ', 'Xian ', 'Jiao ', 'Duo ', 'Zhu ', 'Zhuan ', 'Kua ', 'Zhuai ', 'Gui ', 'Qiong ', 'Kui ', 'Xiang ', 'Chi ', 'Lu ', 'Beng ', 'Zhi ', 'Jia ', 'Tiao ', 'Cai ', 'Jian ', 'Ta ', 'Qiao ', 'Bi ', 'Xian ', 'Duo ', 'Ji ', 'Ju ', 'Ji ', 'Shu ', 'Tu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php
new file mode 100644
index 000000000..be82e7953
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php
@@ -0,0 +1 @@
+<?php return ['Chu ', 'Jing ', 'Nie ', 'Xiao ', 'Bo ', 'Chi ', 'Qun ', 'Mou ', 'Shu ', 'Lang ', 'Yong ', 'Jiao ', 'Chou ', 'Qiao ', '[?] ', 'Ta ', 'Jian ', 'Qi ', 'Wo ', 'Wei ', 'Zhuo ', 'Jie ', 'Ji ', 'Nie ', 'Ju ', 'Ju ', 'Lun ', 'Lu ', 'Leng ', 'Huai ', 'Ju ', 'Chi ', 'Wan ', 'Quan ', 'Ti ', 'Bo ', 'Zu ', 'Qie ', 'Ji ', 'Cu ', 'Zong ', 'Cai ', 'Zong ', 'Peng ', 'Zhi ', 'Zheng ', 'Dian ', 'Zhi ', 'Yu ', 'Duo ', 'Dun ', 'Chun ', 'Yong ', 'Zhong ', 'Di ', 'Zhe ', 'Chen ', 'Chuai ', 'Jian ', 'Gua ', 'Tang ', 'Ju ', 'Fu ', 'Zu ', 'Die ', 'Pian ', 'Rou ', 'Nuo ', 'Ti ', 'Cha ', 'Tui ', 'Jian ', 'Dao ', 'Cuo ', 'Xi ', 'Ta ', 'Qiang ', 'Zhan ', 'Dian ', 'Ti ', 'Ji ', 'Nie ', 'Man ', 'Liu ', 'Zhan ', 'Bi ', 'Chong ', 'Lu ', 'Liao ', 'Cu ', 'Tang ', 'Dai ', 'Suo ', 'Xi ', 'Kui ', 'Ji ', 'Zhi ', 'Qiang ', 'Di ', 'Man ', 'Zong ', 'Lian ', 'Beng ', 'Zao ', 'Nian ', 'Bie ', 'Tui ', 'Ju ', 'Deng ', 'Ceng ', 'Xian ', 'Fan ', 'Chu ', 'Zhong ', 'Dun ', 'Bo ', 'Cu ', 'Zu ', 'Jue ', 'Jue ', 'Lin ', 'Ta ', 'Qiao ', 'Qiao ', 'Pu ', 'Liao ', 'Dun ', 'Cuan ', 'Kuang ', 'Zao ', 'Ta ', 'Bi ', 'Bi ', 'Zhu ', 'Ju ', 'Chu ', 'Qiao ', 'Dun ', 'Chou ', 'Ji ', 'Wu ', 'Yue ', 'Nian ', 'Lin ', 'Lie ', 'Zhi ', 'Li ', 'Zhi ', 'Chan ', 'Chu ', 'Duan ', 'Wei ', 'Long ', 'Lin ', 'Xian ', 'Wei ', 'Zuan ', 'Lan ', 'Xie ', 'Rang ', 'Xie ', 'Nie ', 'Ta ', 'Qu ', 'Jie ', 'Cuan ', 'Zuan ', 'Xi ', 'Kui ', 'Jue ', 'Lin ', 'Shen ', 'Gong ', 'Dan ', 'Segare ', 'Qu ', 'Ti ', 'Duo ', 'Duo ', 'Gong ', 'Lang ', 'Nerau ', 'Luo ', 'Ai ', 'Ji ', 'Ju ', 'Tang ', 'Utsuke ', '[?] ', 'Yan ', 'Shitsuke ', 'Kang ', 'Qu ', 'Lou ', 'Lao ', 'Tuo ', 'Zhi ', 'Yagate ', 'Ti ', 'Dao ', 'Yagate ', 'Yu ', 'Che ', 'Ya ', 'Gui ', 'Jun ', 'Wei ', 'Yue ', 'Xin ', 'Di ', 'Xuan ', 'Fan ', 'Ren ', 'Shan ', 'Qiang ', 'Shu ', 'Tun ', 'Chen ', 'Dai ', 'E ', 'Na ', 'Qi ', 'Mao ', 'Ruan ', 'Ren ', 'Fan ', 'Zhuan ', 'Hong ', 'Hu ', 'Qu ', 'Huang ', 'Di ', 'Ling ', 'Dai ', 'Ao ', 'Zhen ', 'Fan ', 'Kuang ', 'Ang ', 'Peng ', 'Bei ', 'Gu ', 'Ku ', 'Pao ', 'Zhu ', 'Rong ', 'E ', 'Ba ', 'Zhou ', 'Zhi ', 'Yao ', 'Ke ', 'Yi ', 'Qing ', 'Shi ', 'Ping '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php
new file mode 100644
index 000000000..1587cab02
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php
@@ -0,0 +1 @@
+<?php return ['Er ', 'Qiong ', 'Ju ', 'Jiao ', 'Guang ', 'Lu ', 'Kai ', 'Quan ', 'Zhou ', 'Zai ', 'Zhi ', 'She ', 'Liang ', 'Yu ', 'Shao ', 'You ', 'Huan ', 'Yun ', 'Zhe ', 'Wan ', 'Fu ', 'Qing ', 'Zhou ', 'Ni ', 'Ling ', 'Zhe ', 'Zhan ', 'Liang ', 'Zi ', 'Hui ', 'Wang ', 'Chuo ', 'Guo ', 'Kan ', 'Yi ', 'Peng ', 'Qian ', 'Gun ', 'Nian ', 'Pian ', 'Guan ', 'Bei ', 'Lun ', 'Pai ', 'Liang ', 'Ruan ', 'Rou ', 'Ji ', 'Yang ', 'Xian ', 'Chuan ', 'Cou ', 'Qun ', 'Ge ', 'You ', 'Hong ', 'Shu ', 'Fu ', 'Zi ', 'Fu ', 'Wen ', 'Ben ', 'Zhan ', 'Yu ', 'Wen ', 'Tao ', 'Gu ', 'Zhen ', 'Xia ', 'Yuan ', 'Lu ', 'Jiu ', 'Chao ', 'Zhuan ', 'Wei ', 'Hun ', 'Sori ', 'Che ', 'Jiao ', 'Zhan ', 'Pu ', 'Lao ', 'Fen ', 'Fan ', 'Lin ', 'Ge ', 'Se ', 'Kan ', 'Huan ', 'Yi ', 'Ji ', 'Dui ', 'Er ', 'Yu ', 'Xian ', 'Hong ', 'Lei ', 'Pei ', 'Li ', 'Li ', 'Lu ', 'Lin ', 'Che ', 'Ya ', 'Gui ', 'Xuan ', 'Di ', 'Ren ', 'Zhuan ', 'E ', 'Lun ', 'Ruan ', 'Hong ', 'Ku ', 'Ke ', 'Lu ', 'Zhou ', 'Zhi ', 'Yi ', 'Hu ', 'Zhen ', 'Li ', 'Yao ', 'Qing ', 'Shi ', 'Zai ', 'Zhi ', 'Jiao ', 'Zhou ', 'Quan ', 'Lu ', 'Jiao ', 'Zhe ', 'Fu ', 'Liang ', 'Nian ', 'Bei ', 'Hui ', 'Gun ', 'Wang ', 'Liang ', 'Chuo ', 'Zi ', 'Cou ', 'Fu ', 'Ji ', 'Wen ', 'Shu ', 'Pei ', 'Yuan ', 'Xia ', 'Zhan ', 'Lu ', 'Che ', 'Lin ', 'Xin ', 'Gu ', 'Ci ', 'Ci ', 'Pi ', 'Zui ', 'Bian ', 'La ', 'La ', 'Ci ', 'Xue ', 'Ban ', 'Bian ', 'Bian ', 'Bian ', '[?] ', 'Bian ', 'Ban ', 'Ci ', 'Bian ', 'Bian ', 'Chen ', 'Ru ', 'Nong ', 'Nong ', 'Zhen ', 'Chuo ', 'Chuo ', 'Suberu ', 'Reng ', 'Bian ', 'Bian ', 'Sip ', 'Ip ', 'Liao ', 'Da ', 'Chan ', 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Qi ', 'Xun ', 'Yi ', 'Guo ', 'Mai ', 'Qi ', 'Za ', 'Wang ', 'Jia ', 'Zhun ', 'Ying ', 'Ti ', 'Yun ', 'Jin ', 'Hang ', 'Ya ', 'Fan ', 'Wu ', 'Da ', 'E ', 'Huan ', 'Zhe ', 'Totemo ', 'Jin ', 'Yuan ', 'Wei ', 'Lian ', 'Chi ', 'Che ', 'Ni ', 'Tiao ', 'Zhi ', 'Yi ', 'Jiong ', 'Jia ', 'Chen ', 'Dai ', 'Er ', 'Di ', 'Po ', 'Wang ', 'Die ', 'Ze ', 'Tao ', 'Shu ', 'Tuo ', 'Kep ', 'Jing ', 'Hui ', 'Tong ', 'You ', 'Mi ', 'Beng ', 'Ji ', 'Nai ', 'Yi ', 'Jie ', 'Zhui ', 'Lie ', 'Xun '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x090.php b/vendor/voku/portable-ascii/src/voku/helper/data/x090.php
new file mode 100644
index 000000000..88735d01f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x090.php
@@ -0,0 +1 @@
+<?php return ['Tui ', 'Song ', 'Gua ', 'Tao ', 'Pang ', 'Hou ', 'Ni ', 'Dun ', 'Jiong ', 'Xuan ', 'Xun ', 'Bu ', 'You ', 'Xiao ', 'Qiu ', 'Tou ', 'Zhu ', 'Qiu ', 'Di ', 'Di ', 'Tu ', 'Jing ', 'Ti ', 'Dou ', 'Yi ', 'Zhe ', 'Tong ', 'Guang ', 'Wu ', 'Shi ', 'Cheng ', 'Su ', 'Zao ', 'Qun ', 'Feng ', 'Lian ', 'Suo ', 'Hui ', 'Li ', 'Sako ', 'Lai ', 'Ben ', 'Cuo ', 'Jue ', 'Beng ', 'Huan ', 'Dai ', 'Lu ', 'You ', 'Zhou ', 'Jin ', 'Yu ', 'Chuo ', 'Kui ', 'Wei ', 'Ti ', 'Yi ', 'Da ', 'Yuan ', 'Luo ', 'Bi ', 'Nuo ', 'Yu ', 'Dang ', 'Sui ', 'Dun ', 'Sui ', 'Yan ', 'Chuan ', 'Chi ', 'Ti ', 'Yu ', 'Shi ', 'Zhen ', 'You ', 'Yun ', 'E ', 'Bian ', 'Guo ', 'E ', 'Xia ', 'Huang ', 'Qiu ', 'Dao ', 'Da ', 'Wei ', 'Appare ', 'Yi ', 'Gou ', 'Yao ', 'Chu ', 'Liu ', 'Xun ', 'Ta ', 'Di ', 'Chi ', 'Yuan ', 'Su ', 'Ta ', 'Qian ', '[?] ', 'Yao ', 'Guan ', 'Zhang ', 'Ao ', 'Shi ', 'Ce ', 'Chi ', 'Su ', 'Zao ', 'Zhe ', 'Dun ', 'Di ', 'Lou ', 'Chi ', 'Cuo ', 'Lin ', 'Zun ', 'Rao ', 'Qian ', 'Xuan ', 'Yu ', 'Yi ', 'Wu ', 'Liao ', 'Ju ', 'Shi ', 'Bi ', 'Yao ', 'Mai ', 'Xie ', 'Sui ', 'Huan ', 'Zhan ', 'Teng ', 'Er ', 'Miao ', 'Bian ', 'Bian ', 'La ', 'Li ', 'Yuan ', 'Yao ', 'Luo ', 'Li ', 'Yi ', 'Ting ', 'Deng ', 'Qi ', 'Yong ', 'Shan ', 'Han ', 'Yu ', 'Mang ', 'Ru ', 'Qiong ', '[?] ', 'Kuang ', 'Fu ', 'Kang ', 'Bin ', 'Fang ', 'Xing ', 'Na ', 'Xin ', 'Shen ', 'Bang ', 'Yuan ', 'Cun ', 'Huo ', 'Xie ', 'Bang ', 'Wu ', 'Ju ', 'You ', 'Han ', 'Tai ', 'Qiu ', 'Bi ', 'Pei ', 'Bing ', 'Shao ', 'Bei ', 'Wa ', 'Di ', 'Zou ', 'Ye ', 'Lin ', 'Kuang ', 'Gui ', 'Zhu ', 'Shi ', 'Ku ', 'Yu ', 'Gai ', 'Ge ', 'Xi ', 'Zhi ', 'Ji ', 'Xun ', 'Hou ', 'Xing ', 'Jiao ', 'Xi ', 'Gui ', 'Nuo ', 'Lang ', 'Jia ', 'Kuai ', 'Zheng ', 'Otoko ', 'Yun ', 'Yan ', 'Cheng ', 'Dou ', 'Chi ', 'Lu ', 'Fu ', 'Wu ', 'Fu ', 'Gao ', 'Hao ', 'Lang ', 'Jia ', 'Geng ', 'Jun ', 'Ying ', 'Bo ', 'Xi ', 'Bei ', 'Li ', 'Yun ', 'Bu ', 'Xiao ', 'Qi ', 'Pi ', 'Qing ', 'Guo ', 'Zhou ', 'Tan ', 'Zou ', 'Ping ', 'Lai ', 'Ni ', 'Chen ', 'You ', 'Bu ', 'Xiang ', 'Dan ', 'Ju ', 'Yong ', 'Qiao ', 'Yi ', 'Du ', 'Yan ', 'Mei '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x091.php b/vendor/voku/portable-ascii/src/voku/helper/data/x091.php
new file mode 100644
index 000000000..372e972e3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x091.php
@@ -0,0 +1 @@
+<?php return ['Ruo ', 'Bei ', 'E ', 'Yu ', 'Juan ', 'Yu ', 'Yun ', 'Hou ', 'Kui ', 'Xiang ', 'Xiang ', 'Sou ', 'Tang ', 'Ming ', 'Xi ', 'Ru ', 'Chu ', 'Zi ', 'Zou ', 'Ju ', 'Wu ', 'Xiang ', 'Yun ', 'Hao ', 'Yong ', 'Bi ', 'Mo ', 'Chao ', 'Fu ', 'Liao ', 'Yin ', 'Zhuan ', 'Hu ', 'Qiao ', 'Yan ', 'Zhang ', 'Fan ', 'Qiao ', 'Xu ', 'Deng ', 'Bi ', 'Xin ', 'Bi ', 'Ceng ', 'Wei ', 'Zheng ', 'Mao ', 'Shan ', 'Lin ', 'Po ', 'Dan ', 'Meng ', 'Ye ', 'Cao ', 'Kuai ', 'Feng ', 'Meng ', 'Zou ', 'Kuang ', 'Lian ', 'Zan ', 'Chan ', 'You ', 'Qi ', 'Yan ', 'Chan ', 'Zan ', 'Ling ', 'Huan ', 'Xi ', 'Feng ', 'Zan ', 'Li ', 'You ', 'Ding ', 'Qiu ', 'Zhuo ', 'Pei ', 'Zhou ', 'Yi ', 'Hang ', 'Yu ', 'Jiu ', 'Yan ', 'Zui ', 'Mao ', 'Dan ', 'Xu ', 'Tou ', 'Zhen ', 'Fen ', 'Sakenomoto ', '[?] ', 'Yun ', 'Tai ', 'Tian ', 'Qia ', 'Tuo ', 'Zuo ', 'Han ', 'Gu ', 'Su ', 'Po ', 'Chou ', 'Zai ', 'Ming ', 'Luo ', 'Chuo ', 'Chou ', 'You ', 'Tong ', 'Zhi ', 'Xian ', 'Jiang ', 'Cheng ', 'Yin ', 'Tu ', 'Xiao ', 'Mei ', 'Ku ', 'Suan ', 'Lei ', 'Pu ', 'Zui ', 'Hai ', 'Yan ', 'Xi ', 'Niang ', 'Wei ', 'Lu ', 'Lan ', 'Yan ', 'Tao ', 'Pei ', 'Zhan ', 'Chun ', 'Tan ', 'Zui ', 'Chuo ', 'Cu ', 'Kun ', 'Ti ', 'Mian ', 'Du ', 'Hu ', 'Xu ', 'Xing ', 'Tan ', 'Jiu ', 'Chun ', 'Yun ', 'Po ', 'Ke ', 'Sou ', 'Mi ', 'Quan ', 'Chou ', 'Cuo ', 'Yun ', 'Yong ', 'Ang ', 'Zha ', 'Hai ', 'Tang ', 'Jiang ', 'Piao ', 'Shan ', 'Yu ', 'Li ', 'Zao ', 'Lao ', 'Yi ', 'Jiang ', 'Pu ', 'Jiao ', 'Xi ', 'Tan ', 'Po ', 'Nong ', 'Yi ', 'Li ', 'Ju ', 'Jiao ', 'Yi ', 'Niang ', 'Ru ', 'Xun ', 'Chou ', 'Yan ', 'Ling ', 'Mi ', 'Mi ', 'Niang ', 'Xin ', 'Jiao ', 'Xi ', 'Mi ', 'Yan ', 'Bian ', 'Cai ', 'Shi ', 'You ', 'Shi ', 'Shi ', 'Li ', 'Zhong ', 'Ye ', 'Liang ', 'Li ', 'Jin ', 'Jin ', 'Qiu ', 'Yi ', 'Diao ', 'Dao ', 'Zhao ', 'Ding ', 'Po ', 'Qiu ', 'He ', 'Fu ', 'Zhen ', 'Zhi ', 'Ba ', 'Luan ', 'Fu ', 'Nai ', 'Diao ', 'Shan ', 'Qiao ', 'Kou ', 'Chuan ', 'Zi ', 'Fan ', 'Yu ', 'Hua ', 'Han ', 'Gong ', 'Qi ', 'Mang ', 'Ri ', 'Di ', 'Si ', 'Xi ', 'Yi ', 'Chai ', 'Shi ', 'Tu ', 'Xi ', 'Nu ', 'Qian ', 'Ishiyumi ', 'Jian ', 'Pi ', 'Ye ', 'Yin '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x092.php b/vendor/voku/portable-ascii/src/voku/helper/data/x092.php
new file mode 100644
index 000000000..e9528f7a7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x092.php
@@ -0,0 +1 @@
+<?php return ['Ba ', 'Fang ', 'Chen ', 'Xing ', 'Tou ', 'Yue ', 'Yan ', 'Fu ', 'Pi ', 'Na ', 'Xin ', 'E ', 'Jue ', 'Dun ', 'Gou ', 'Yin ', 'Qian ', 'Ban ', 'Ji ', 'Ren ', 'Chao ', 'Niu ', 'Fen ', 'Yun ', 'Ji ', 'Qin ', 'Pi ', 'Guo ', 'Hong ', 'Yin ', 'Jun ', 'Shi ', 'Yi ', 'Zhong ', 'Nie ', 'Gai ', 'Ri ', 'Huo ', 'Tai ', 'Kang ', 'Habaki ', 'Irori ', 'Ngaak ', '[?] ', 'Duo ', 'Zi ', 'Ni ', 'Tu ', 'Shi ', 'Min ', 'Gu ', 'E ', 'Ling ', 'Bing ', 'Yi ', 'Gu ', 'Ba ', 'Pi ', 'Yu ', 'Si ', 'Zuo ', 'Bu ', 'You ', 'Dian ', 'Jia ', 'Zhen ', 'Shi ', 'Shi ', 'Tie ', 'Ju ', 'Zhan ', 'Shi ', 'She ', 'Xuan ', 'Zhao ', 'Bao ', 'He ', 'Bi ', 'Sheng ', 'Chu ', 'Shi ', 'Bo ', 'Zhu ', 'Chi ', 'Za ', 'Po ', 'Tong ', 'Qian ', 'Fu ', 'Zhai ', 'Liu ', 'Qian ', 'Fu ', 'Li ', 'Yue ', 'Pi ', 'Yang ', 'Ban ', 'Bo ', 'Jie ', 'Gou ', 'Shu ', 'Zheng ', 'Mu ', 'Ni ', 'Nie ', 'Di ', 'Jia ', 'Mu ', 'Dan ', 'Shen ', 'Yi ', 'Si ', 'Kuang ', 'Ka ', 'Bei ', 'Jian ', 'Tong ', 'Xing ', 'Hong ', 'Jiao ', 'Chi ', 'Er ', 'Ge ', 'Bing ', 'Shi ', 'Mou ', 'Jia ', 'Yin ', 'Jun ', 'Zhou ', 'Chong ', 'Shang ', 'Tong ', 'Mo ', 'Lei ', 'Ji ', 'Yu ', 'Xu ', 'Ren ', 'Zun ', 'Zhi ', 'Qiong ', 'Shan ', 'Chi ', 'Xian ', 'Xing ', 'Quan ', 'Pi ', 'Tie ', 'Zhu ', 'Hou ', 'Ming ', 'Kua ', 'Yao ', 'Xian ', 'Xian ', 'Xiu ', 'Jun ', 'Cha ', 'Lao ', 'Ji ', 'Pi ', 'Ru ', 'Mi ', 'Yi ', 'Yin ', 'Guang ', 'An ', 'Diou ', 'You ', 'Se ', 'Kao ', 'Qian ', 'Luan ', 'Kasugai ', 'Ai ', 'Diao ', 'Han ', 'Rui ', 'Shi ', 'Keng ', 'Qiu ', 'Xiao ', 'Zhe ', 'Xiu ', 'Zang ', 'Ti ', 'Cuo ', 'Gua ', 'Gong ', 'Zhong ', 'Dou ', 'Lu ', 'Mei ', 'Lang ', 'Wan ', 'Xin ', 'Yun ', 'Bei ', 'Wu ', 'Su ', 'Yu ', 'Chan ', 'Ting ', 'Bo ', 'Han ', 'Jia ', 'Hong ', 'Cuan ', 'Feng ', 'Chan ', 'Wan ', 'Zhi ', 'Si ', 'Xuan ', 'Wu ', 'Wu ', 'Tiao ', 'Gong ', 'Zhuo ', 'Lue ', 'Xing ', 'Qian ', 'Shen ', 'Han ', 'Lue ', 'Xie ', 'Chu ', 'Zheng ', 'Ju ', 'Xian ', 'Tie ', 'Mang ', 'Pu ', 'Li ', 'Pan ', 'Rui ', 'Cheng ', 'Gao ', 'Li ', 'Te ', 'Pyeng ', 'Zhu ', '[?] ', 'Tu ', 'Liu ', 'Zui ', 'Ju ', 'Chang ', 'Yuan ', 'Jian ', 'Gang ', 'Diao ', 'Tao ', 'Chang '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x093.php b/vendor/voku/portable-ascii/src/voku/helper/data/x093.php
new file mode 100644
index 000000000..564a43f27
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x093.php
@@ -0,0 +1 @@
+<?php return ['Lun ', 'Kua ', 'Ling ', 'Bei ', 'Lu ', 'Li ', 'Qiang ', 'Pou ', 'Juan ', 'Min ', 'Zui ', 'Peng ', 'An ', 'Pi ', 'Xian ', 'Ya ', 'Zhui ', 'Lei ', 'A ', 'Kong ', 'Ta ', 'Kun ', 'Du ', 'Wei ', 'Chui ', 'Zi ', 'Zheng ', 'Ben ', 'Nie ', 'Cong ', 'Qun ', 'Tan ', 'Ding ', 'Qi ', 'Qian ', 'Zhuo ', 'Qi ', 'Yu ', 'Jin ', 'Guan ', 'Mao ', 'Chang ', 'Tian ', 'Xi ', 'Lian ', 'Tao ', 'Gu ', 'Cuo ', 'Shu ', 'Zhen ', 'Lu ', 'Meng ', 'Lu ', 'Hua ', 'Biao ', 'Ga ', 'Lai ', 'Ken ', 'Kazari ', 'Bu ', 'Nai ', 'Wan ', 'Zan ', '[?] ', 'De ', 'Xian ', '[?] ', 'Huo ', 'Liang ', '[?] ', 'Men ', 'Kai ', 'Ying ', 'Di ', 'Lian ', 'Guo ', 'Xian ', 'Du ', 'Tu ', 'Wei ', 'Cong ', 'Fu ', 'Rou ', 'Ji ', 'E ', 'Rou ', 'Chen ', 'Ti ', 'Zha ', 'Hong ', 'Yang ', 'Duan ', 'Xia ', 'Yu ', 'Keng ', 'Xing ', 'Huang ', 'Wei ', 'Fu ', 'Zhao ', 'Cha ', 'Qie ', 'She ', 'Hong ', 'Kui ', 'Tian ', 'Mou ', 'Qiao ', 'Qiao ', 'Hou ', 'Tou ', 'Cong ', 'Huan ', 'Ye ', 'Min ', 'Jian ', 'Duan ', 'Jian ', 'Song ', 'Kui ', 'Hu ', 'Xuan ', 'Duo ', 'Jie ', 'Zhen ', 'Bian ', 'Zhong ', 'Zi ', 'Xiu ', 'Ye ', 'Mei ', 'Pai ', 'Ai ', 'Jie ', '[?] ', 'Mei ', 'Chuo ', 'Ta ', 'Bang ', 'Xia ', 'Lian ', 'Suo ', 'Xi ', 'Liu ', 'Zu ', 'Ye ', 'Nou ', 'Weng ', 'Rong ', 'Tang ', 'Suo ', 'Qiang ', 'Ge ', 'Shuo ', 'Chui ', 'Bo ', 'Pan ', 'Sa ', 'Bi ', 'Sang ', 'Gang ', 'Zi ', 'Wu ', 'Ying ', 'Huang ', 'Tiao ', 'Liu ', 'Kai ', 'Sun ', 'Sha ', 'Sou ', 'Wan ', 'Hao ', 'Zhen ', 'Zhen ', 'Luo ', 'Yi ', 'Yuan ', 'Tang ', 'Nie ', 'Xi ', 'Jia ', 'Ge ', 'Ma ', 'Juan ', 'Kasugai ', 'Habaki ', 'Suo ', '[?] ', '[?] ', '[?] ', 'Na ', 'Lu ', 'Suo ', 'Ou ', 'Zu ', 'Tuan ', 'Xiu ', 'Guan ', 'Xuan ', 'Lian ', 'Shou ', 'Ao ', 'Man ', 'Mo ', 'Luo ', 'Bi ', 'Wei ', 'Liu ', 'Di ', 'Qiao ', 'Cong ', 'Yi ', 'Lu ', 'Ao ', 'Keng ', 'Qiang ', 'Cui ', 'Qi ', 'Chang ', 'Tang ', 'Man ', 'Yong ', 'Chan ', 'Feng ', 'Jing ', 'Biao ', 'Shu ', 'Lou ', 'Xiu ', 'Cong ', 'Long ', 'Zan ', 'Jian ', 'Cao ', 'Li ', 'Xia ', 'Xi ', 'Kang ', '[?] ', 'Beng ', '[?] ', '[?] ', 'Zheng ', 'Lu ', 'Hua ', 'Ji ', 'Pu ', 'Hui ', 'Qiang ', 'Po ', 'Lin ', 'Suo ', 'Xiu ', 'San ', 'Cheng '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x094.php b/vendor/voku/portable-ascii/src/voku/helper/data/x094.php
new file mode 100644
index 000000000..ee2bd6f79
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x094.php
@@ -0,0 +1 @@
+<?php return ['Kui ', 'Si ', 'Liu ', 'Nao ', 'Heng ', 'Pie ', 'Sui ', 'Fan ', 'Qiao ', 'Quan ', 'Yang ', 'Tang ', 'Xiang ', 'Jue ', 'Jiao ', 'Zun ', 'Liao ', 'Jie ', 'Lao ', 'Dui ', 'Tan ', 'Zan ', 'Ji ', 'Jian ', 'Zhong ', 'Deng ', 'Ya ', 'Ying ', 'Dui ', 'Jue ', 'Nou ', 'Ti ', 'Pu ', 'Tie ', '[?] ', '[?] ', 'Ding ', 'Shan ', 'Kai ', 'Jian ', 'Fei ', 'Sui ', 'Lu ', 'Juan ', 'Hui ', 'Yu ', 'Lian ', 'Zhuo ', 'Qiao ', 'Qian ', 'Zhuo ', 'Lei ', 'Bi ', 'Tie ', 'Huan ', 'Ye ', 'Duo ', 'Guo ', 'Dang ', 'Ju ', 'Fen ', 'Da ', 'Bei ', 'Yi ', 'Ai ', 'Zong ', 'Xun ', 'Diao ', 'Zhu ', 'Heng ', 'Zhui ', 'Ji ', 'Nie ', 'Ta ', 'Huo ', 'Qing ', 'Bin ', 'Ying ', 'Kui ', 'Ning ', 'Xu ', 'Jian ', 'Jian ', 'Yari ', 'Cha ', 'Zhi ', 'Mie ', 'Li ', 'Lei ', 'Ji ', 'Zuan ', 'Kuang ', 'Shang ', 'Peng ', 'La ', 'Du ', 'Shuo ', 'Chuo ', 'Lu ', 'Biao ', 'Bao ', 'Lu ', '[?] ', '[?] ', 'Long ', 'E ', 'Lu ', 'Xin ', 'Jian ', 'Lan ', 'Bo ', 'Jian ', 'Yao ', 'Chan ', 'Xiang ', 'Jian ', 'Xi ', 'Guan ', 'Cang ', 'Nie ', 'Lei ', 'Cuan ', 'Qu ', 'Pan ', 'Luo ', 'Zuan ', 'Luan ', 'Zao ', 'Nie ', 'Jue ', 'Tang ', 'Shu ', 'Lan ', 'Jin ', 'Qiu ', 'Yi ', 'Zhen ', 'Ding ', 'Zhao ', 'Po ', 'Diao ', 'Tu ', 'Qian ', 'Chuan ', 'Shan ', 'Ji ', 'Fan ', 'Diao ', 'Men ', 'Nu ', 'Xi ', 'Chai ', 'Xing ', 'Gai ', 'Bu ', 'Tai ', 'Ju ', 'Dun ', 'Chao ', 'Zhong ', 'Na ', 'Bei ', 'Gang ', 'Ban ', 'Qian ', 'Yao ', 'Qin ', 'Jun ', 'Wu ', 'Gou ', 'Kang ', 'Fang ', 'Huo ', 'Tou ', 'Niu ', 'Ba ', 'Yu ', 'Qian ', 'Zheng ', 'Qian ', 'Gu ', 'Bo ', 'E ', 'Po ', 'Bu ', 'Ba ', 'Yue ', 'Zuan ', 'Mu ', 'Dan ', 'Jia ', 'Dian ', 'You ', 'Tie ', 'Bo ', 'Ling ', 'Shuo ', 'Qian ', 'Liu ', 'Bao ', 'Shi ', 'Xuan ', 'She ', 'Bi ', 'Ni ', 'Pi ', 'Duo ', 'Xing ', 'Kao ', 'Lao ', 'Er ', 'Mang ', 'Ya ', 'You ', 'Cheng ', 'Jia ', 'Ye ', 'Nao ', 'Zhi ', 'Dang ', 'Tong ', 'Lu ', 'Diao ', 'Yin ', 'Kai ', 'Zha ', 'Zhu ', 'Xian ', 'Ting ', 'Diu ', 'Xian ', 'Hua ', 'Quan ', 'Sha ', 'Jia ', 'Yao ', 'Ge ', 'Ming ', 'Zheng ', 'Se ', 'Jiao ', 'Yi ', 'Chan ', 'Chong ', 'Tang ', 'An ', 'Yin ', 'Ru ', 'Zhu ', 'Lao ', 'Pu ', 'Wu ', 'Lai ', 'Te ', 'Lian ', 'Keng '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x095.php b/vendor/voku/portable-ascii/src/voku/helper/data/x095.php
new file mode 100644
index 000000000..a14ab1760
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x095.php
@@ -0,0 +1 @@
+<?php return ['Xiao ', 'Suo ', 'Li ', 'Zheng ', 'Chu ', 'Guo ', 'Gao ', 'Tie ', 'Xiu ', 'Cuo ', 'Lue ', 'Feng ', 'Xin ', 'Liu ', 'Kai ', 'Jian ', 'Rui ', 'Ti ', 'Lang ', 'Qian ', 'Ju ', 'A ', 'Qiang ', 'Duo ', 'Tian ', 'Cuo ', 'Mao ', 'Ben ', 'Qi ', 'De ', 'Kua ', 'Kun ', 'Chang ', 'Xi ', 'Gu ', 'Luo ', 'Chui ', 'Zhui ', 'Jin ', 'Zhi ', 'Xian ', 'Juan ', 'Huo ', 'Pou ', 'Tan ', 'Ding ', 'Jian ', 'Ju ', 'Meng ', 'Zi ', 'Qie ', 'Ying ', 'Kai ', 'Qiang ', 'Song ', 'E ', 'Cha ', 'Qiao ', 'Zhong ', 'Duan ', 'Sou ', 'Huang ', 'Huan ', 'Ai ', 'Du ', 'Mei ', 'Lou ', 'Zi ', 'Fei ', 'Mei ', 'Mo ', 'Zhen ', 'Bo ', 'Ge ', 'Nie ', 'Tang ', 'Juan ', 'Nie ', 'Na ', 'Liu ', 'Hao ', 'Bang ', 'Yi ', 'Jia ', 'Bin ', 'Rong ', 'Biao ', 'Tang ', 'Man ', 'Luo ', 'Beng ', 'Yong ', 'Jing ', 'Di ', 'Zu ', 'Xuan ', 'Liu ', 'Tan ', 'Jue ', 'Liao ', 'Pu ', 'Lu ', 'Dui ', 'Lan ', 'Pu ', 'Cuan ', 'Qiang ', 'Deng ', 'Huo ', 'Lei ', 'Huan ', 'Zhuo ', 'Lian ', 'Yi ', 'Cha ', 'Biao ', 'La ', 'Chan ', 'Xiang ', 'Chang ', 'Chang ', 'Jiu ', 'Ao ', 'Die ', 'Qu ', 'Liao ', 'Mi ', 'Chang ', 'Men ', 'Ma ', 'Shuan ', 'Shan ', 'Huo ', 'Men ', 'Yan ', 'Bi ', 'Han ', 'Bi ', 'San ', 'Kai ', 'Kang ', 'Beng ', 'Hong ', 'Run ', 'San ', 'Xian ', 'Xian ', 'Jian ', 'Min ', 'Xia ', 'Yuru ', 'Dou ', 'Zha ', 'Nao ', 'Jian ', 'Peng ', 'Xia ', 'Ling ', 'Bian ', 'Bi ', 'Run ', 'He ', 'Guan ', 'Ge ', 'Ge ', 'Fa ', 'Chu ', 'Hong ', 'Gui ', 'Min ', 'Se ', 'Kun ', 'Lang ', 'Lu ', 'Ting ', 'Sha ', 'Ju ', 'Yue ', 'Yue ', 'Chan ', 'Qu ', 'Lin ', 'Chang ', 'Shai ', 'Kun ', 'Yan ', 'Min ', 'Yan ', 'E ', 'Hun ', 'Yu ', 'Wen ', 'Xiang ', 'Bao ', 'Xiang ', 'Qu ', 'Yao ', 'Wen ', 'Ban ', 'An ', 'Wei ', 'Yin ', 'Kuo ', 'Que ', 'Lan ', 'Du ', '[?] ', 'Phwung ', 'Tian ', 'Nie ', 'Ta ', 'Kai ', 'He ', 'Que ', 'Chuang ', 'Guan ', 'Dou ', 'Qi ', 'Kui ', 'Tang ', 'Guan ', 'Piao ', 'Kan ', 'Xi ', 'Hui ', 'Chan ', 'Pi ', 'Dang ', 'Huan ', 'Ta ', 'Wen ', '[?] ', 'Men ', 'Shuan ', 'Shan ', 'Yan ', 'Han ', 'Bi ', 'Wen ', 'Chuang ', 'Run ', 'Wei ', 'Xian ', 'Hong ', 'Jian ', 'Min ', 'Kang ', 'Men ', 'Zha ', 'Nao ', 'Gui ', 'Wen ', 'Ta ', 'Min ', 'Lu ', 'Kai '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x096.php b/vendor/voku/portable-ascii/src/voku/helper/data/x096.php
new file mode 100644
index 000000000..43f58e756
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x096.php
@@ -0,0 +1 @@
+<?php return ['Fa ', 'Ge ', 'He ', 'Kun ', 'Jiu ', 'Yue ', 'Lang ', 'Du ', 'Yu ', 'Yan ', 'Chang ', 'Xi ', 'Wen ', 'Hun ', 'Yan ', 'E ', 'Chan ', 'Lan ', 'Qu ', 'Hui ', 'Kuo ', 'Que ', 'Ge ', 'Tian ', 'Ta ', 'Que ', 'Kan ', 'Huan ', 'Fu ', 'Fu ', 'Le ', 'Dui ', 'Xin ', 'Qian ', 'Wu ', 'Yi ', 'Tuo ', 'Yin ', 'Yang ', 'Dou ', 'E ', 'Sheng ', 'Ban ', 'Pei ', 'Keng ', 'Yun ', 'Ruan ', 'Zhi ', 'Pi ', 'Jing ', 'Fang ', 'Yang ', 'Yin ', 'Zhen ', 'Jie ', 'Cheng ', 'E ', 'Qu ', 'Di ', 'Zu ', 'Zuo ', 'Dian ', 'Ling ', 'A ', 'Tuo ', 'Tuo ', 'Po ', 'Bing ', 'Fu ', 'Ji ', 'Lu ', 'Long ', 'Chen ', 'Xing ', 'Duo ', 'Lou ', 'Mo ', 'Jiang ', 'Shu ', 'Duo ', 'Xian ', 'Er ', 'Gui ', 'Yu ', 'Gai ', 'Shan ', 'Xun ', 'Qiao ', 'Xing ', 'Chun ', 'Fu ', 'Bi ', 'Xia ', 'Shan ', 'Sheng ', 'Zhi ', 'Pu ', 'Dou ', 'Yuan ', 'Zhen ', 'Chu ', 'Xian ', 'Tou ', 'Nie ', 'Yun ', 'Xian ', 'Pei ', 'Pei ', 'Zou ', 'Yi ', 'Dui ', 'Lun ', 'Yin ', 'Ju ', 'Chui ', 'Chen ', 'Pi ', 'Ling ', 'Tao ', 'Xian ', 'Lu ', 'Sheng ', 'Xian ', 'Yin ', 'Zhu ', 'Yang ', 'Reng ', 'Shan ', 'Chong ', 'Yan ', 'Yin ', 'Yu ', 'Ti ', 'Yu ', 'Long ', 'Wei ', 'Wei ', 'Nie ', 'Dui ', 'Sui ', 'An ', 'Huang ', 'Jie ', 'Sui ', 'Yin ', 'Gai ', 'Yan ', 'Hui ', 'Ge ', 'Yun ', 'Wu ', 'Wei ', 'Ai ', 'Xi ', 'Tang ', 'Ji ', 'Zhang ', 'Dao ', 'Ao ', 'Xi ', 'Yin ', '[?] ', 'Rao ', 'Lin ', 'Tui ', 'Deng ', 'Pi ', 'Sui ', 'Sui ', 'Yu ', 'Xian ', 'Fen ', 'Ni ', 'Er ', 'Ji ', 'Dao ', 'Xi ', 'Yin ', 'E ', 'Hui ', 'Long ', 'Xi ', 'Li ', 'Li ', 'Li ', 'Zhui ', 'He ', 'Zhi ', 'Zhun ', 'Jun ', 'Nan ', 'Yi ', 'Que ', 'Yan ', 'Qian ', 'Ya ', 'Xiong ', 'Ya ', 'Ji ', 'Gu ', 'Huan ', 'Zhi ', 'Gou ', 'Jun ', 'Ci ', 'Yong ', 'Ju ', 'Chu ', 'Hu ', 'Za ', 'Luo ', 'Yu ', 'Chou ', 'Diao ', 'Sui ', 'Han ', 'Huo ', 'Shuang ', 'Guan ', 'Chu ', 'Za ', 'Yong ', 'Ji ', 'Xi ', 'Chou ', 'Liu ', 'Li ', 'Nan ', 'Xue ', 'Za ', 'Ji ', 'Ji ', 'Yu ', 'Yu ', 'Xue ', 'Na ', 'Fou ', 'Se ', 'Mu ', 'Wen ', 'Fen ', 'Pang ', 'Yun ', 'Li ', 'Li ', 'Ang ', 'Ling ', 'Lei ', 'An ', 'Bao ', 'Meng ', 'Dian ', 'Dang ', 'Xing ', 'Wu ', 'Zhao '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x097.php b/vendor/voku/portable-ascii/src/voku/helper/data/x097.php
new file mode 100644
index 000000000..8be6ac9fa
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x097.php
@@ -0,0 +1 @@
+<?php return ['Xu ', 'Ji ', 'Mu ', 'Chen ', 'Xiao ', 'Zha ', 'Ting ', 'Zhen ', 'Pei ', 'Mei ', 'Ling ', 'Qi ', 'Chou ', 'Huo ', 'Sha ', 'Fei ', 'Weng ', 'Zhan ', 'Yin ', 'Ni ', 'Chou ', 'Tun ', 'Lin ', '[?] ', 'Dong ', 'Ying ', 'Wu ', 'Ling ', 'Shuang ', 'Ling ', 'Xia ', 'Hong ', 'Yin ', 'Mo ', 'Mai ', 'Yun ', 'Liu ', 'Meng ', 'Bin ', 'Wu ', 'Wei ', 'Huo ', 'Yin ', 'Xi ', 'Yi ', 'Ai ', 'Dan ', 'Deng ', 'Xian ', 'Yu ', 'Lu ', 'Long ', 'Dai ', 'Ji ', 'Pang ', 'Yang ', 'Ba ', 'Pi ', 'Wei ', '[?] ', 'Xi ', 'Ji ', 'Mai ', 'Meng ', 'Meng ', 'Lei ', 'Li ', 'Huo ', 'Ai ', 'Fei ', 'Dai ', 'Long ', 'Ling ', 'Ai ', 'Feng ', 'Li ', 'Bao ', '[?] ', 'He ', 'He ', 'Bing ', 'Qing ', 'Qing ', 'Jing ', 'Tian ', 'Zhen ', 'Jing ', 'Cheng ', 'Qing ', 'Jing ', 'Jing ', 'Dian ', 'Jing ', 'Tian ', 'Fei ', 'Fei ', 'Kao ', 'Mi ', 'Mian ', 'Mian ', 'Pao ', 'Ye ', 'Tian ', 'Hui ', 'Ye ', 'Ge ', 'Ding ', 'Cha ', 'Jian ', 'Ren ', 'Di ', 'Du ', 'Wu ', 'Ren ', 'Qin ', 'Jin ', 'Xue ', 'Niu ', 'Ba ', 'Yin ', 'Sa ', 'Na ', 'Mo ', 'Zu ', 'Da ', 'Ban ', 'Yi ', 'Yao ', 'Tao ', 'Tuo ', 'Jia ', 'Hong ', 'Pao ', 'Yang ', 'Tomo ', 'Yin ', 'Jia ', 'Tao ', 'Ji ', 'Xie ', 'An ', 'An ', 'Hen ', 'Gong ', 'Kohaze ', 'Da ', 'Qiao ', 'Ting ', 'Wan ', 'Ying ', 'Sui ', 'Tiao ', 'Qiao ', 'Xuan ', 'Kong ', 'Beng ', 'Ta ', 'Zhang ', 'Bing ', 'Kuo ', 'Ju ', 'La ', 'Xie ', 'Rou ', 'Bang ', 'Yi ', 'Qiu ', 'Qiu ', 'He ', 'Xiao ', 'Mu ', 'Ju ', 'Jian ', 'Bian ', 'Di ', 'Jian ', 'On ', 'Tao ', 'Gou ', 'Ta ', 'Bei ', 'Xie ', 'Pan ', 'Ge ', 'Bi ', 'Kuo ', 'Tang ', 'Lou ', 'Gui ', 'Qiao ', 'Xue ', 'Ji ', 'Jian ', 'Jiang ', 'Chan ', 'Da ', 'Huo ', 'Xian ', 'Qian ', 'Du ', 'Wa ', 'Jian ', 'Lan ', 'Wei ', 'Ren ', 'Fu ', 'Mei ', 'Juan ', 'Ge ', 'Wei ', 'Qiao ', 'Han ', 'Chang ', '[?] ', 'Rou ', 'Xun ', 'She ', 'Wei ', 'Ge ', 'Bei ', 'Tao ', 'Gou ', 'Yun ', '[?] ', 'Bi ', 'Wei ', 'Hui ', 'Du ', 'Wa ', 'Du ', 'Wei ', 'Ren ', 'Fu ', 'Han ', 'Wei ', 'Yun ', 'Tao ', 'Jiu ', 'Jiu ', 'Xian ', 'Xie ', 'Xian ', 'Ji ', 'Yin ', 'Za ', 'Yun ', 'Shao ', 'Le ', 'Peng ', 'Heng ', 'Ying ', 'Yun ', 'Peng ', 'Yin ', 'Yin ', 'Xiang '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x098.php b/vendor/voku/portable-ascii/src/voku/helper/data/x098.php
new file mode 100644
index 000000000..9320a7931
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x098.php
@@ -0,0 +1 @@
+<?php return ['Hu ', 'Ye ', 'Ding ', 'Qing ', 'Pan ', 'Xiang ', 'Shun ', 'Han ', 'Xu ', 'Yi ', 'Xu ', 'Gu ', 'Song ', 'Kui ', 'Qi ', 'Hang ', 'Yu ', 'Wan ', 'Ban ', 'Dun ', 'Di ', 'Dan ', 'Pan ', 'Po ', 'Ling ', 'Ce ', 'Jing ', 'Lei ', 'He ', 'Qiao ', 'E ', 'E ', 'Wei ', 'Jie ', 'Gua ', 'Shen ', 'Yi ', 'Shen ', 'Hai ', 'Dui ', 'Pian ', 'Ping ', 'Lei ', 'Fu ', 'Jia ', 'Tou ', 'Hui ', 'Kui ', 'Jia ', 'Le ', 'Tian ', 'Cheng ', 'Ying ', 'Jun ', 'Hu ', 'Han ', 'Jing ', 'Tui ', 'Tui ', 'Pin ', 'Lai ', 'Tui ', 'Zi ', 'Zi ', 'Chui ', 'Ding ', 'Lai ', 'Yan ', 'Han ', 'Jian ', 'Ke ', 'Cui ', 'Jiong ', 'Qin ', 'Yi ', 'Sai ', 'Ti ', 'E ', 'E ', 'Yan ', 'Hun ', 'Kan ', 'Yong ', 'Zhuan ', 'Yan ', 'Xian ', 'Xin ', 'Yi ', 'Yuan ', 'Sang ', 'Dian ', 'Dian ', 'Jiang ', 'Ku ', 'Lei ', 'Liao ', 'Piao ', 'Yi ', 'Man ', 'Qi ', 'Rao ', 'Hao ', 'Qiao ', 'Gu ', 'Xun ', 'Qian ', 'Hui ', 'Zhan ', 'Ru ', 'Hong ', 'Bin ', 'Xian ', 'Pin ', 'Lu ', 'Lan ', 'Nie ', 'Quan ', 'Ye ', 'Ding ', 'Qing ', 'Han ', 'Xiang ', 'Shun ', 'Xu ', 'Xu ', 'Wan ', 'Gu ', 'Dun ', 'Qi ', 'Ban ', 'Song ', 'Hang ', 'Yu ', 'Lu ', 'Ling ', 'Po ', 'Jing ', 'Jie ', 'Jia ', 'Tian ', 'Han ', 'Ying ', 'Jiong ', 'Hai ', 'Yi ', 'Pin ', 'Hui ', 'Tui ', 'Han ', 'Ying ', 'Ying ', 'Ke ', 'Ti ', 'Yong ', 'E ', 'Zhuan ', 'Yan ', 'E ', 'Nie ', 'Man ', 'Dian ', 'Sang ', 'Hao ', 'Lei ', 'Zhan ', 'Ru ', 'Pin ', 'Quan ', 'Feng ', 'Biao ', 'Oroshi ', 'Fu ', 'Xia ', 'Zhan ', 'Biao ', 'Sa ', 'Ba ', 'Tai ', 'Lie ', 'Gua ', 'Xuan ', 'Shao ', 'Ju ', 'Bi ', 'Si ', 'Wei ', 'Yang ', 'Yao ', 'Sou ', 'Kai ', 'Sao ', 'Fan ', 'Liu ', 'Xi ', 'Liao ', 'Piao ', 'Piao ', 'Liu ', 'Biao ', 'Biao ', 'Biao ', 'Liao ', '[?] ', 'Se ', 'Feng ', 'Biao ', 'Feng ', 'Yang ', 'Zhan ', 'Biao ', 'Sa ', 'Ju ', 'Si ', 'Sou ', 'Yao ', 'Liu ', 'Piao ', 'Biao ', 'Biao ', 'Fei ', 'Fan ', 'Fei ', 'Fei ', 'Shi ', 'Shi ', 'Can ', 'Ji ', 'Ding ', 'Si ', 'Tuo ', 'Zhan ', 'Sun ', 'Xiang ', 'Tun ', 'Ren ', 'Yu ', 'Juan ', 'Chi ', 'Yin ', 'Fan ', 'Fan ', 'Sun ', 'Yin ', 'Zhu ', 'Yi ', 'Zhai ', 'Bi ', 'Jie ', 'Tao ', 'Liu ', 'Ci ', 'Tie ', 'Si ', 'Bao ', 'Shi ', 'Duo '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x099.php b/vendor/voku/portable-ascii/src/voku/helper/data/x099.php
new file mode 100644
index 000000000..2ce5f713f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x099.php
@@ -0,0 +1 @@
+<?php return ['Hai ', 'Ren ', 'Tian ', 'Jiao ', 'Jia ', 'Bing ', 'Yao ', 'Tong ', 'Ci ', 'Xiang ', 'Yang ', 'Yang ', 'Er ', 'Yan ', 'Le ', 'Yi ', 'Can ', 'Bo ', 'Nei ', 'E ', 'Bu ', 'Jun ', 'Dou ', 'Su ', 'Yu ', 'Shi ', 'Yao ', 'Hun ', 'Guo ', 'Shi ', 'Jian ', 'Zhui ', 'Bing ', 'Xian ', 'Bu ', 'Ye ', 'Tan ', 'Fei ', 'Zhang ', 'Wei ', 'Guan ', 'E ', 'Nuan ', 'Hun ', 'Hu ', 'Huang ', 'Tie ', 'Hui ', 'Jian ', 'Hou ', 'He ', 'Xing ', 'Fen ', 'Wei ', 'Gu ', 'Cha ', 'Song ', 'Tang ', 'Bo ', 'Gao ', 'Xi ', 'Kui ', 'Liu ', 'Sou ', 'Tao ', 'Ye ', 'Yun ', 'Mo ', 'Tang ', 'Man ', 'Bi ', 'Yu ', 'Xiu ', 'Jin ', 'San ', 'Kui ', 'Zhuan ', 'Shan ', 'Chi ', 'Dan ', 'Yi ', 'Ji ', 'Rao ', 'Cheng ', 'Yong ', 'Tao ', 'Hui ', 'Xiang ', 'Zhan ', 'Fen ', 'Hai ', 'Meng ', 'Yan ', 'Mo ', 'Chan ', 'Xiang ', 'Luo ', 'Zuan ', 'Nang ', 'Shi ', 'Ding ', 'Ji ', 'Tuo ', 'Xing ', 'Tun ', 'Xi ', 'Ren ', 'Yu ', 'Chi ', 'Fan ', 'Yin ', 'Jian ', 'Shi ', 'Bao ', 'Si ', 'Duo ', 'Yi ', 'Er ', 'Rao ', 'Xiang ', 'Jia ', 'Le ', 'Jiao ', 'Yi ', 'Bing ', 'Bo ', 'Dou ', 'E ', 'Yu ', 'Nei ', 'Jun ', 'Guo ', 'Hun ', 'Xian ', 'Guan ', 'Cha ', 'Kui ', 'Gu ', 'Sou ', 'Chan ', 'Ye ', 'Mo ', 'Bo ', 'Liu ', 'Xiu ', 'Jin ', 'Man ', 'San ', 'Zhuan ', 'Nang ', 'Shou ', 'Kui ', 'Guo ', 'Xiang ', 'Fen ', 'Ba ', 'Ni ', 'Bi ', 'Bo ', 'Tu ', 'Han ', 'Fei ', 'Jian ', 'An ', 'Ai ', 'Fu ', 'Xian ', 'Wen ', 'Xin ', 'Fen ', 'Bin ', 'Xing ', 'Ma ', 'Yu ', 'Feng ', 'Han ', 'Di ', 'Tuo ', 'Tuo ', 'Chi ', 'Xun ', 'Zhu ', 'Zhi ', 'Pei ', 'Xin ', 'Ri ', 'Sa ', 'Yin ', 'Wen ', 'Zhi ', 'Dan ', 'Lu ', 'You ', 'Bo ', 'Bao ', 'Kuai ', 'Tuo ', 'Yi ', 'Qu ', '[?] ', 'Qu ', 'Jiong ', 'Bo ', 'Zhao ', 'Yuan ', 'Peng ', 'Zhou ', 'Ju ', 'Zhu ', 'Nu ', 'Ju ', 'Pi ', 'Zang ', 'Jia ', 'Ling ', 'Zhen ', 'Tai ', 'Fu ', 'Yang ', 'Shi ', 'Bi ', 'Tuo ', 'Tuo ', 'Si ', 'Liu ', 'Ma ', 'Pian ', 'Tao ', 'Zhi ', 'Rong ', 'Teng ', 'Dong ', 'Xun ', 'Quan ', 'Shen ', 'Jiong ', 'Er ', 'Hai ', 'Bo ', 'Zhu ', 'Yin ', 'Luo ', 'Shuu ', 'Dan ', 'Xie ', 'Liu ', 'Ju ', 'Song ', 'Qin ', 'Mang ', 'Liang ', 'Han ', 'Tu ', 'Xuan ', 'Tui ', 'Jun '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php
new file mode 100644
index 000000000..08160b8b7
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php
@@ -0,0 +1 @@
+<?php return ['E ', 'Cheng ', 'Xin ', 'Ai ', 'Lu ', 'Zhui ', 'Zhou ', 'She ', 'Pian ', 'Kun ', 'Tao ', 'Lai ', 'Zong ', 'Ke ', 'Qi ', 'Qi ', 'Yan ', 'Fei ', 'Sao ', 'Yan ', 'Jie ', 'Yao ', 'Wu ', 'Pian ', 'Cong ', 'Pian ', 'Qian ', 'Fei ', 'Huang ', 'Jian ', 'Huo ', 'Yu ', 'Ti ', 'Quan ', 'Xia ', 'Zong ', 'Kui ', 'Rou ', 'Si ', 'Gua ', 'Tuo ', 'Kui ', 'Sou ', 'Qian ', 'Cheng ', 'Zhi ', 'Liu ', 'Pang ', 'Teng ', 'Xi ', 'Cao ', 'Du ', 'Yan ', 'Yuan ', 'Zou ', 'Sao ', 'Shan ', 'Li ', 'Zhi ', 'Shuang ', 'Lu ', 'Xi ', 'Luo ', 'Zhang ', 'Mo ', 'Ao ', 'Can ', 'Piao ', 'Cong ', 'Qu ', 'Bi ', 'Zhi ', 'Yu ', 'Xu ', 'Hua ', 'Bo ', 'Su ', 'Xiao ', 'Lin ', 'Chan ', 'Dun ', 'Liu ', 'Tuo ', 'Zeng ', 'Tan ', 'Jiao ', 'Tie ', 'Yan ', 'Luo ', 'Zhan ', 'Jing ', 'Yi ', 'Ye ', 'Tuo ', 'Bin ', 'Zou ', 'Yan ', 'Peng ', 'Lu ', 'Teng ', 'Xiang ', 'Ji ', 'Shuang ', 'Ju ', 'Xi ', 'Huan ', 'Li ', 'Biao ', 'Ma ', 'Yu ', 'Tuo ', 'Xun ', 'Chi ', 'Qu ', 'Ri ', 'Bo ', 'Lu ', 'Zang ', 'Shi ', 'Si ', 'Fu ', 'Ju ', 'Zou ', 'Zhu ', 'Tuo ', 'Nu ', 'Jia ', 'Yi ', 'Tai ', 'Xiao ', 'Ma ', 'Yin ', 'Jiao ', 'Hua ', 'Luo ', 'Hai ', 'Pian ', 'Biao ', 'Li ', 'Cheng ', 'Yan ', 'Xin ', 'Qin ', 'Jun ', 'Qi ', 'Qi ', 'Ke ', 'Zhui ', 'Zong ', 'Su ', 'Can ', 'Pian ', 'Zhi ', 'Kui ', 'Sao ', 'Wu ', 'Ao ', 'Liu ', 'Qian ', 'Shan ', 'Piao ', 'Luo ', 'Cong ', 'Chan ', 'Zou ', 'Ji ', 'Shuang ', 'Xiang ', 'Gu ', 'Wei ', 'Wei ', 'Wei ', 'Yu ', 'Gan ', 'Yi ', 'Ang ', 'Tou ', 'Xie ', 'Bao ', 'Bi ', 'Chi ', 'Ti ', 'Di ', 'Ku ', 'Hai ', 'Qiao ', 'Gou ', 'Kua ', 'Ge ', 'Tui ', 'Geng ', 'Pian ', 'Bi ', 'Ke ', 'Ka ', 'Yu ', 'Sui ', 'Lou ', 'Bo ', 'Xiao ', 'Pang ', 'Bo ', 'Ci ', 'Kuan ', 'Bin ', 'Mo ', 'Liao ', 'Lou ', 'Nao ', 'Du ', 'Zang ', 'Sui ', 'Ti ', 'Bin ', 'Kuan ', 'Lu ', 'Gao ', 'Gao ', 'Qiao ', 'Kao ', 'Qiao ', 'Lao ', 'Zao ', 'Biao ', 'Kun ', 'Kun ', 'Ti ', 'Fang ', 'Xiu ', 'Ran ', 'Mao ', 'Dan ', 'Kun ', 'Bin ', 'Fa ', 'Tiao ', 'Peng ', 'Zi ', 'Fa ', 'Ran ', 'Ti ', 'Pao ', 'Pi ', 'Mao ', 'Fu ', 'Er ', 'Rong ', 'Qu ', 'Gong ', 'Xiu ', 'Gua ', 'Ji ', 'Peng ', 'Zhua ', 'Shao ', 'Sha '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php
new file mode 100644
index 000000000..1ce3769f1
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php
@@ -0,0 +1 @@
+<?php return ['Ti ', 'Li ', 'Bin ', 'Zong ', 'Ti ', 'Peng ', 'Song ', 'Zheng ', 'Quan ', 'Zong ', 'Shun ', 'Jian ', 'Duo ', 'Hu ', 'La ', 'Jiu ', 'Qi ', 'Lian ', 'Zhen ', 'Bin ', 'Peng ', 'Mo ', 'San ', 'Man ', 'Man ', 'Seng ', 'Xu ', 'Lie ', 'Qian ', 'Qian ', 'Nong ', 'Huan ', 'Kuai ', 'Ning ', 'Bin ', 'Lie ', 'Rang ', 'Dou ', 'Dou ', 'Nao ', 'Hong ', 'Xi ', 'Dou ', 'Han ', 'Dou ', 'Dou ', 'Jiu ', 'Chang ', 'Yu ', 'Yu ', 'Li ', 'Juan ', 'Fu ', 'Qian ', 'Gui ', 'Zong ', 'Liu ', 'Gui ', 'Shang ', 'Yu ', 'Gui ', 'Mei ', 'Ji ', 'Qi ', 'Jie ', 'Kui ', 'Hun ', 'Ba ', 'Po ', 'Mei ', 'Xu ', 'Yan ', 'Xiao ', 'Liang ', 'Yu ', 'Tui ', 'Qi ', 'Wang ', 'Liang ', 'Wei ', 'Jian ', 'Chi ', 'Piao ', 'Bi ', 'Mo ', 'Ji ', 'Xu ', 'Chou ', 'Yan ', 'Zhan ', 'Yu ', 'Dao ', 'Ren ', 'Ji ', 'Eri ', 'Gong ', 'Tuo ', 'Diao ', 'Ji ', 'Xu ', 'E ', 'E ', 'Sha ', 'Hang ', 'Tun ', 'Mo ', 'Jie ', 'Shen ', 'Fan ', 'Yuan ', 'Bi ', 'Lu ', 'Wen ', 'Hu ', 'Lu ', 'Za ', 'Fang ', 'Fen ', 'Na ', 'You ', 'Namazu ', 'Todo ', 'He ', 'Xia ', 'Qu ', 'Han ', 'Pi ', 'Ling ', 'Tuo ', 'Bo ', 'Qiu ', 'Ping ', 'Fu ', 'Bi ', 'Ji ', 'Wei ', 'Ju ', 'Diao ', 'Bo ', 'You ', 'Gun ', 'Pi ', 'Nian ', 'Xing ', 'Tai ', 'Bao ', 'Fu ', 'Zha ', 'Ju ', 'Gu ', 'Kajika ', 'Tong ', '[?] ', 'Ta ', 'Jie ', 'Shu ', 'Hou ', 'Xiang ', 'Er ', 'An ', 'Wei ', 'Tiao ', 'Zhu ', 'Yin ', 'Lie ', 'Luo ', 'Tong ', 'Yi ', 'Qi ', 'Bing ', 'Wei ', 'Jiao ', 'Bu ', 'Gui ', 'Xian ', 'Ge ', 'Hui ', 'Bora ', 'Mate ', 'Kao ', 'Gori ', 'Duo ', 'Jun ', 'Ti ', 'Man ', 'Xiao ', 'Za ', 'Sha ', 'Qin ', 'Yu ', 'Nei ', 'Zhe ', 'Gun ', 'Geng ', 'Su ', 'Wu ', 'Qiu ', 'Ting ', 'Fu ', 'Wan ', 'You ', 'Li ', 'Sha ', 'Sha ', 'Gao ', 'Meng ', 'Ugui ', 'Asari ', 'Subashiri ', 'Kazunoko ', 'Yong ', 'Ni ', 'Zi ', 'Qi ', 'Qing ', 'Xiang ', 'Nei ', 'Chun ', 'Ji ', 'Diao ', 'Qie ', 'Gu ', 'Zhou ', 'Dong ', 'Lai ', 'Fei ', 'Ni ', 'Yi ', 'Kun ', 'Lu ', 'Jiu ', 'Chang ', 'Jing ', 'Lun ', 'Ling ', 'Zou ', 'Li ', 'Meng ', 'Zong ', 'Zhi ', 'Nian ', 'Shachi ', 'Dojou ', 'Sukesou ', 'Shi ', 'Shen ', 'Hun ', 'Shi ', 'Hou ', 'Xing ', 'Zhu ', 'La ', 'Zong ', 'Ji ', 'Bian ', 'Bian '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php
new file mode 100644
index 000000000..b5fcafc8f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php
@@ -0,0 +1 @@
+<?php return ['Huan ', 'Quan ', 'Ze ', 'Wei ', 'Wei ', 'Yu ', 'Qun ', 'Rou ', 'Die ', 'Huang ', 'Lian ', 'Yan ', 'Qiu ', 'Qiu ', 'Jian ', 'Bi ', 'E ', 'Yang ', 'Fu ', 'Sai ', 'Jian ', 'Xia ', 'Tuo ', 'Hu ', 'Muroaji ', 'Ruo ', 'Haraka ', 'Wen ', 'Jian ', 'Hao ', 'Wu ', 'Fang ', 'Sao ', 'Liu ', 'Ma ', 'Shi ', 'Shi ', 'Yin ', 'Z ', 'Teng ', 'Ta ', 'Yao ', 'Ge ', 'Rong ', 'Qian ', 'Qi ', 'Wen ', 'Ruo ', 'Hatahata ', 'Lian ', 'Ao ', 'Le ', 'Hui ', 'Min ', 'Ji ', 'Tiao ', 'Qu ', 'Jian ', 'Sao ', 'Man ', 'Xi ', 'Qiu ', 'Biao ', 'Ji ', 'Ji ', 'Zhu ', 'Jiang ', 'Qiu ', 'Zhuan ', 'Yong ', 'Zhang ', 'Kang ', 'Xue ', 'Bie ', 'Jue ', 'Qu ', 'Xiang ', 'Bo ', 'Jiao ', 'Xun ', 'Su ', 'Huang ', 'Zun ', 'Shan ', 'Shan ', 'Fan ', 'Jue ', 'Lin ', 'Xun ', 'Miao ', 'Xi ', 'Eso ', 'Kyou ', 'Fen ', 'Guan ', 'Hou ', 'Kuai ', 'Zei ', 'Sao ', 'Zhan ', 'Gan ', 'Gui ', 'Sheng ', 'Li ', 'Chang ', 'Hatahata ', 'Shiira ', 'Mutsu ', 'Ru ', 'Ji ', 'Xu ', 'Huo ', 'Shiira ', 'Li ', 'Lie ', 'Li ', 'Mie ', 'Zhen ', 'Xiang ', 'E ', 'Lu ', 'Guan ', 'Li ', 'Xian ', 'Yu ', 'Dao ', 'Ji ', 'You ', 'Tun ', 'Lu ', 'Fang ', 'Ba ', 'He ', 'Bo ', 'Ping ', 'Nian ', 'Lu ', 'You ', 'Zha ', 'Fu ', 'Bo ', 'Bao ', 'Hou ', 'Pi ', 'Tai ', 'Gui ', 'Jie ', 'Kao ', 'Wei ', 'Er ', 'Tong ', 'Ze ', 'Hou ', 'Kuai ', 'Ji ', 'Jiao ', 'Xian ', 'Za ', 'Xiang ', 'Xun ', 'Geng ', 'Li ', 'Lian ', 'Jian ', 'Li ', 'Shi ', 'Tiao ', 'Gun ', 'Sha ', 'Wan ', 'Jun ', 'Ji ', 'Yong ', 'Qing ', 'Ling ', 'Qi ', 'Zou ', 'Fei ', 'Kun ', 'Chang ', 'Gu ', 'Ni ', 'Nian ', 'Diao ', 'Jing ', 'Shen ', 'Shi ', 'Zi ', 'Fen ', 'Die ', 'Bi ', 'Chang ', 'Shi ', 'Wen ', 'Wei ', 'Sai ', 'E ', 'Qiu ', 'Fu ', 'Huang ', 'Quan ', 'Jiang ', 'Bian ', 'Sao ', 'Ao ', 'Qi ', 'Ta ', 'Yin ', 'Yao ', 'Fang ', 'Jian ', 'Le ', 'Biao ', 'Xue ', 'Bie ', 'Man ', 'Min ', 'Yong ', 'Wei ', 'Xi ', 'Jue ', 'Shan ', 'Lin ', 'Zun ', 'Huo ', 'Gan ', 'Li ', 'Zhan ', 'Guan ', 'Niao ', 'Yi ', 'Fu ', 'Li ', 'Jiu ', 'Bu ', 'Yan ', 'Fu ', 'Diao ', 'Ji ', 'Feng ', 'Nio ', 'Gan ', 'Shi ', 'Feng ', 'Ming ', 'Bao ', 'Yuan ', 'Zhi ', 'Hu ', 'Qin ', 'Fu ', 'Fen ', 'Wen ', 'Jian ', 'Shi ', 'Yu '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php
new file mode 100644
index 000000000..517da07cb
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php
@@ -0,0 +1 @@
+<?php return ['Fou ', 'Yiao ', 'Jue ', 'Jue ', 'Pi ', 'Huan ', 'Zhen ', 'Bao ', 'Yan ', 'Ya ', 'Zheng ', 'Fang ', 'Feng ', 'Wen ', 'Ou ', 'Te ', 'Jia ', 'Nu ', 'Ling ', 'Mie ', 'Fu ', 'Tuo ', 'Wen ', 'Li ', 'Bian ', 'Zhi ', 'Ge ', 'Yuan ', 'Zi ', 'Qu ', 'Xiao ', 'Zhi ', 'Dan ', 'Ju ', 'You ', 'Gu ', 'Zhong ', 'Yu ', 'Yang ', 'Rong ', 'Ya ', 'Tie ', 'Yu ', 'Shigi ', 'Ying ', 'Zhui ', 'Wu ', 'Er ', 'Gua ', 'Ai ', 'Zhi ', 'Yan ', 'Heng ', 'Jiao ', 'Ji ', 'Lie ', 'Zhu ', 'Ren ', 'Yi ', 'Hong ', 'Luo ', 'Ru ', 'Mou ', 'Ge ', 'Ren ', 'Jiao ', 'Xiu ', 'Zhou ', 'Zhi ', 'Luo ', 'Chidori ', 'Toki ', 'Ten ', 'Luan ', 'Jia ', 'Ji ', 'Yu ', 'Huan ', 'Tuo ', 'Bu ', 'Wu ', 'Juan ', 'Yu ', 'Bo ', 'Xun ', 'Xun ', 'Bi ', 'Xi ', 'Jun ', 'Ju ', 'Tu ', 'Jing ', 'Ti ', 'E ', 'E ', 'Kuang ', 'Hu ', 'Wu ', 'Shen ', 'Lai ', 'Ikaruga ', 'Kakesu ', 'Lu ', 'Ping ', 'Shu ', 'Fu ', 'An ', 'Zhao ', 'Peng ', 'Qin ', 'Qian ', 'Bei ', 'Diao ', 'Lu ', 'Que ', 'Jian ', 'Ju ', 'Tu ', 'Ya ', 'Yuan ', 'Qi ', 'Li ', 'Ye ', 'Zhui ', 'Kong ', 'Zhui ', 'Kun ', 'Sheng ', 'Qi ', 'Jing ', 'Yi ', 'Yi ', 'Jing ', 'Zi ', 'Lai ', 'Dong ', 'Qi ', 'Chun ', 'Geng ', 'Ju ', 'Qu ', 'Isuka ', 'Kikuitadaki ', 'Ji ', 'Shu ', '[?] ', 'Chi ', 'Miao ', 'Rou ', 'An ', 'Qiu ', 'Ti ', 'Hu ', 'Ti ', 'E ', 'Jie ', 'Mao ', 'Fu ', 'Chun ', 'Tu ', 'Yan ', 'He ', 'Yuan ', 'Pian ', 'Yun ', 'Mei ', 'Hu ', 'Ying ', 'Dun ', 'Mu ', 'Ju ', 'Tsugumi ', 'Cang ', 'Fang ', 'Gu ', 'Ying ', 'Yuan ', 'Xuan ', 'Weng ', 'Shi ', 'He ', 'Chu ', 'Tang ', 'Xia ', 'Ruo ', 'Liu ', 'Ji ', 'Gu ', 'Jian ', 'Zhun ', 'Han ', 'Zi ', 'Zi ', 'Ni ', 'Yao ', 'Yan ', 'Ji ', 'Li ', 'Tian ', 'Kou ', 'Ti ', 'Ti ', 'Ni ', 'Tu ', 'Ma ', 'Jiao ', 'Gao ', 'Tian ', 'Chen ', 'Li ', 'Zhuan ', 'Zhe ', 'Ao ', 'Yao ', 'Yi ', 'Ou ', 'Chi ', 'Zhi ', 'Liao ', 'Rong ', 'Lou ', 'Bi ', 'Shuang ', 'Zhuo ', 'Yu ', 'Wu ', 'Jue ', 'Yin ', 'Quan ', 'Si ', 'Jiao ', 'Yi ', 'Hua ', 'Bi ', 'Ying ', 'Su ', 'Huang ', 'Fan ', 'Jiao ', 'Liao ', 'Yan ', 'Kao ', 'Jiu ', 'Xian ', 'Xian ', 'Tu ', 'Mai ', 'Zun ', 'Yu ', 'Ying ', 'Lu ', 'Tuan ', 'Xian ', 'Xue ', 'Yi ', 'Pi '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php
new file mode 100644
index 000000000..4301b06cd
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php
@@ -0,0 +1 @@
+<?php return ['Shu ', 'Luo ', 'Qi ', 'Yi ', 'Ji ', 'Zhe ', 'Yu ', 'Zhan ', 'Ye ', 'Yang ', 'Pi ', 'Ning ', 'Huo ', 'Mi ', 'Ying ', 'Meng ', 'Di ', 'Yue ', 'Yu ', 'Lei ', 'Bao ', 'Lu ', 'He ', 'Long ', 'Shuang ', 'Yue ', 'Ying ', 'Guan ', 'Qu ', 'Li ', 'Luan ', 'Niao ', 'Jiu ', 'Ji ', 'Yuan ', 'Ming ', 'Shi ', 'Ou ', 'Ya ', 'Cang ', 'Bao ', 'Zhen ', 'Gu ', 'Dong ', 'Lu ', 'Ya ', 'Xiao ', 'Yang ', 'Ling ', 'Zhi ', 'Qu ', 'Yuan ', 'Xue ', 'Tuo ', 'Si ', 'Zhi ', 'Er ', 'Gua ', 'Xiu ', 'Heng ', 'Zhou ', 'Ge ', 'Luan ', 'Hong ', 'Wu ', 'Bo ', 'Li ', 'Juan ', 'Hu ', 'E ', 'Yu ', 'Xian ', 'Ti ', 'Wu ', 'Que ', 'Miao ', 'An ', 'Kun ', 'Bei ', 'Peng ', 'Qian ', 'Chun ', 'Geng ', 'Yuan ', 'Su ', 'Hu ', 'He ', 'E ', 'Gu ', 'Qiu ', 'Zi ', 'Mei ', 'Mu ', 'Ni ', 'Yao ', 'Weng ', 'Liu ', 'Ji ', 'Ni ', 'Jian ', 'He ', 'Yi ', 'Ying ', 'Zhe ', 'Liao ', 'Liao ', 'Jiao ', 'Jiu ', 'Yu ', 'Lu ', 'Xuan ', 'Zhan ', 'Ying ', 'Huo ', 'Meng ', 'Guan ', 'Shuang ', 'Lu ', 'Jin ', 'Ling ', 'Jian ', 'Xian ', 'Cuo ', 'Jian ', 'Jian ', 'Yan ', 'Cuo ', 'Lu ', 'You ', 'Cu ', 'Ji ', 'Biao ', 'Cu ', 'Biao ', 'Zhu ', 'Jun ', 'Zhu ', 'Jian ', 'Mi ', 'Mi ', 'Wu ', 'Liu ', 'Chen ', 'Jun ', 'Lin ', 'Ni ', 'Qi ', 'Lu ', 'Jiu ', 'Jun ', 'Jing ', 'Li ', 'Xiang ', 'Yan ', 'Jia ', 'Mi ', 'Li ', 'She ', 'Zhang ', 'Lin ', 'Jing ', 'Ji ', 'Ling ', 'Yan ', 'Cu ', 'Mai ', 'Mai ', 'Ge ', 'Chao ', 'Fu ', 'Mian ', 'Mian ', 'Fu ', 'Pao ', 'Qu ', 'Qu ', 'Mou ', 'Fu ', 'Xian ', 'Lai ', 'Qu ', 'Mian ', '[?] ', 'Feng ', 'Fu ', 'Qu ', 'Mian ', 'Ma ', 'Mo ', 'Mo ', 'Hui ', 'Ma ', 'Zou ', 'Nen ', 'Fen ', 'Huang ', 'Huang ', 'Jin ', 'Guang ', 'Tian ', 'Tou ', 'Heng ', 'Xi ', 'Kuang ', 'Heng ', 'Shu ', 'Li ', 'Nian ', 'Chi ', 'Hei ', 'Hei ', 'Yi ', 'Qian ', 'Dan ', 'Xi ', 'Tuan ', 'Mo ', 'Mo ', 'Qian ', 'Dai ', 'Chu ', 'You ', 'Dian ', 'Yi ', 'Xia ', 'Yan ', 'Qu ', 'Mei ', 'Yan ', 'Jing ', 'Yu ', 'Li ', 'Dang ', 'Du ', 'Can ', 'Yin ', 'An ', 'Yan ', 'Tan ', 'An ', 'Zhen ', 'Dai ', 'Can ', 'Yi ', 'Mei ', 'Dan ', 'Yan ', 'Du ', 'Lu ', 'Zhi ', 'Fen ', 'Fu ', 'Fu ', 'Min ', 'Min ', 'Yuan '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php
new file mode 100644
index 000000000..52ee6cf84
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php
@@ -0,0 +1 @@
+<?php return ['Cu ', 'Qu ', 'Chao ', 'Wa ', 'Zhu ', 'Zhi ', 'Mang ', 'Ao ', 'Bie ', 'Tuo ', 'Bi ', 'Yuan ', 'Chao ', 'Tuo ', 'Ding ', 'Mi ', 'Nai ', 'Ding ', 'Zi ', 'Gu ', 'Gu ', 'Dong ', 'Fen ', 'Tao ', 'Yuan ', 'Pi ', 'Chang ', 'Gao ', 'Qi ', 'Yuan ', 'Tang ', 'Teng ', 'Shu ', 'Shu ', 'Fen ', 'Fei ', 'Wen ', 'Ba ', 'Diao ', 'Tuo ', 'Tong ', 'Qu ', 'Sheng ', 'Shi ', 'You ', 'Shi ', 'Ting ', 'Wu ', 'Nian ', 'Jing ', 'Hun ', 'Ju ', 'Yan ', 'Tu ', 'Ti ', 'Xi ', 'Xian ', 'Yan ', 'Lei ', 'Bi ', 'Yao ', 'Qiu ', 'Han ', 'Wu ', 'Wu ', 'Hou ', 'Xi ', 'Ge ', 'Zha ', 'Xiu ', 'Weng ', 'Zha ', 'Nong ', 'Nang ', 'Qi ', 'Zhai ', 'Ji ', 'Zi ', 'Ji ', 'Ji ', 'Qi ', 'Ji ', 'Chi ', 'Chen ', 'Chen ', 'He ', 'Ya ', 'Ken ', 'Xie ', 'Pao ', 'Cuo ', 'Shi ', 'Zi ', 'Chi ', 'Nian ', 'Ju ', 'Tiao ', 'Ling ', 'Ling ', 'Chu ', 'Quan ', 'Xie ', 'Ken ', 'Nie ', 'Jiu ', 'Yao ', 'Chuo ', 'Kun ', 'Yu ', 'Chu ', 'Yi ', 'Ni ', 'Cuo ', 'Zou ', 'Qu ', 'Nen ', 'Xian ', 'Ou ', 'E ', 'Wo ', 'Yi ', 'Chuo ', 'Zou ', 'Dian ', 'Chu ', 'Jin ', 'Ya ', 'Chi ', 'Chen ', 'He ', 'Ken ', 'Ju ', 'Ling ', 'Pao ', 'Tiao ', 'Zi ', 'Ken ', 'Yu ', 'Chuo ', 'Qu ', 'Wo ', 'Long ', 'Pang ', 'Gong ', 'Pang ', 'Yan ', 'Long ', 'Long ', 'Gong ', 'Kan ', 'Ta ', 'Ling ', 'Ta ', 'Long ', 'Gong ', 'Kan ', 'Gui ', 'Qiu ', 'Bie ', 'Gui ', 'Yue ', 'Chui ', 'He ', 'Jue ', 'Xie ', 'Yu ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php
new file mode 100644
index 000000000..4b8afddf6
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php
@@ -0,0 +1 @@
+<?php return ['it', 'ix', 'i', 'ip', 'iet', 'iex', 'ie', 'iep', 'at', 'ax', 'a', 'ap', 'uox', 'uo', 'uop', 'ot', 'ox', 'o', 'op', 'ex', 'e', 'wu', 'bit', 'bix', 'bi', 'bip', 'biet', 'biex', 'bie', 'biep', 'bat', 'bax', 'ba', 'bap', 'buox', 'buo', 'buop', 'bot', 'box', 'bo', 'bop', 'bex', 'be', 'bep', 'but', 'bux', 'bu', 'bup', 'burx', 'bur', 'byt', 'byx', 'by', 'byp', 'byrx', 'byr', 'pit', 'pix', 'pi', 'pip', 'piex', 'pie', 'piep', 'pat', 'pax', 'pa', 'pap', 'puox', 'puo', 'puop', 'pot', 'pox', 'po', 'pop', 'put', 'pux', 'pu', 'pup', 'purx', 'pur', 'pyt', 'pyx', 'py', 'pyp', 'pyrx', 'pyr', 'bbit', 'bbix', 'bbi', 'bbip', 'bbiet', 'bbiex', 'bbie', 'bbiep', 'bbat', 'bbax', 'bba', 'bbap', 'bbuox', 'bbuo', 'bbuop', 'bbot', 'bbox', 'bbo', 'bbop', 'bbex', 'bbe', 'bbep', 'bbut', 'bbux', 'bbu', 'bbup', 'bburx', 'bbur', 'bbyt', 'bbyx', 'bby', 'bbyp', 'nbit', 'nbix', 'nbi', 'nbip', 'nbiex', 'nbie', 'nbiep', 'nbat', 'nbax', 'nba', 'nbap', 'nbot', 'nbox', 'nbo', 'nbop', 'nbut', 'nbux', 'nbu', 'nbup', 'nburx', 'nbur', 'nbyt', 'nbyx', 'nby', 'nbyp', 'nbyrx', 'nbyr', 'hmit', 'hmix', 'hmi', 'hmip', 'hmiex', 'hmie', 'hmiep', 'hmat', 'hmax', 'hma', 'hmap', 'hmuox', 'hmuo', 'hmuop', 'hmot', 'hmox', 'hmo', 'hmop', 'hmut', 'hmux', 'hmu', 'hmup', 'hmurx', 'hmur', 'hmyx', 'hmy', 'hmyp', 'hmyrx', 'hmyr', 'mit', 'mix', 'mi', 'mip', 'miex', 'mie', 'miep', 'mat', 'max', 'ma', 'map', 'muot', 'muox', 'muo', 'muop', 'mot', 'mox', 'mo', 'mop', 'mex', 'me', 'mut', 'mux', 'mu', 'mup', 'murx', 'mur', 'myt', 'myx', 'my', 'myp', 'fit', 'fix', 'fi', 'fip', 'fat', 'fax', 'fa', 'fap', 'fox', 'fo', 'fop', 'fut', 'fux', 'fu', 'fup', 'furx', 'fur', 'fyt', 'fyx', 'fy', 'fyp', 'vit', 'vix', 'vi', 'vip', 'viet', 'viex', 'vie', 'viep', 'vat', 'vax', 'va', 'vap', 'vot', 'vox', 'vo', 'vop', 'vex', 'vep', 'vut', 'vux', 'vu', 'vup', 'vurx', 'vur', 'vyt', 'vyx', 'vy', 'vyp', 'vyrx', 'vyr'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php
new file mode 100644
index 000000000..c2cf3a18f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php
@@ -0,0 +1 @@
+<?php return ['dit', 'dix', 'di', 'dip', 'diex', 'die', 'diep', 'dat', 'dax', 'da', 'dap', 'duox', 'duo', 'dot', 'dox', 'do', 'dop', 'dex', 'de', 'dep', 'dut', 'dux', 'du', 'dup', 'durx', 'dur', 'tit', 'tix', 'ti', 'tip', 'tiex', 'tie', 'tiep', 'tat', 'tax', 'ta', 'tap', 'tuot', 'tuox', 'tuo', 'tuop', 'tot', 'tox', 'to', 'top', 'tex', 'te', 'tep', 'tut', 'tux', 'tu', 'tup', 'turx', 'tur', 'ddit', 'ddix', 'ddi', 'ddip', 'ddiex', 'ddie', 'ddiep', 'ddat', 'ddax', 'dda', 'ddap', 'dduox', 'dduo', 'dduop', 'ddot', 'ddox', 'ddo', 'ddop', 'ddex', 'dde', 'ddep', 'ddut', 'ddux', 'ddu', 'ddup', 'ddurx', 'ddur', 'ndit', 'ndix', 'ndi', 'ndip', 'ndiex', 'ndie', 'ndat', 'ndax', 'nda', 'ndap', 'ndot', 'ndox', 'ndo', 'ndop', 'ndex', 'nde', 'ndep', 'ndut', 'ndux', 'ndu', 'ndup', 'ndurx', 'ndur', 'hnit', 'hnix', 'hni', 'hnip', 'hniet', 'hniex', 'hnie', 'hniep', 'hnat', 'hnax', 'hna', 'hnap', 'hnuox', 'hnuo', 'hnot', 'hnox', 'hnop', 'hnex', 'hne', 'hnep', 'hnut', 'nit', 'nix', 'ni', 'nip', 'niex', 'nie', 'niep', 'nax', 'na', 'nap', 'nuox', 'nuo', 'nuop', 'not', 'nox', 'no', 'nop', 'nex', 'ne', 'nep', 'nut', 'nux', 'nu', 'nup', 'nurx', 'nur', 'hlit', 'hlix', 'hli', 'hlip', 'hliex', 'hlie', 'hliep', 'hlat', 'hlax', 'hla', 'hlap', 'hluox', 'hluo', 'hluop', 'hlox', 'hlo', 'hlop', 'hlex', 'hle', 'hlep', 'hlut', 'hlux', 'hlu', 'hlup', 'hlurx', 'hlur', 'hlyt', 'hlyx', 'hly', 'hlyp', 'hlyrx', 'hlyr', 'lit', 'lix', 'li', 'lip', 'liet', 'liex', 'lie', 'liep', 'lat', 'lax', 'la', 'lap', 'luot', 'luox', 'luo', 'luop', 'lot', 'lox', 'lo', 'lop', 'lex', 'le', 'lep', 'lut', 'lux', 'lu', 'lup', 'lurx', 'lur', 'lyt', 'lyx', 'ly', 'lyp', 'lyrx', 'lyr', 'git', 'gix', 'gi', 'gip', 'giet', 'giex', 'gie', 'giep', 'gat', 'gax', 'ga', 'gap', 'guot', 'guox', 'guo', 'guop', 'got', 'gox', 'go', 'gop', 'get', 'gex', 'ge', 'gep', 'gut', 'gux', 'gu', 'gup', 'gurx', 'gur', 'kit', 'kix', 'ki', 'kip', 'kiex', 'kie', 'kiep', 'kat'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php
new file mode 100644
index 000000000..ad32b8483
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php
@@ -0,0 +1 @@
+<?php return ['kax', 'ka', 'kap', 'kuox', 'kuo', 'kuop', 'kot', 'kox', 'ko', 'kop', 'ket', 'kex', 'ke', 'kep', 'kut', 'kux', 'ku', 'kup', 'kurx', 'kur', 'ggit', 'ggix', 'ggi', 'ggiex', 'ggie', 'ggiep', 'ggat', 'ggax', 'gga', 'ggap', 'gguot', 'gguox', 'gguo', 'gguop', 'ggot', 'ggox', 'ggo', 'ggop', 'gget', 'ggex', 'gge', 'ggep', 'ggut', 'ggux', 'ggu', 'ggup', 'ggurx', 'ggur', 'mgiex', 'mgie', 'mgat', 'mgax', 'mga', 'mgap', 'mguox', 'mguo', 'mguop', 'mgot', 'mgox', 'mgo', 'mgop', 'mgex', 'mge', 'mgep', 'mgut', 'mgux', 'mgu', 'mgup', 'mgurx', 'mgur', 'hxit', 'hxix', 'hxi', 'hxip', 'hxiet', 'hxiex', 'hxie', 'hxiep', 'hxat', 'hxax', 'hxa', 'hxap', 'hxuot', 'hxuox', 'hxuo', 'hxuop', 'hxot', 'hxox', 'hxo', 'hxop', 'hxex', 'hxe', 'hxep', 'ngiex', 'ngie', 'ngiep', 'ngat', 'ngax', 'nga', 'ngap', 'nguot', 'nguox', 'nguo', 'ngot', 'ngox', 'ngo', 'ngop', 'ngex', 'nge', 'ngep', 'hit', 'hiex', 'hie', 'hat', 'hax', 'ha', 'hap', 'huot', 'huox', 'huo', 'huop', 'hot', 'hox', 'ho', 'hop', 'hex', 'he', 'hep', 'wat', 'wax', 'wa', 'wap', 'wuox', 'wuo', 'wuop', 'wox', 'wo', 'wop', 'wex', 'we', 'wep', 'zit', 'zix', 'zi', 'zip', 'ziex', 'zie', 'ziep', 'zat', 'zax', 'za', 'zap', 'zuox', 'zuo', 'zuop', 'zot', 'zox', 'zo', 'zop', 'zex', 'ze', 'zep', 'zut', 'zux', 'zu', 'zup', 'zurx', 'zur', 'zyt', 'zyx', 'zy', 'zyp', 'zyrx', 'zyr', 'cit', 'cix', 'ci', 'cip', 'ciet', 'ciex', 'cie', 'ciep', 'cat', 'cax', 'ca', 'cap', 'cuox', 'cuo', 'cuop', 'cot', 'cox', 'co', 'cop', 'cex', 'ce', 'cep', 'cut', 'cux', 'cu', 'cup', 'curx', 'cur', 'cyt', 'cyx', 'cy', 'cyp', 'cyrx', 'cyr', 'zzit', 'zzix', 'zzi', 'zzip', 'zziet', 'zziex', 'zzie', 'zziep', 'zzat', 'zzax', 'zza', 'zzap', 'zzox', 'zzo', 'zzop', 'zzex', 'zze', 'zzep', 'zzux', 'zzu', 'zzup', 'zzurx', 'zzur', 'zzyt', 'zzyx', 'zzy', 'zzyp', 'zzyrx', 'zzyr', 'nzit', 'nzix', 'nzi', 'nzip', 'nziex', 'nzie', 'nziep', 'nzat', 'nzax', 'nza', 'nzap', 'nzuox', 'nzuo', 'nzox', 'nzop', 'nzex', 'nze', 'nzux', 'nzu'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php
new file mode 100644
index 000000000..a56a8ed5b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php
@@ -0,0 +1 @@
+<?php return ['nzup', 'nzurx', 'nzur', 'nzyt', 'nzyx', 'nzy', 'nzyp', 'nzyrx', 'nzyr', 'sit', 'six', 'si', 'sip', 'siex', 'sie', 'siep', 'sat', 'sax', 'sa', 'sap', 'suox', 'suo', 'suop', 'sot', 'sox', 'so', 'sop', 'sex', 'se', 'sep', 'sut', 'sux', 'su', 'sup', 'surx', 'sur', 'syt', 'syx', 'sy', 'syp', 'syrx', 'syr', 'ssit', 'ssix', 'ssi', 'ssip', 'ssiex', 'ssie', 'ssiep', 'ssat', 'ssax', 'ssa', 'ssap', 'ssot', 'ssox', 'sso', 'ssop', 'ssex', 'sse', 'ssep', 'ssut', 'ssux', 'ssu', 'ssup', 'ssyt', 'ssyx', 'ssy', 'ssyp', 'ssyrx', 'ssyr', 'zhat', 'zhax', 'zha', 'zhap', 'zhuox', 'zhuo', 'zhuop', 'zhot', 'zhox', 'zho', 'zhop', 'zhet', 'zhex', 'zhe', 'zhep', 'zhut', 'zhux', 'zhu', 'zhup', 'zhurx', 'zhur', 'zhyt', 'zhyx', 'zhy', 'zhyp', 'zhyrx', 'zhyr', 'chat', 'chax', 'cha', 'chap', 'chuot', 'chuox', 'chuo', 'chuop', 'chot', 'chox', 'cho', 'chop', 'chet', 'chex', 'che', 'chep', 'chux', 'chu', 'chup', 'churx', 'chur', 'chyt', 'chyx', 'chy', 'chyp', 'chyrx', 'chyr', 'rrax', 'rra', 'rruox', 'rruo', 'rrot', 'rrox', 'rro', 'rrop', 'rret', 'rrex', 'rre', 'rrep', 'rrut', 'rrux', 'rru', 'rrup', 'rrurx', 'rrur', 'rryt', 'rryx', 'rry', 'rryp', 'rryrx', 'rryr', 'nrat', 'nrax', 'nra', 'nrap', 'nrox', 'nro', 'nrop', 'nret', 'nrex', 'nre', 'nrep', 'nrut', 'nrux', 'nru', 'nrup', 'nrurx', 'nrur', 'nryt', 'nryx', 'nry', 'nryp', 'nryrx', 'nryr', 'shat', 'shax', 'sha', 'shap', 'shuox', 'shuo', 'shuop', 'shot', 'shox', 'sho', 'shop', 'shet', 'shex', 'she', 'shep', 'shut', 'shux', 'shu', 'shup', 'shurx', 'shur', 'shyt', 'shyx', 'shy', 'shyp', 'shyrx', 'shyr', 'rat', 'rax', 'ra', 'rap', 'ruox', 'ruo', 'ruop', 'rot', 'rox', 'ro', 'rop', 'rex', 're', 'rep', 'rut', 'rux', 'ru', 'rup', 'rurx', 'rur', 'ryt', 'ryx', 'ry', 'ryp', 'ryrx', 'ryr', 'jit', 'jix', 'ji', 'jip', 'jiet', 'jiex', 'jie', 'jiep', 'juot', 'juox', 'juo', 'juop', 'jot', 'jox', 'jo', 'jop', 'jut', 'jux', 'ju', 'jup', 'jurx', 'jur', 'jyt', 'jyx', 'jy', 'jyp', 'jyrx', 'jyr', 'qit', 'qix', 'qi', 'qip'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php
new file mode 100644
index 000000000..2fa588390
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php
@@ -0,0 +1 @@
+<?php return ['qiet', 'qiex', 'qie', 'qiep', 'quot', 'quox', 'quo', 'quop', 'qot', 'qox', 'qo', 'qop', 'qut', 'qux', 'qu', 'qup', 'qurx', 'qur', 'qyt', 'qyx', 'qy', 'qyp', 'qyrx', 'qyr', 'jjit', 'jjix', 'jji', 'jjip', 'jjiet', 'jjiex', 'jjie', 'jjiep', 'jjuox', 'jjuo', 'jjuop', 'jjot', 'jjox', 'jjo', 'jjop', 'jjut', 'jjux', 'jju', 'jjup', 'jjurx', 'jjur', 'jjyt', 'jjyx', 'jjy', 'jjyp', 'njit', 'njix', 'nji', 'njip', 'njiet', 'njiex', 'njie', 'njiep', 'njuox', 'njuo', 'njot', 'njox', 'njo', 'njop', 'njux', 'nju', 'njup', 'njurx', 'njur', 'njyt', 'njyx', 'njy', 'njyp', 'njyrx', 'njyr', 'nyit', 'nyix', 'nyi', 'nyip', 'nyiet', 'nyiex', 'nyie', 'nyiep', 'nyuox', 'nyuo', 'nyuop', 'nyot', 'nyox', 'nyo', 'nyop', 'nyut', 'nyux', 'nyu', 'nyup', 'xit', 'xix', 'xi', 'xip', 'xiet', 'xiex', 'xie', 'xiep', 'xuox', 'xuo', 'xot', 'xox', 'xo', 'xop', 'xyt', 'xyx', 'xy', 'xyp', 'xyrx', 'xyr', 'yit', 'yix', 'yi', 'yip', 'yiet', 'yiex', 'yie', 'yiep', 'yuot', 'yuox', 'yuo', 'yuop', 'yot', 'yox', 'yo', 'yop', 'yut', 'yux', 'yu', 'yup', 'yurx', 'yur', 'yyt', 'yyx', 'yy', 'yyp', 'yyrx', 'yyr', '[?]', '[?]', '[?]', 'Qot', 'Li', 'Kit', 'Nyip', 'Cyp', 'Ssi', 'Ggop', 'Gep', 'Mi', 'Hxit', 'Lyr', 'Bbut', 'Mop', 'Yo', 'Put', 'Hxuo', 'Tat', 'Ga', '[?]', '[?]', 'Ddur', 'Bur', 'Gguo', 'Nyop', 'Tu', 'Op', 'Jjut', 'Zot', 'Pyt', 'Hmo', 'Yit', 'Vur', 'Shy', 'Vep', 'Za', 'Jo', '[?]', 'Jjy', 'Got', 'Jjie', 'Wo', 'Du', 'Shur', 'Lie', 'Cy', 'Cuop', 'Cip', 'Hxop', 'Shat', '[?]', 'Shop', 'Che', 'Zziet', '[?]', 'Ke', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php
new file mode 100644
index 000000000..98a9bfd58
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php
@@ -0,0 +1 @@
+<?php return ['ga', 'gag', 'gagg', 'gags', 'gan', 'ganj', 'ganh', 'gad', 'gal', 'galg', 'galm', 'galb', 'gals', 'galt', 'galp', 'galh', 'gam', 'gab', 'gabs', 'gas', 'gass', 'gang', 'gaj', 'gac', 'gak', 'gat', 'gap', 'gah', 'gae', 'gaeg', 'gaegg', 'gaegs', 'gaen', 'gaenj', 'gaenh', 'gaed', 'gael', 'gaelg', 'gaelm', 'gaelb', 'gaels', 'gaelt', 'gaelp', 'gaelh', 'gaem', 'gaeb', 'gaebs', 'gaes', 'gaess', 'gaeng', 'gaej', 'gaec', 'gaek', 'gaet', 'gaep', 'gaeh', 'gya', 'gyag', 'gyagg', 'gyags', 'gyan', 'gyanj', 'gyanh', 'gyad', 'gyal', 'gyalg', 'gyalm', 'gyalb', 'gyals', 'gyalt', 'gyalp', 'gyalh', 'gyam', 'gyab', 'gyabs', 'gyas', 'gyass', 'gyang', 'gyaj', 'gyac', 'gyak', 'gyat', 'gyap', 'gyah', 'gyae', 'gyaeg', 'gyaegg', 'gyaegs', 'gyaen', 'gyaenj', 'gyaenh', 'gyaed', 'gyael', 'gyaelg', 'gyaelm', 'gyaelb', 'gyaels', 'gyaelt', 'gyaelp', 'gyaelh', 'gyaem', 'gyaeb', 'gyaebs', 'gyaes', 'gyaess', 'gyaeng', 'gyaej', 'gyaec', 'gyaek', 'gyaet', 'gyaep', 'gyaeh', 'geo', 'geog', 'geogg', 'geogs', 'geon', 'geonj', 'geonh', 'geod', 'geol', 'geolg', 'geolm', 'geolb', 'geols', 'geolt', 'geolp', 'geolh', 'geom', 'geob', 'geobs', 'geos', 'geoss', 'geong', 'geoj', 'geoc', 'geok', 'geot', 'geop', 'geoh', 'ge', 'geg', 'gegg', 'gegs', 'gen', 'genj', 'genh', 'ged', 'gel', 'gelg', 'gelm', 'gelb', 'gels', 'gelt', 'gelp', 'gelh', 'gem', 'geb', 'gebs', 'ges', 'gess', 'geng', 'gej', 'gec', 'gek', 'get', 'gep', 'geh', 'gyeo', 'gyeog', 'gyeogg', 'gyeogs', 'gyeon', 'gyeonj', 'gyeonh', 'gyeod', 'gyeol', 'gyeolg', 'gyeolm', 'gyeolb', 'gyeols', 'gyeolt', 'gyeolp', 'gyeolh', 'gyeom', 'gyeob', 'gyeobs', 'gyeos', 'gyeoss', 'gyeong', 'gyeoj', 'gyeoc', 'gyeok', 'gyeot', 'gyeop', 'gyeoh', 'gye', 'gyeg', 'gyegg', 'gyegs', 'gyen', 'gyenj', 'gyenh', 'gyed', 'gyel', 'gyelg', 'gyelm', 'gyelb', 'gyels', 'gyelt', 'gyelp', 'gyelh', 'gyem', 'gyeb', 'gyebs', 'gyes', 'gyess', 'gyeng', 'gyej', 'gyec', 'gyek', 'gyet', 'gyep', 'gyeh', 'go', 'gog', 'gogg', 'gogs', 'gon', 'gonj', 'gonh', 'god', 'gol', 'golg', 'golm', 'golb', 'gols', 'golt', 'golp', 'golh', 'gom', 'gob', 'gobs', 'gos', 'goss', 'gong', 'goj', 'goc', 'gok', 'got', 'gop', 'goh', 'gwa', 'gwag', 'gwagg', 'gwags'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php
new file mode 100644
index 000000000..8e117c5ab
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php
@@ -0,0 +1 @@
+<?php return ['gwan', 'gwanj', 'gwanh', 'gwad', 'gwal', 'gwalg', 'gwalm', 'gwalb', 'gwals', 'gwalt', 'gwalp', 'gwalh', 'gwam', 'gwab', 'gwabs', 'gwas', 'gwass', 'gwang', 'gwaj', 'gwac', 'gwak', 'gwat', 'gwap', 'gwah', 'gwae', 'gwaeg', 'gwaegg', 'gwaegs', 'gwaen', 'gwaenj', 'gwaenh', 'gwaed', 'gwael', 'gwaelg', 'gwaelm', 'gwaelb', 'gwaels', 'gwaelt', 'gwaelp', 'gwaelh', 'gwaem', 'gwaeb', 'gwaebs', 'gwaes', 'gwaess', 'gwaeng', 'gwaej', 'gwaec', 'gwaek', 'gwaet', 'gwaep', 'gwaeh', 'goe', 'goeg', 'goegg', 'goegs', 'goen', 'goenj', 'goenh', 'goed', 'goel', 'goelg', 'goelm', 'goelb', 'goels', 'goelt', 'goelp', 'goelh', 'goem', 'goeb', 'goebs', 'goes', 'goess', 'goeng', 'goej', 'goec', 'goek', 'goet', 'goep', 'goeh', 'gyo', 'gyog', 'gyogg', 'gyogs', 'gyon', 'gyonj', 'gyonh', 'gyod', 'gyol', 'gyolg', 'gyolm', 'gyolb', 'gyols', 'gyolt', 'gyolp', 'gyolh', 'gyom', 'gyob', 'gyobs', 'gyos', 'gyoss', 'gyong', 'gyoj', 'gyoc', 'gyok', 'gyot', 'gyop', 'gyoh', 'gu', 'gug', 'gugg', 'gugs', 'gun', 'gunj', 'gunh', 'gud', 'gul', 'gulg', 'gulm', 'gulb', 'guls', 'gult', 'gulp', 'gulh', 'gum', 'gub', 'gubs', 'gus', 'guss', 'gung', 'guj', 'guc', 'guk', 'gut', 'gup', 'guh', 'gweo', 'gweog', 'gweogg', 'gweogs', 'gweon', 'gweonj', 'gweonh', 'gweod', 'gweol', 'gweolg', 'gweolm', 'gweolb', 'gweols', 'gweolt', 'gweolp', 'gweolh', 'gweom', 'gweob', 'gweobs', 'gweos', 'gweoss', 'gweong', 'gweoj', 'gweoc', 'gweok', 'gweot', 'gweop', 'gweoh', 'gwe', 'gweg', 'gwegg', 'gwegs', 'gwen', 'gwenj', 'gwenh', 'gwed', 'gwel', 'gwelg', 'gwelm', 'gwelb', 'gwels', 'gwelt', 'gwelp', 'gwelh', 'gwem', 'gweb', 'gwebs', 'gwes', 'gwess', 'gweng', 'gwej', 'gwec', 'gwek', 'gwet', 'gwep', 'gweh', 'gwi', 'gwig', 'gwigg', 'gwigs', 'gwin', 'gwinj', 'gwinh', 'gwid', 'gwil', 'gwilg', 'gwilm', 'gwilb', 'gwils', 'gwilt', 'gwilp', 'gwilh', 'gwim', 'gwib', 'gwibs', 'gwis', 'gwiss', 'gwing', 'gwij', 'gwic', 'gwik', 'gwit', 'gwip', 'gwih', 'gyu', 'gyug', 'gyugg', 'gyugs', 'gyun', 'gyunj', 'gyunh', 'gyud', 'gyul', 'gyulg', 'gyulm', 'gyulb', 'gyuls', 'gyult', 'gyulp', 'gyulh', 'gyum', 'gyub', 'gyubs', 'gyus', 'gyuss', 'gyung', 'gyuj', 'gyuc', 'gyuk', 'gyut', 'gyup', 'gyuh', 'geu', 'geug', 'geugg', 'geugs', 'geun', 'geunj', 'geunh', 'geud'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php
new file mode 100644
index 000000000..05c2e2037
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php
@@ -0,0 +1 @@
+<?php return ['geul', 'geulg', 'geulm', 'geulb', 'geuls', 'geult', 'geulp', 'geulh', 'geum', 'geub', 'geubs', 'geus', 'geuss', 'geung', 'geuj', 'geuc', 'geuk', 'geut', 'geup', 'geuh', 'gyi', 'gyig', 'gyigg', 'gyigs', 'gyin', 'gyinj', 'gyinh', 'gyid', 'gyil', 'gyilg', 'gyilm', 'gyilb', 'gyils', 'gyilt', 'gyilp', 'gyilh', 'gyim', 'gyib', 'gyibs', 'gyis', 'gyiss', 'gying', 'gyij', 'gyic', 'gyik', 'gyit', 'gyip', 'gyih', 'gi', 'gig', 'gigg', 'gigs', 'gin', 'ginj', 'ginh', 'gid', 'gil', 'gilg', 'gilm', 'gilb', 'gils', 'gilt', 'gilp', 'gilh', 'gim', 'gib', 'gibs', 'gis', 'giss', 'ging', 'gij', 'gic', 'gik', 'git', 'gip', 'gih', 'gga', 'ggag', 'ggagg', 'ggags', 'ggan', 'gganj', 'gganh', 'ggad', 'ggal', 'ggalg', 'ggalm', 'ggalb', 'ggals', 'ggalt', 'ggalp', 'ggalh', 'ggam', 'ggab', 'ggabs', 'ggas', 'ggass', 'ggang', 'ggaj', 'ggac', 'ggak', 'ggat', 'ggap', 'ggah', 'ggae', 'ggaeg', 'ggaegg', 'ggaegs', 'ggaen', 'ggaenj', 'ggaenh', 'ggaed', 'ggael', 'ggaelg', 'ggaelm', 'ggaelb', 'ggaels', 'ggaelt', 'ggaelp', 'ggaelh', 'ggaem', 'ggaeb', 'ggaebs', 'ggaes', 'ggaess', 'ggaeng', 'ggaej', 'ggaec', 'ggaek', 'ggaet', 'ggaep', 'ggaeh', 'ggya', 'ggyag', 'ggyagg', 'ggyags', 'ggyan', 'ggyanj', 'ggyanh', 'ggyad', 'ggyal', 'ggyalg', 'ggyalm', 'ggyalb', 'ggyals', 'ggyalt', 'ggyalp', 'ggyalh', 'ggyam', 'ggyab', 'ggyabs', 'ggyas', 'ggyass', 'ggyang', 'ggyaj', 'ggyac', 'ggyak', 'ggyat', 'ggyap', 'ggyah', 'ggyae', 'ggyaeg', 'ggyaegg', 'ggyaegs', 'ggyaen', 'ggyaenj', 'ggyaenh', 'ggyaed', 'ggyael', 'ggyaelg', 'ggyaelm', 'ggyaelb', 'ggyaels', 'ggyaelt', 'ggyaelp', 'ggyaelh', 'ggyaem', 'ggyaeb', 'ggyaebs', 'ggyaes', 'ggyaess', 'ggyaeng', 'ggyaej', 'ggyaec', 'ggyaek', 'ggyaet', 'ggyaep', 'ggyaeh', 'ggeo', 'ggeog', 'ggeogg', 'ggeogs', 'ggeon', 'ggeonj', 'ggeonh', 'ggeod', 'ggeol', 'ggeolg', 'ggeolm', 'ggeolb', 'ggeols', 'ggeolt', 'ggeolp', 'ggeolh', 'ggeom', 'ggeob', 'ggeobs', 'ggeos', 'ggeoss', 'ggeong', 'ggeoj', 'ggeoc', 'ggeok', 'ggeot', 'ggeop', 'ggeoh', 'gge', 'ggeg', 'ggegg', 'ggegs', 'ggen', 'ggenj', 'ggenh', 'gged', 'ggel', 'ggelg', 'ggelm', 'ggelb', 'ggels', 'ggelt', 'ggelp', 'ggelh', 'ggem', 'ggeb', 'ggebs', 'gges', 'ggess', 'ggeng', 'ggej', 'ggec', 'ggek', 'gget', 'ggep', 'ggeh', 'ggyeo', 'ggyeog', 'ggyeogg', 'ggyeogs', 'ggyeon', 'ggyeonj', 'ggyeonh', 'ggyeod', 'ggyeol', 'ggyeolg', 'ggyeolm', 'ggyeolb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php
new file mode 100644
index 000000000..80ac8cf89
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php
@@ -0,0 +1 @@
+<?php return ['ggyeols', 'ggyeolt', 'ggyeolp', 'ggyeolh', 'ggyeom', 'ggyeob', 'ggyeobs', 'ggyeos', 'ggyeoss', 'ggyeong', 'ggyeoj', 'ggyeoc', 'ggyeok', 'ggyeot', 'ggyeop', 'ggyeoh', 'ggye', 'ggyeg', 'ggyegg', 'ggyegs', 'ggyen', 'ggyenj', 'ggyenh', 'ggyed', 'ggyel', 'ggyelg', 'ggyelm', 'ggyelb', 'ggyels', 'ggyelt', 'ggyelp', 'ggyelh', 'ggyem', 'ggyeb', 'ggyebs', 'ggyes', 'ggyess', 'ggyeng', 'ggyej', 'ggyec', 'ggyek', 'ggyet', 'ggyep', 'ggyeh', 'ggo', 'ggog', 'ggogg', 'ggogs', 'ggon', 'ggonj', 'ggonh', 'ggod', 'ggol', 'ggolg', 'ggolm', 'ggolb', 'ggols', 'ggolt', 'ggolp', 'ggolh', 'ggom', 'ggob', 'ggobs', 'ggos', 'ggoss', 'ggong', 'ggoj', 'ggoc', 'ggok', 'ggot', 'ggop', 'ggoh', 'ggwa', 'ggwag', 'ggwagg', 'ggwags', 'ggwan', 'ggwanj', 'ggwanh', 'ggwad', 'ggwal', 'ggwalg', 'ggwalm', 'ggwalb', 'ggwals', 'ggwalt', 'ggwalp', 'ggwalh', 'ggwam', 'ggwab', 'ggwabs', 'ggwas', 'ggwass', 'ggwang', 'ggwaj', 'ggwac', 'ggwak', 'ggwat', 'ggwap', 'ggwah', 'ggwae', 'ggwaeg', 'ggwaegg', 'ggwaegs', 'ggwaen', 'ggwaenj', 'ggwaenh', 'ggwaed', 'ggwael', 'ggwaelg', 'ggwaelm', 'ggwaelb', 'ggwaels', 'ggwaelt', 'ggwaelp', 'ggwaelh', 'ggwaem', 'ggwaeb', 'ggwaebs', 'ggwaes', 'ggwaess', 'ggwaeng', 'ggwaej', 'ggwaec', 'ggwaek', 'ggwaet', 'ggwaep', 'ggwaeh', 'ggoe', 'ggoeg', 'ggoegg', 'ggoegs', 'ggoen', 'ggoenj', 'ggoenh', 'ggoed', 'ggoel', 'ggoelg', 'ggoelm', 'ggoelb', 'ggoels', 'ggoelt', 'ggoelp', 'ggoelh', 'ggoem', 'ggoeb', 'ggoebs', 'ggoes', 'ggoess', 'ggoeng', 'ggoej', 'ggoec', 'ggoek', 'ggoet', 'ggoep', 'ggoeh', 'ggyo', 'ggyog', 'ggyogg', 'ggyogs', 'ggyon', 'ggyonj', 'ggyonh', 'ggyod', 'ggyol', 'ggyolg', 'ggyolm', 'ggyolb', 'ggyols', 'ggyolt', 'ggyolp', 'ggyolh', 'ggyom', 'ggyob', 'ggyobs', 'ggyos', 'ggyoss', 'ggyong', 'ggyoj', 'ggyoc', 'ggyok', 'ggyot', 'ggyop', 'ggyoh', 'ggu', 'ggug', 'ggugg', 'ggugs', 'ggun', 'ggunj', 'ggunh', 'ggud', 'ggul', 'ggulg', 'ggulm', 'ggulb', 'gguls', 'ggult', 'ggulp', 'ggulh', 'ggum', 'ggub', 'ggubs', 'ggus', 'gguss', 'ggung', 'gguj', 'gguc', 'gguk', 'ggut', 'ggup', 'gguh', 'ggweo', 'ggweog', 'ggweogg', 'ggweogs', 'ggweon', 'ggweonj', 'ggweonh', 'ggweod', 'ggweol', 'ggweolg', 'ggweolm', 'ggweolb', 'ggweols', 'ggweolt', 'ggweolp', 'ggweolh', 'ggweom', 'ggweob', 'ggweobs', 'ggweos', 'ggweoss', 'ggweong', 'ggweoj', 'ggweoc', 'ggweok', 'ggweot', 'ggweop', 'ggweoh', 'ggwe', 'ggweg', 'ggwegg', 'ggwegs', 'ggwen', 'ggwenj', 'ggwenh', 'ggwed', 'ggwel', 'ggwelg', 'ggwelm', 'ggwelb', 'ggwels', 'ggwelt', 'ggwelp', 'ggwelh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php
new file mode 100644
index 000000000..916b5f891
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php
@@ -0,0 +1 @@
+<?php return ['ggwem', 'ggweb', 'ggwebs', 'ggwes', 'ggwess', 'ggweng', 'ggwej', 'ggwec', 'ggwek', 'ggwet', 'ggwep', 'ggweh', 'ggwi', 'ggwig', 'ggwigg', 'ggwigs', 'ggwin', 'ggwinj', 'ggwinh', 'ggwid', 'ggwil', 'ggwilg', 'ggwilm', 'ggwilb', 'ggwils', 'ggwilt', 'ggwilp', 'ggwilh', 'ggwim', 'ggwib', 'ggwibs', 'ggwis', 'ggwiss', 'ggwing', 'ggwij', 'ggwic', 'ggwik', 'ggwit', 'ggwip', 'ggwih', 'ggyu', 'ggyug', 'ggyugg', 'ggyugs', 'ggyun', 'ggyunj', 'ggyunh', 'ggyud', 'ggyul', 'ggyulg', 'ggyulm', 'ggyulb', 'ggyuls', 'ggyult', 'ggyulp', 'ggyulh', 'ggyum', 'ggyub', 'ggyubs', 'ggyus', 'ggyuss', 'ggyung', 'ggyuj', 'ggyuc', 'ggyuk', 'ggyut', 'ggyup', 'ggyuh', 'ggeu', 'ggeug', 'ggeugg', 'ggeugs', 'ggeun', 'ggeunj', 'ggeunh', 'ggeud', 'ggeul', 'ggeulg', 'ggeulm', 'ggeulb', 'ggeuls', 'ggeult', 'ggeulp', 'ggeulh', 'ggeum', 'ggeub', 'ggeubs', 'ggeus', 'ggeuss', 'ggeung', 'ggeuj', 'ggeuc', 'ggeuk', 'ggeut', 'ggeup', 'ggeuh', 'ggyi', 'ggyig', 'ggyigg', 'ggyigs', 'ggyin', 'ggyinj', 'ggyinh', 'ggyid', 'ggyil', 'ggyilg', 'ggyilm', 'ggyilb', 'ggyils', 'ggyilt', 'ggyilp', 'ggyilh', 'ggyim', 'ggyib', 'ggyibs', 'ggyis', 'ggyiss', 'ggying', 'ggyij', 'ggyic', 'ggyik', 'ggyit', 'ggyip', 'ggyih', 'ggi', 'ggig', 'ggigg', 'ggigs', 'ggin', 'gginj', 'gginh', 'ggid', 'ggil', 'ggilg', 'ggilm', 'ggilb', 'ggils', 'ggilt', 'ggilp', 'ggilh', 'ggim', 'ggib', 'ggibs', 'ggis', 'ggiss', 'gging', 'ggij', 'ggic', 'ggik', 'ggit', 'ggip', 'ggih', 'na', 'nag', 'nagg', 'nags', 'nan', 'nanj', 'nanh', 'nad', 'nal', 'nalg', 'nalm', 'nalb', 'nals', 'nalt', 'nalp', 'nalh', 'nam', 'nab', 'nabs', 'nas', 'nass', 'nang', 'naj', 'nac', 'nak', 'nat', 'nap', 'nah', 'nae', 'naeg', 'naegg', 'naegs', 'naen', 'naenj', 'naenh', 'naed', 'nael', 'naelg', 'naelm', 'naelb', 'naels', 'naelt', 'naelp', 'naelh', 'naem', 'naeb', 'naebs', 'naes', 'naess', 'naeng', 'naej', 'naec', 'naek', 'naet', 'naep', 'naeh', 'nya', 'nyag', 'nyagg', 'nyags', 'nyan', 'nyanj', 'nyanh', 'nyad', 'nyal', 'nyalg', 'nyalm', 'nyalb', 'nyals', 'nyalt', 'nyalp', 'nyalh', 'nyam', 'nyab', 'nyabs', 'nyas', 'nyass', 'nyang', 'nyaj', 'nyac', 'nyak', 'nyat', 'nyap', 'nyah', 'nyae', 'nyaeg', 'nyaegg', 'nyaegs', 'nyaen', 'nyaenj', 'nyaenh', 'nyaed', 'nyael', 'nyaelg', 'nyaelm', 'nyaelb', 'nyaels', 'nyaelt', 'nyaelp', 'nyaelh', 'nyaem', 'nyaeb', 'nyaebs', 'nyaes'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php
new file mode 100644
index 000000000..727993fc3
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php
@@ -0,0 +1 @@
+<?php return ['nyaess', 'nyaeng', 'nyaej', 'nyaec', 'nyaek', 'nyaet', 'nyaep', 'nyaeh', 'neo', 'neog', 'neogg', 'neogs', 'neon', 'neonj', 'neonh', 'neod', 'neol', 'neolg', 'neolm', 'neolb', 'neols', 'neolt', 'neolp', 'neolh', 'neom', 'neob', 'neobs', 'neos', 'neoss', 'neong', 'neoj', 'neoc', 'neok', 'neot', 'neop', 'neoh', 'ne', 'neg', 'negg', 'negs', 'nen', 'nenj', 'nenh', 'ned', 'nel', 'nelg', 'nelm', 'nelb', 'nels', 'nelt', 'nelp', 'nelh', 'nem', 'neb', 'nebs', 'nes', 'ness', 'neng', 'nej', 'nec', 'nek', 'net', 'nep', 'neh', 'nyeo', 'nyeog', 'nyeogg', 'nyeogs', 'nyeon', 'nyeonj', 'nyeonh', 'nyeod', 'nyeol', 'nyeolg', 'nyeolm', 'nyeolb', 'nyeols', 'nyeolt', 'nyeolp', 'nyeolh', 'nyeom', 'nyeob', 'nyeobs', 'nyeos', 'nyeoss', 'nyeong', 'nyeoj', 'nyeoc', 'nyeok', 'nyeot', 'nyeop', 'nyeoh', 'nye', 'nyeg', 'nyegg', 'nyegs', 'nyen', 'nyenj', 'nyenh', 'nyed', 'nyel', 'nyelg', 'nyelm', 'nyelb', 'nyels', 'nyelt', 'nyelp', 'nyelh', 'nyem', 'nyeb', 'nyebs', 'nyes', 'nyess', 'nyeng', 'nyej', 'nyec', 'nyek', 'nyet', 'nyep', 'nyeh', 'no', 'nog', 'nogg', 'nogs', 'non', 'nonj', 'nonh', 'nod', 'nol', 'nolg', 'nolm', 'nolb', 'nols', 'nolt', 'nolp', 'nolh', 'nom', 'nob', 'nobs', 'nos', 'noss', 'nong', 'noj', 'noc', 'nok', 'not', 'nop', 'noh', 'nwa', 'nwag', 'nwagg', 'nwags', 'nwan', 'nwanj', 'nwanh', 'nwad', 'nwal', 'nwalg', 'nwalm', 'nwalb', 'nwals', 'nwalt', 'nwalp', 'nwalh', 'nwam', 'nwab', 'nwabs', 'nwas', 'nwass', 'nwang', 'nwaj', 'nwac', 'nwak', 'nwat', 'nwap', 'nwah', 'nwae', 'nwaeg', 'nwaegg', 'nwaegs', 'nwaen', 'nwaenj', 'nwaenh', 'nwaed', 'nwael', 'nwaelg', 'nwaelm', 'nwaelb', 'nwaels', 'nwaelt', 'nwaelp', 'nwaelh', 'nwaem', 'nwaeb', 'nwaebs', 'nwaes', 'nwaess', 'nwaeng', 'nwaej', 'nwaec', 'nwaek', 'nwaet', 'nwaep', 'nwaeh', 'noe', 'noeg', 'noegg', 'noegs', 'noen', 'noenj', 'noenh', 'noed', 'noel', 'noelg', 'noelm', 'noelb', 'noels', 'noelt', 'noelp', 'noelh', 'noem', 'noeb', 'noebs', 'noes', 'noess', 'noeng', 'noej', 'noec', 'noek', 'noet', 'noep', 'noeh', 'nyo', 'nyog', 'nyogg', 'nyogs', 'nyon', 'nyonj', 'nyonh', 'nyod', 'nyol', 'nyolg', 'nyolm', 'nyolb', 'nyols', 'nyolt', 'nyolp', 'nyolh', 'nyom', 'nyob', 'nyobs', 'nyos', 'nyoss', 'nyong', 'nyoj', 'nyoc'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php
new file mode 100644
index 000000000..46bef0ac0
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php
@@ -0,0 +1 @@
+<?php return ['nyok', 'nyot', 'nyop', 'nyoh', 'nu', 'nug', 'nugg', 'nugs', 'nun', 'nunj', 'nunh', 'nud', 'nul', 'nulg', 'nulm', 'nulb', 'nuls', 'nult', 'nulp', 'nulh', 'num', 'nub', 'nubs', 'nus', 'nuss', 'nung', 'nuj', 'nuc', 'nuk', 'nut', 'nup', 'nuh', 'nweo', 'nweog', 'nweogg', 'nweogs', 'nweon', 'nweonj', 'nweonh', 'nweod', 'nweol', 'nweolg', 'nweolm', 'nweolb', 'nweols', 'nweolt', 'nweolp', 'nweolh', 'nweom', 'nweob', 'nweobs', 'nweos', 'nweoss', 'nweong', 'nweoj', 'nweoc', 'nweok', 'nweot', 'nweop', 'nweoh', 'nwe', 'nweg', 'nwegg', 'nwegs', 'nwen', 'nwenj', 'nwenh', 'nwed', 'nwel', 'nwelg', 'nwelm', 'nwelb', 'nwels', 'nwelt', 'nwelp', 'nwelh', 'nwem', 'nweb', 'nwebs', 'nwes', 'nwess', 'nweng', 'nwej', 'nwec', 'nwek', 'nwet', 'nwep', 'nweh', 'nwi', 'nwig', 'nwigg', 'nwigs', 'nwin', 'nwinj', 'nwinh', 'nwid', 'nwil', 'nwilg', 'nwilm', 'nwilb', 'nwils', 'nwilt', 'nwilp', 'nwilh', 'nwim', 'nwib', 'nwibs', 'nwis', 'nwiss', 'nwing', 'nwij', 'nwic', 'nwik', 'nwit', 'nwip', 'nwih', 'nyu', 'nyug', 'nyugg', 'nyugs', 'nyun', 'nyunj', 'nyunh', 'nyud', 'nyul', 'nyulg', 'nyulm', 'nyulb', 'nyuls', 'nyult', 'nyulp', 'nyulh', 'nyum', 'nyub', 'nyubs', 'nyus', 'nyuss', 'nyung', 'nyuj', 'nyuc', 'nyuk', 'nyut', 'nyup', 'nyuh', 'neu', 'neug', 'neugg', 'neugs', 'neun', 'neunj', 'neunh', 'neud', 'neul', 'neulg', 'neulm', 'neulb', 'neuls', 'neult', 'neulp', 'neulh', 'neum', 'neub', 'neubs', 'neus', 'neuss', 'neung', 'neuj', 'neuc', 'neuk', 'neut', 'neup', 'neuh', 'nyi', 'nyig', 'nyigg', 'nyigs', 'nyin', 'nyinj', 'nyinh', 'nyid', 'nyil', 'nyilg', 'nyilm', 'nyilb', 'nyils', 'nyilt', 'nyilp', 'nyilh', 'nyim', 'nyib', 'nyibs', 'nyis', 'nyiss', 'nying', 'nyij', 'nyic', 'nyik', 'nyit', 'nyip', 'nyih', 'ni', 'nig', 'nigg', 'nigs', 'nin', 'ninj', 'ninh', 'nid', 'nil', 'nilg', 'nilm', 'nilb', 'nils', 'nilt', 'nilp', 'nilh', 'nim', 'nib', 'nibs', 'nis', 'niss', 'ning', 'nij', 'nic', 'nik', 'nit', 'nip', 'nih', 'da', 'dag', 'dagg', 'dags', 'dan', 'danj', 'danh', 'dad', 'dal', 'dalg', 'dalm', 'dalb', 'dals', 'dalt', 'dalp', 'dalh', 'dam', 'dab', 'dabs', 'das', 'dass', 'dang', 'daj', 'dac', 'dak', 'dat', 'dap', 'dah'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php
new file mode 100644
index 000000000..3d3368a27
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php
@@ -0,0 +1 @@
+<?php return ['dae', 'daeg', 'daegg', 'daegs', 'daen', 'daenj', 'daenh', 'daed', 'dael', 'daelg', 'daelm', 'daelb', 'daels', 'daelt', 'daelp', 'daelh', 'daem', 'daeb', 'daebs', 'daes', 'daess', 'daeng', 'daej', 'daec', 'daek', 'daet', 'daep', 'daeh', 'dya', 'dyag', 'dyagg', 'dyags', 'dyan', 'dyanj', 'dyanh', 'dyad', 'dyal', 'dyalg', 'dyalm', 'dyalb', 'dyals', 'dyalt', 'dyalp', 'dyalh', 'dyam', 'dyab', 'dyabs', 'dyas', 'dyass', 'dyang', 'dyaj', 'dyac', 'dyak', 'dyat', 'dyap', 'dyah', 'dyae', 'dyaeg', 'dyaegg', 'dyaegs', 'dyaen', 'dyaenj', 'dyaenh', 'dyaed', 'dyael', 'dyaelg', 'dyaelm', 'dyaelb', 'dyaels', 'dyaelt', 'dyaelp', 'dyaelh', 'dyaem', 'dyaeb', 'dyaebs', 'dyaes', 'dyaess', 'dyaeng', 'dyaej', 'dyaec', 'dyaek', 'dyaet', 'dyaep', 'dyaeh', 'deo', 'deog', 'deogg', 'deogs', 'deon', 'deonj', 'deonh', 'deod', 'deol', 'deolg', 'deolm', 'deolb', 'deols', 'deolt', 'deolp', 'deolh', 'deom', 'deob', 'deobs', 'deos', 'deoss', 'deong', 'deoj', 'deoc', 'deok', 'deot', 'deop', 'deoh', 'de', 'deg', 'degg', 'degs', 'den', 'denj', 'denh', 'ded', 'del', 'delg', 'delm', 'delb', 'dels', 'delt', 'delp', 'delh', 'dem', 'deb', 'debs', 'des', 'dess', 'deng', 'dej', 'dec', 'dek', 'det', 'dep', 'deh', 'dyeo', 'dyeog', 'dyeogg', 'dyeogs', 'dyeon', 'dyeonj', 'dyeonh', 'dyeod', 'dyeol', 'dyeolg', 'dyeolm', 'dyeolb', 'dyeols', 'dyeolt', 'dyeolp', 'dyeolh', 'dyeom', 'dyeob', 'dyeobs', 'dyeos', 'dyeoss', 'dyeong', 'dyeoj', 'dyeoc', 'dyeok', 'dyeot', 'dyeop', 'dyeoh', 'dye', 'dyeg', 'dyegg', 'dyegs', 'dyen', 'dyenj', 'dyenh', 'dyed', 'dyel', 'dyelg', 'dyelm', 'dyelb', 'dyels', 'dyelt', 'dyelp', 'dyelh', 'dyem', 'dyeb', 'dyebs', 'dyes', 'dyess', 'dyeng', 'dyej', 'dyec', 'dyek', 'dyet', 'dyep', 'dyeh', 'do', 'dog', 'dogg', 'dogs', 'don', 'donj', 'donh', 'dod', 'dol', 'dolg', 'dolm', 'dolb', 'dols', 'dolt', 'dolp', 'dolh', 'dom', 'dob', 'dobs', 'dos', 'doss', 'dong', 'doj', 'doc', 'dok', 'dot', 'dop', 'doh', 'dwa', 'dwag', 'dwagg', 'dwags', 'dwan', 'dwanj', 'dwanh', 'dwad', 'dwal', 'dwalg', 'dwalm', 'dwalb', 'dwals', 'dwalt', 'dwalp', 'dwalh', 'dwam', 'dwab', 'dwabs', 'dwas', 'dwass', 'dwang', 'dwaj', 'dwac', 'dwak', 'dwat', 'dwap', 'dwah', 'dwae', 'dwaeg', 'dwaegg', 'dwaegs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php
new file mode 100644
index 000000000..07440d747
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php
@@ -0,0 +1 @@
+<?php return ['dwaen', 'dwaenj', 'dwaenh', 'dwaed', 'dwael', 'dwaelg', 'dwaelm', 'dwaelb', 'dwaels', 'dwaelt', 'dwaelp', 'dwaelh', 'dwaem', 'dwaeb', 'dwaebs', 'dwaes', 'dwaess', 'dwaeng', 'dwaej', 'dwaec', 'dwaek', 'dwaet', 'dwaep', 'dwaeh', 'doe', 'doeg', 'doegg', 'doegs', 'doen', 'doenj', 'doenh', 'doed', 'doel', 'doelg', 'doelm', 'doelb', 'doels', 'doelt', 'doelp', 'doelh', 'doem', 'doeb', 'doebs', 'does', 'doess', 'doeng', 'doej', 'doec', 'doek', 'doet', 'doep', 'doeh', 'dyo', 'dyog', 'dyogg', 'dyogs', 'dyon', 'dyonj', 'dyonh', 'dyod', 'dyol', 'dyolg', 'dyolm', 'dyolb', 'dyols', 'dyolt', 'dyolp', 'dyolh', 'dyom', 'dyob', 'dyobs', 'dyos', 'dyoss', 'dyong', 'dyoj', 'dyoc', 'dyok', 'dyot', 'dyop', 'dyoh', 'du', 'dug', 'dugg', 'dugs', 'dun', 'dunj', 'dunh', 'dud', 'dul', 'dulg', 'dulm', 'dulb', 'duls', 'dult', 'dulp', 'dulh', 'dum', 'dub', 'dubs', 'dus', 'duss', 'dung', 'duj', 'duc', 'duk', 'dut', 'dup', 'duh', 'dweo', 'dweog', 'dweogg', 'dweogs', 'dweon', 'dweonj', 'dweonh', 'dweod', 'dweol', 'dweolg', 'dweolm', 'dweolb', 'dweols', 'dweolt', 'dweolp', 'dweolh', 'dweom', 'dweob', 'dweobs', 'dweos', 'dweoss', 'dweong', 'dweoj', 'dweoc', 'dweok', 'dweot', 'dweop', 'dweoh', 'dwe', 'dweg', 'dwegg', 'dwegs', 'dwen', 'dwenj', 'dwenh', 'dwed', 'dwel', 'dwelg', 'dwelm', 'dwelb', 'dwels', 'dwelt', 'dwelp', 'dwelh', 'dwem', 'dweb', 'dwebs', 'dwes', 'dwess', 'dweng', 'dwej', 'dwec', 'dwek', 'dwet', 'dwep', 'dweh', 'dwi', 'dwig', 'dwigg', 'dwigs', 'dwin', 'dwinj', 'dwinh', 'dwid', 'dwil', 'dwilg', 'dwilm', 'dwilb', 'dwils', 'dwilt', 'dwilp', 'dwilh', 'dwim', 'dwib', 'dwibs', 'dwis', 'dwiss', 'dwing', 'dwij', 'dwic', 'dwik', 'dwit', 'dwip', 'dwih', 'dyu', 'dyug', 'dyugg', 'dyugs', 'dyun', 'dyunj', 'dyunh', 'dyud', 'dyul', 'dyulg', 'dyulm', 'dyulb', 'dyuls', 'dyult', 'dyulp', 'dyulh', 'dyum', 'dyub', 'dyubs', 'dyus', 'dyuss', 'dyung', 'dyuj', 'dyuc', 'dyuk', 'dyut', 'dyup', 'dyuh', 'deu', 'deug', 'deugg', 'deugs', 'deun', 'deunj', 'deunh', 'deud', 'deul', 'deulg', 'deulm', 'deulb', 'deuls', 'deult', 'deulp', 'deulh', 'deum', 'deub', 'deubs', 'deus', 'deuss', 'deung', 'deuj', 'deuc', 'deuk', 'deut', 'deup', 'deuh', 'dyi', 'dyig', 'dyigg', 'dyigs', 'dyin', 'dyinj', 'dyinh', 'dyid'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php
new file mode 100644
index 000000000..13b064edb
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php
@@ -0,0 +1 @@
+<?php return ['dyil', 'dyilg', 'dyilm', 'dyilb', 'dyils', 'dyilt', 'dyilp', 'dyilh', 'dyim', 'dyib', 'dyibs', 'dyis', 'dyiss', 'dying', 'dyij', 'dyic', 'dyik', 'dyit', 'dyip', 'dyih', 'di', 'dig', 'digg', 'digs', 'din', 'dinj', 'dinh', 'did', 'dil', 'dilg', 'dilm', 'dilb', 'dils', 'dilt', 'dilp', 'dilh', 'dim', 'dib', 'dibs', 'dis', 'diss', 'ding', 'dij', 'dic', 'dik', 'dit', 'dip', 'dih', 'dda', 'ddag', 'ddagg', 'ddags', 'ddan', 'ddanj', 'ddanh', 'ddad', 'ddal', 'ddalg', 'ddalm', 'ddalb', 'ddals', 'ddalt', 'ddalp', 'ddalh', 'ddam', 'ddab', 'ddabs', 'ddas', 'ddass', 'ddang', 'ddaj', 'ddac', 'ddak', 'ddat', 'ddap', 'ddah', 'ddae', 'ddaeg', 'ddaegg', 'ddaegs', 'ddaen', 'ddaenj', 'ddaenh', 'ddaed', 'ddael', 'ddaelg', 'ddaelm', 'ddaelb', 'ddaels', 'ddaelt', 'ddaelp', 'ddaelh', 'ddaem', 'ddaeb', 'ddaebs', 'ddaes', 'ddaess', 'ddaeng', 'ddaej', 'ddaec', 'ddaek', 'ddaet', 'ddaep', 'ddaeh', 'ddya', 'ddyag', 'ddyagg', 'ddyags', 'ddyan', 'ddyanj', 'ddyanh', 'ddyad', 'ddyal', 'ddyalg', 'ddyalm', 'ddyalb', 'ddyals', 'ddyalt', 'ddyalp', 'ddyalh', 'ddyam', 'ddyab', 'ddyabs', 'ddyas', 'ddyass', 'ddyang', 'ddyaj', 'ddyac', 'ddyak', 'ddyat', 'ddyap', 'ddyah', 'ddyae', 'ddyaeg', 'ddyaegg', 'ddyaegs', 'ddyaen', 'ddyaenj', 'ddyaenh', 'ddyaed', 'ddyael', 'ddyaelg', 'ddyaelm', 'ddyaelb', 'ddyaels', 'ddyaelt', 'ddyaelp', 'ddyaelh', 'ddyaem', 'ddyaeb', 'ddyaebs', 'ddyaes', 'ddyaess', 'ddyaeng', 'ddyaej', 'ddyaec', 'ddyaek', 'ddyaet', 'ddyaep', 'ddyaeh', 'ddeo', 'ddeog', 'ddeogg', 'ddeogs', 'ddeon', 'ddeonj', 'ddeonh', 'ddeod', 'ddeol', 'ddeolg', 'ddeolm', 'ddeolb', 'ddeols', 'ddeolt', 'ddeolp', 'ddeolh', 'ddeom', 'ddeob', 'ddeobs', 'ddeos', 'ddeoss', 'ddeong', 'ddeoj', 'ddeoc', 'ddeok', 'ddeot', 'ddeop', 'ddeoh', 'dde', 'ddeg', 'ddegg', 'ddegs', 'dden', 'ddenj', 'ddenh', 'dded', 'ddel', 'ddelg', 'ddelm', 'ddelb', 'ddels', 'ddelt', 'ddelp', 'ddelh', 'ddem', 'ddeb', 'ddebs', 'ddes', 'ddess', 'ddeng', 'ddej', 'ddec', 'ddek', 'ddet', 'ddep', 'ddeh', 'ddyeo', 'ddyeog', 'ddyeogg', 'ddyeogs', 'ddyeon', 'ddyeonj', 'ddyeonh', 'ddyeod', 'ddyeol', 'ddyeolg', 'ddyeolm', 'ddyeolb', 'ddyeols', 'ddyeolt', 'ddyeolp', 'ddyeolh', 'ddyeom', 'ddyeob', 'ddyeobs', 'ddyeos', 'ddyeoss', 'ddyeong', 'ddyeoj', 'ddyeoc', 'ddyeok', 'ddyeot', 'ddyeop', 'ddyeoh', 'ddye', 'ddyeg', 'ddyegg', 'ddyegs', 'ddyen', 'ddyenj', 'ddyenh', 'ddyed', 'ddyel', 'ddyelg', 'ddyelm', 'ddyelb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php
new file mode 100644
index 000000000..ebaa33d0f
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php
@@ -0,0 +1 @@
+<?php return ['ddyels', 'ddyelt', 'ddyelp', 'ddyelh', 'ddyem', 'ddyeb', 'ddyebs', 'ddyes', 'ddyess', 'ddyeng', 'ddyej', 'ddyec', 'ddyek', 'ddyet', 'ddyep', 'ddyeh', 'ddo', 'ddog', 'ddogg', 'ddogs', 'ddon', 'ddonj', 'ddonh', 'ddod', 'ddol', 'ddolg', 'ddolm', 'ddolb', 'ddols', 'ddolt', 'ddolp', 'ddolh', 'ddom', 'ddob', 'ddobs', 'ddos', 'ddoss', 'ddong', 'ddoj', 'ddoc', 'ddok', 'ddot', 'ddop', 'ddoh', 'ddwa', 'ddwag', 'ddwagg', 'ddwags', 'ddwan', 'ddwanj', 'ddwanh', 'ddwad', 'ddwal', 'ddwalg', 'ddwalm', 'ddwalb', 'ddwals', 'ddwalt', 'ddwalp', 'ddwalh', 'ddwam', 'ddwab', 'ddwabs', 'ddwas', 'ddwass', 'ddwang', 'ddwaj', 'ddwac', 'ddwak', 'ddwat', 'ddwap', 'ddwah', 'ddwae', 'ddwaeg', 'ddwaegg', 'ddwaegs', 'ddwaen', 'ddwaenj', 'ddwaenh', 'ddwaed', 'ddwael', 'ddwaelg', 'ddwaelm', 'ddwaelb', 'ddwaels', 'ddwaelt', 'ddwaelp', 'ddwaelh', 'ddwaem', 'ddwaeb', 'ddwaebs', 'ddwaes', 'ddwaess', 'ddwaeng', 'ddwaej', 'ddwaec', 'ddwaek', 'ddwaet', 'ddwaep', 'ddwaeh', 'ddoe', 'ddoeg', 'ddoegg', 'ddoegs', 'ddoen', 'ddoenj', 'ddoenh', 'ddoed', 'ddoel', 'ddoelg', 'ddoelm', 'ddoelb', 'ddoels', 'ddoelt', 'ddoelp', 'ddoelh', 'ddoem', 'ddoeb', 'ddoebs', 'ddoes', 'ddoess', 'ddoeng', 'ddoej', 'ddoec', 'ddoek', 'ddoet', 'ddoep', 'ddoeh', 'ddyo', 'ddyog', 'ddyogg', 'ddyogs', 'ddyon', 'ddyonj', 'ddyonh', 'ddyod', 'ddyol', 'ddyolg', 'ddyolm', 'ddyolb', 'ddyols', 'ddyolt', 'ddyolp', 'ddyolh', 'ddyom', 'ddyob', 'ddyobs', 'ddyos', 'ddyoss', 'ddyong', 'ddyoj', 'ddyoc', 'ddyok', 'ddyot', 'ddyop', 'ddyoh', 'ddu', 'ddug', 'ddugg', 'ddugs', 'ddun', 'ddunj', 'ddunh', 'ddud', 'ddul', 'ddulg', 'ddulm', 'ddulb', 'dduls', 'ddult', 'ddulp', 'ddulh', 'ddum', 'ddub', 'ddubs', 'ddus', 'dduss', 'ddung', 'dduj', 'dduc', 'dduk', 'ddut', 'ddup', 'dduh', 'ddweo', 'ddweog', 'ddweogg', 'ddweogs', 'ddweon', 'ddweonj', 'ddweonh', 'ddweod', 'ddweol', 'ddweolg', 'ddweolm', 'ddweolb', 'ddweols', 'ddweolt', 'ddweolp', 'ddweolh', 'ddweom', 'ddweob', 'ddweobs', 'ddweos', 'ddweoss', 'ddweong', 'ddweoj', 'ddweoc', 'ddweok', 'ddweot', 'ddweop', 'ddweoh', 'ddwe', 'ddweg', 'ddwegg', 'ddwegs', 'ddwen', 'ddwenj', 'ddwenh', 'ddwed', 'ddwel', 'ddwelg', 'ddwelm', 'ddwelb', 'ddwels', 'ddwelt', 'ddwelp', 'ddwelh', 'ddwem', 'ddweb', 'ddwebs', 'ddwes', 'ddwess', 'ddweng', 'ddwej', 'ddwec', 'ddwek', 'ddwet', 'ddwep', 'ddweh', 'ddwi', 'ddwig', 'ddwigg', 'ddwigs', 'ddwin', 'ddwinj', 'ddwinh', 'ddwid', 'ddwil', 'ddwilg', 'ddwilm', 'ddwilb', 'ddwils', 'ddwilt', 'ddwilp', 'ddwilh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php
new file mode 100644
index 000000000..174de9d39
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php
@@ -0,0 +1 @@
+<?php return ['ddwim', 'ddwib', 'ddwibs', 'ddwis', 'ddwiss', 'ddwing', 'ddwij', 'ddwic', 'ddwik', 'ddwit', 'ddwip', 'ddwih', 'ddyu', 'ddyug', 'ddyugg', 'ddyugs', 'ddyun', 'ddyunj', 'ddyunh', 'ddyud', 'ddyul', 'ddyulg', 'ddyulm', 'ddyulb', 'ddyuls', 'ddyult', 'ddyulp', 'ddyulh', 'ddyum', 'ddyub', 'ddyubs', 'ddyus', 'ddyuss', 'ddyung', 'ddyuj', 'ddyuc', 'ddyuk', 'ddyut', 'ddyup', 'ddyuh', 'ddeu', 'ddeug', 'ddeugg', 'ddeugs', 'ddeun', 'ddeunj', 'ddeunh', 'ddeud', 'ddeul', 'ddeulg', 'ddeulm', 'ddeulb', 'ddeuls', 'ddeult', 'ddeulp', 'ddeulh', 'ddeum', 'ddeub', 'ddeubs', 'ddeus', 'ddeuss', 'ddeung', 'ddeuj', 'ddeuc', 'ddeuk', 'ddeut', 'ddeup', 'ddeuh', 'ddyi', 'ddyig', 'ddyigg', 'ddyigs', 'ddyin', 'ddyinj', 'ddyinh', 'ddyid', 'ddyil', 'ddyilg', 'ddyilm', 'ddyilb', 'ddyils', 'ddyilt', 'ddyilp', 'ddyilh', 'ddyim', 'ddyib', 'ddyibs', 'ddyis', 'ddyiss', 'ddying', 'ddyij', 'ddyic', 'ddyik', 'ddyit', 'ddyip', 'ddyih', 'ddi', 'ddig', 'ddigg', 'ddigs', 'ddin', 'ddinj', 'ddinh', 'ddid', 'ddil', 'ddilg', 'ddilm', 'ddilb', 'ddils', 'ddilt', 'ddilp', 'ddilh', 'ddim', 'ddib', 'ddibs', 'ddis', 'ddiss', 'dding', 'ddij', 'ddic', 'ddik', 'ddit', 'ddip', 'ddih', 'ra', 'rag', 'ragg', 'rags', 'ran', 'ranj', 'ranh', 'rad', 'ral', 'ralg', 'ralm', 'ralb', 'rals', 'ralt', 'ralp', 'ralh', 'ram', 'rab', 'rabs', 'ras', 'rass', 'rang', 'raj', 'rac', 'rak', 'rat', 'rap', 'rah', 'rae', 'raeg', 'raegg', 'raegs', 'raen', 'raenj', 'raenh', 'raed', 'rael', 'raelg', 'raelm', 'raelb', 'raels', 'raelt', 'raelp', 'raelh', 'raem', 'raeb', 'raebs', 'raes', 'raess', 'raeng', 'raej', 'raec', 'raek', 'raet', 'raep', 'raeh', 'rya', 'ryag', 'ryagg', 'ryags', 'ryan', 'ryanj', 'ryanh', 'ryad', 'ryal', 'ryalg', 'ryalm', 'ryalb', 'ryals', 'ryalt', 'ryalp', 'ryalh', 'ryam', 'ryab', 'ryabs', 'ryas', 'ryass', 'ryang', 'ryaj', 'ryac', 'ryak', 'ryat', 'ryap', 'ryah', 'ryae', 'ryaeg', 'ryaegg', 'ryaegs', 'ryaen', 'ryaenj', 'ryaenh', 'ryaed', 'ryael', 'ryaelg', 'ryaelm', 'ryaelb', 'ryaels', 'ryaelt', 'ryaelp', 'ryaelh', 'ryaem', 'ryaeb', 'ryaebs', 'ryaes', 'ryaess', 'ryaeng', 'ryaej', 'ryaec', 'ryaek', 'ryaet', 'ryaep', 'ryaeh', 'reo', 'reog', 'reogg', 'reogs', 'reon', 'reonj', 'reonh', 'reod', 'reol', 'reolg', 'reolm', 'reolb', 'reols', 'reolt', 'reolp', 'reolh', 'reom', 'reob', 'reobs', 'reos'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php
new file mode 100644
index 000000000..8afbadcfc
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php
@@ -0,0 +1 @@
+<?php return ['reoss', 'reong', 'reoj', 'reoc', 'reok', 'reot', 'reop', 'reoh', 're', 'reg', 'regg', 'regs', 'ren', 'renj', 'renh', 'red', 'rel', 'relg', 'relm', 'relb', 'rels', 'relt', 'relp', 'relh', 'rem', 'reb', 'rebs', 'res', 'ress', 'reng', 'rej', 'rec', 'rek', 'ret', 'rep', 'reh', 'ryeo', 'ryeog', 'ryeogg', 'ryeogs', 'ryeon', 'ryeonj', 'ryeonh', 'ryeod', 'ryeol', 'ryeolg', 'ryeolm', 'ryeolb', 'ryeols', 'ryeolt', 'ryeolp', 'ryeolh', 'ryeom', 'ryeob', 'ryeobs', 'ryeos', 'ryeoss', 'ryeong', 'ryeoj', 'ryeoc', 'ryeok', 'ryeot', 'ryeop', 'ryeoh', 'rye', 'ryeg', 'ryegg', 'ryegs', 'ryen', 'ryenj', 'ryenh', 'ryed', 'ryel', 'ryelg', 'ryelm', 'ryelb', 'ryels', 'ryelt', 'ryelp', 'ryelh', 'ryem', 'ryeb', 'ryebs', 'ryes', 'ryess', 'ryeng', 'ryej', 'ryec', 'ryek', 'ryet', 'ryep', 'ryeh', 'ro', 'rog', 'rogg', 'rogs', 'ron', 'ronj', 'ronh', 'rod', 'rol', 'rolg', 'rolm', 'rolb', 'rols', 'rolt', 'rolp', 'rolh', 'rom', 'rob', 'robs', 'ros', 'ross', 'rong', 'roj', 'roc', 'rok', 'rot', 'rop', 'roh', 'rwa', 'rwag', 'rwagg', 'rwags', 'rwan', 'rwanj', 'rwanh', 'rwad', 'rwal', 'rwalg', 'rwalm', 'rwalb', 'rwals', 'rwalt', 'rwalp', 'rwalh', 'rwam', 'rwab', 'rwabs', 'rwas', 'rwass', 'rwang', 'rwaj', 'rwac', 'rwak', 'rwat', 'rwap', 'rwah', 'rwae', 'rwaeg', 'rwaegg', 'rwaegs', 'rwaen', 'rwaenj', 'rwaenh', 'rwaed', 'rwael', 'rwaelg', 'rwaelm', 'rwaelb', 'rwaels', 'rwaelt', 'rwaelp', 'rwaelh', 'rwaem', 'rwaeb', 'rwaebs', 'rwaes', 'rwaess', 'rwaeng', 'rwaej', 'rwaec', 'rwaek', 'rwaet', 'rwaep', 'rwaeh', 'roe', 'roeg', 'roegg', 'roegs', 'roen', 'roenj', 'roenh', 'roed', 'roel', 'roelg', 'roelm', 'roelb', 'roels', 'roelt', 'roelp', 'roelh', 'roem', 'roeb', 'roebs', 'roes', 'roess', 'roeng', 'roej', 'roec', 'roek', 'roet', 'roep', 'roeh', 'ryo', 'ryog', 'ryogg', 'ryogs', 'ryon', 'ryonj', 'ryonh', 'ryod', 'ryol', 'ryolg', 'ryolm', 'ryolb', 'ryols', 'ryolt', 'ryolp', 'ryolh', 'ryom', 'ryob', 'ryobs', 'ryos', 'ryoss', 'ryong', 'ryoj', 'ryoc', 'ryok', 'ryot', 'ryop', 'ryoh', 'ru', 'rug', 'rugg', 'rugs', 'run', 'runj', 'runh', 'rud', 'rul', 'rulg', 'rulm', 'rulb', 'ruls', 'rult', 'rulp', 'rulh', 'rum', 'rub', 'rubs', 'rus', 'russ', 'rung', 'ruj', 'ruc'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php
new file mode 100644
index 000000000..e5e4b1a9c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php
@@ -0,0 +1 @@
+<?php return ['ruk', 'rut', 'rup', 'ruh', 'rweo', 'rweog', 'rweogg', 'rweogs', 'rweon', 'rweonj', 'rweonh', 'rweod', 'rweol', 'rweolg', 'rweolm', 'rweolb', 'rweols', 'rweolt', 'rweolp', 'rweolh', 'rweom', 'rweob', 'rweobs', 'rweos', 'rweoss', 'rweong', 'rweoj', 'rweoc', 'rweok', 'rweot', 'rweop', 'rweoh', 'rwe', 'rweg', 'rwegg', 'rwegs', 'rwen', 'rwenj', 'rwenh', 'rwed', 'rwel', 'rwelg', 'rwelm', 'rwelb', 'rwels', 'rwelt', 'rwelp', 'rwelh', 'rwem', 'rweb', 'rwebs', 'rwes', 'rwess', 'rweng', 'rwej', 'rwec', 'rwek', 'rwet', 'rwep', 'rweh', 'rwi', 'rwig', 'rwigg', 'rwigs', 'rwin', 'rwinj', 'rwinh', 'rwid', 'rwil', 'rwilg', 'rwilm', 'rwilb', 'rwils', 'rwilt', 'rwilp', 'rwilh', 'rwim', 'rwib', 'rwibs', 'rwis', 'rwiss', 'rwing', 'rwij', 'rwic', 'rwik', 'rwit', 'rwip', 'rwih', 'ryu', 'ryug', 'ryugg', 'ryugs', 'ryun', 'ryunj', 'ryunh', 'ryud', 'ryul', 'ryulg', 'ryulm', 'ryulb', 'ryuls', 'ryult', 'ryulp', 'ryulh', 'ryum', 'ryub', 'ryubs', 'ryus', 'ryuss', 'ryung', 'ryuj', 'ryuc', 'ryuk', 'ryut', 'ryup', 'ryuh', 'reu', 'reug', 'reugg', 'reugs', 'reun', 'reunj', 'reunh', 'reud', 'reul', 'reulg', 'reulm', 'reulb', 'reuls', 'reult', 'reulp', 'reulh', 'reum', 'reub', 'reubs', 'reus', 'reuss', 'reung', 'reuj', 'reuc', 'reuk', 'reut', 'reup', 'reuh', 'ryi', 'ryig', 'ryigg', 'ryigs', 'ryin', 'ryinj', 'ryinh', 'ryid', 'ryil', 'ryilg', 'ryilm', 'ryilb', 'ryils', 'ryilt', 'ryilp', 'ryilh', 'ryim', 'ryib', 'ryibs', 'ryis', 'ryiss', 'rying', 'ryij', 'ryic', 'ryik', 'ryit', 'ryip', 'ryih', 'ri', 'rig', 'rigg', 'rigs', 'rin', 'rinj', 'rinh', 'rid', 'ril', 'rilg', 'rilm', 'rilb', 'rils', 'rilt', 'rilp', 'rilh', 'rim', 'rib', 'ribs', 'ris', 'riss', 'ring', 'rij', 'ric', 'rik', 'rit', 'rip', 'rih', 'ma', 'mag', 'magg', 'mags', 'man', 'manj', 'manh', 'mad', 'mal', 'malg', 'malm', 'malb', 'mals', 'malt', 'malp', 'malh', 'mam', 'mab', 'mabs', 'mas', 'mass', 'mang', 'maj', 'mac', 'mak', 'mat', 'map', 'mah', 'mae', 'maeg', 'maegg', 'maegs', 'maen', 'maenj', 'maenh', 'maed', 'mael', 'maelg', 'maelm', 'maelb', 'maels', 'maelt', 'maelp', 'maelh', 'maem', 'maeb', 'maebs', 'maes', 'maess', 'maeng', 'maej', 'maec', 'maek', 'maet', 'maep', 'maeh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php
new file mode 100644
index 000000000..27148dd32
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php
@@ -0,0 +1 @@
+<?php return ['mya', 'myag', 'myagg', 'myags', 'myan', 'myanj', 'myanh', 'myad', 'myal', 'myalg', 'myalm', 'myalb', 'myals', 'myalt', 'myalp', 'myalh', 'myam', 'myab', 'myabs', 'myas', 'myass', 'myang', 'myaj', 'myac', 'myak', 'myat', 'myap', 'myah', 'myae', 'myaeg', 'myaegg', 'myaegs', 'myaen', 'myaenj', 'myaenh', 'myaed', 'myael', 'myaelg', 'myaelm', 'myaelb', 'myaels', 'myaelt', 'myaelp', 'myaelh', 'myaem', 'myaeb', 'myaebs', 'myaes', 'myaess', 'myaeng', 'myaej', 'myaec', 'myaek', 'myaet', 'myaep', 'myaeh', 'meo', 'meog', 'meogg', 'meogs', 'meon', 'meonj', 'meonh', 'meod', 'meol', 'meolg', 'meolm', 'meolb', 'meols', 'meolt', 'meolp', 'meolh', 'meom', 'meob', 'meobs', 'meos', 'meoss', 'meong', 'meoj', 'meoc', 'meok', 'meot', 'meop', 'meoh', 'me', 'meg', 'megg', 'megs', 'men', 'menj', 'menh', 'med', 'mel', 'melg', 'melm', 'melb', 'mels', 'melt', 'melp', 'melh', 'mem', 'meb', 'mebs', 'mes', 'mess', 'meng', 'mej', 'mec', 'mek', 'met', 'mep', 'meh', 'myeo', 'myeog', 'myeogg', 'myeogs', 'myeon', 'myeonj', 'myeonh', 'myeod', 'myeol', 'myeolg', 'myeolm', 'myeolb', 'myeols', 'myeolt', 'myeolp', 'myeolh', 'myeom', 'myeob', 'myeobs', 'myeos', 'myeoss', 'myeong', 'myeoj', 'myeoc', 'myeok', 'myeot', 'myeop', 'myeoh', 'mye', 'myeg', 'myegg', 'myegs', 'myen', 'myenj', 'myenh', 'myed', 'myel', 'myelg', 'myelm', 'myelb', 'myels', 'myelt', 'myelp', 'myelh', 'myem', 'myeb', 'myebs', 'myes', 'myess', 'myeng', 'myej', 'myec', 'myek', 'myet', 'myep', 'myeh', 'mo', 'mog', 'mogg', 'mogs', 'mon', 'monj', 'monh', 'mod', 'mol', 'molg', 'molm', 'molb', 'mols', 'molt', 'molp', 'molh', 'mom', 'mob', 'mobs', 'mos', 'moss', 'mong', 'moj', 'moc', 'mok', 'mot', 'mop', 'moh', 'mwa', 'mwag', 'mwagg', 'mwags', 'mwan', 'mwanj', 'mwanh', 'mwad', 'mwal', 'mwalg', 'mwalm', 'mwalb', 'mwals', 'mwalt', 'mwalp', 'mwalh', 'mwam', 'mwab', 'mwabs', 'mwas', 'mwass', 'mwang', 'mwaj', 'mwac', 'mwak', 'mwat', 'mwap', 'mwah', 'mwae', 'mwaeg', 'mwaegg', 'mwaegs', 'mwaen', 'mwaenj', 'mwaenh', 'mwaed', 'mwael', 'mwaelg', 'mwaelm', 'mwaelb', 'mwaels', 'mwaelt', 'mwaelp', 'mwaelh', 'mwaem', 'mwaeb', 'mwaebs', 'mwaes', 'mwaess', 'mwaeng', 'mwaej', 'mwaec', 'mwaek', 'mwaet', 'mwaep', 'mwaeh', 'moe', 'moeg', 'moegg', 'moegs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php
new file mode 100644
index 000000000..f5786e696
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php
@@ -0,0 +1 @@
+<?php return ['moen', 'moenj', 'moenh', 'moed', 'moel', 'moelg', 'moelm', 'moelb', 'moels', 'moelt', 'moelp', 'moelh', 'moem', 'moeb', 'moebs', 'moes', 'moess', 'moeng', 'moej', 'moec', 'moek', 'moet', 'moep', 'moeh', 'myo', 'myog', 'myogg', 'myogs', 'myon', 'myonj', 'myonh', 'myod', 'myol', 'myolg', 'myolm', 'myolb', 'myols', 'myolt', 'myolp', 'myolh', 'myom', 'myob', 'myobs', 'myos', 'myoss', 'myong', 'myoj', 'myoc', 'myok', 'myot', 'myop', 'myoh', 'mu', 'mug', 'mugg', 'mugs', 'mun', 'munj', 'munh', 'mud', 'mul', 'mulg', 'mulm', 'mulb', 'muls', 'mult', 'mulp', 'mulh', 'mum', 'mub', 'mubs', 'mus', 'muss', 'mung', 'muj', 'muc', 'muk', 'mut', 'mup', 'muh', 'mweo', 'mweog', 'mweogg', 'mweogs', 'mweon', 'mweonj', 'mweonh', 'mweod', 'mweol', 'mweolg', 'mweolm', 'mweolb', 'mweols', 'mweolt', 'mweolp', 'mweolh', 'mweom', 'mweob', 'mweobs', 'mweos', 'mweoss', 'mweong', 'mweoj', 'mweoc', 'mweok', 'mweot', 'mweop', 'mweoh', 'mwe', 'mweg', 'mwegg', 'mwegs', 'mwen', 'mwenj', 'mwenh', 'mwed', 'mwel', 'mwelg', 'mwelm', 'mwelb', 'mwels', 'mwelt', 'mwelp', 'mwelh', 'mwem', 'mweb', 'mwebs', 'mwes', 'mwess', 'mweng', 'mwej', 'mwec', 'mwek', 'mwet', 'mwep', 'mweh', 'mwi', 'mwig', 'mwigg', 'mwigs', 'mwin', 'mwinj', 'mwinh', 'mwid', 'mwil', 'mwilg', 'mwilm', 'mwilb', 'mwils', 'mwilt', 'mwilp', 'mwilh', 'mwim', 'mwib', 'mwibs', 'mwis', 'mwiss', 'mwing', 'mwij', 'mwic', 'mwik', 'mwit', 'mwip', 'mwih', 'myu', 'myug', 'myugg', 'myugs', 'myun', 'myunj', 'myunh', 'myud', 'myul', 'myulg', 'myulm', 'myulb', 'myuls', 'myult', 'myulp', 'myulh', 'myum', 'myub', 'myubs', 'myus', 'myuss', 'myung', 'myuj', 'myuc', 'myuk', 'myut', 'myup', 'myuh', 'meu', 'meug', 'meugg', 'meugs', 'meun', 'meunj', 'meunh', 'meud', 'meul', 'meulg', 'meulm', 'meulb', 'meuls', 'meult', 'meulp', 'meulh', 'meum', 'meub', 'meubs', 'meus', 'meuss', 'meung', 'meuj', 'meuc', 'meuk', 'meut', 'meup', 'meuh', 'myi', 'myig', 'myigg', 'myigs', 'myin', 'myinj', 'myinh', 'myid', 'myil', 'myilg', 'myilm', 'myilb', 'myils', 'myilt', 'myilp', 'myilh', 'myim', 'myib', 'myibs', 'myis', 'myiss', 'mying', 'myij', 'myic', 'myik', 'myit', 'myip', 'myih', 'mi', 'mig', 'migg', 'migs', 'min', 'minj', 'minh', 'mid'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php
new file mode 100644
index 000000000..d4df6a26a
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php
@@ -0,0 +1 @@
+<?php return ['mil', 'milg', 'milm', 'milb', 'mils', 'milt', 'milp', 'milh', 'mim', 'mib', 'mibs', 'mis', 'miss', 'ming', 'mij', 'mic', 'mik', 'mit', 'mip', 'mih', 'ba', 'bag', 'bagg', 'bags', 'ban', 'banj', 'banh', 'bad', 'bal', 'balg', 'balm', 'balb', 'bals', 'balt', 'balp', 'balh', 'bam', 'bab', 'babs', 'bas', 'bass', 'bang', 'baj', 'bac', 'bak', 'bat', 'bap', 'bah', 'bae', 'baeg', 'baegg', 'baegs', 'baen', 'baenj', 'baenh', 'baed', 'bael', 'baelg', 'baelm', 'baelb', 'baels', 'baelt', 'baelp', 'baelh', 'baem', 'baeb', 'baebs', 'baes', 'baess', 'baeng', 'baej', 'baec', 'baek', 'baet', 'baep', 'baeh', 'bya', 'byag', 'byagg', 'byags', 'byan', 'byanj', 'byanh', 'byad', 'byal', 'byalg', 'byalm', 'byalb', 'byals', 'byalt', 'byalp', 'byalh', 'byam', 'byab', 'byabs', 'byas', 'byass', 'byang', 'byaj', 'byac', 'byak', 'byat', 'byap', 'byah', 'byae', 'byaeg', 'byaegg', 'byaegs', 'byaen', 'byaenj', 'byaenh', 'byaed', 'byael', 'byaelg', 'byaelm', 'byaelb', 'byaels', 'byaelt', 'byaelp', 'byaelh', 'byaem', 'byaeb', 'byaebs', 'byaes', 'byaess', 'byaeng', 'byaej', 'byaec', 'byaek', 'byaet', 'byaep', 'byaeh', 'beo', 'beog', 'beogg', 'beogs', 'beon', 'beonj', 'beonh', 'beod', 'beol', 'beolg', 'beolm', 'beolb', 'beols', 'beolt', 'beolp', 'beolh', 'beom', 'beob', 'beobs', 'beos', 'beoss', 'beong', 'beoj', 'beoc', 'beok', 'beot', 'beop', 'beoh', 'be', 'beg', 'begg', 'begs', 'ben', 'benj', 'benh', 'bed', 'bel', 'belg', 'belm', 'belb', 'bels', 'belt', 'belp', 'belh', 'bem', 'beb', 'bebs', 'bes', 'bess', 'beng', 'bej', 'bec', 'bek', 'bet', 'bep', 'beh', 'byeo', 'byeog', 'byeogg', 'byeogs', 'byeon', 'byeonj', 'byeonh', 'byeod', 'byeol', 'byeolg', 'byeolm', 'byeolb', 'byeols', 'byeolt', 'byeolp', 'byeolh', 'byeom', 'byeob', 'byeobs', 'byeos', 'byeoss', 'byeong', 'byeoj', 'byeoc', 'byeok', 'byeot', 'byeop', 'byeoh', 'bye', 'byeg', 'byegg', 'byegs', 'byen', 'byenj', 'byenh', 'byed', 'byel', 'byelg', 'byelm', 'byelb', 'byels', 'byelt', 'byelp', 'byelh', 'byem', 'byeb', 'byebs', 'byes', 'byess', 'byeng', 'byej', 'byec', 'byek', 'byet', 'byep', 'byeh', 'bo', 'bog', 'bogg', 'bogs', 'bon', 'bonj', 'bonh', 'bod', 'bol', 'bolg', 'bolm', 'bolb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php
new file mode 100644
index 000000000..b5f276249
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php
@@ -0,0 +1 @@
+<?php return ['bols', 'bolt', 'bolp', 'bolh', 'bom', 'bob', 'bobs', 'bos', 'boss', 'bong', 'boj', 'boc', 'bok', 'bot', 'bop', 'boh', 'bwa', 'bwag', 'bwagg', 'bwags', 'bwan', 'bwanj', 'bwanh', 'bwad', 'bwal', 'bwalg', 'bwalm', 'bwalb', 'bwals', 'bwalt', 'bwalp', 'bwalh', 'bwam', 'bwab', 'bwabs', 'bwas', 'bwass', 'bwang', 'bwaj', 'bwac', 'bwak', 'bwat', 'bwap', 'bwah', 'bwae', 'bwaeg', 'bwaegg', 'bwaegs', 'bwaen', 'bwaenj', 'bwaenh', 'bwaed', 'bwael', 'bwaelg', 'bwaelm', 'bwaelb', 'bwaels', 'bwaelt', 'bwaelp', 'bwaelh', 'bwaem', 'bwaeb', 'bwaebs', 'bwaes', 'bwaess', 'bwaeng', 'bwaej', 'bwaec', 'bwaek', 'bwaet', 'bwaep', 'bwaeh', 'boe', 'boeg', 'boegg', 'boegs', 'boen', 'boenj', 'boenh', 'boed', 'boel', 'boelg', 'boelm', 'boelb', 'boels', 'boelt', 'boelp', 'boelh', 'boem', 'boeb', 'boebs', 'boes', 'boess', 'boeng', 'boej', 'boec', 'boek', 'boet', 'boep', 'boeh', 'byo', 'byog', 'byogg', 'byogs', 'byon', 'byonj', 'byonh', 'byod', 'byol', 'byolg', 'byolm', 'byolb', 'byols', 'byolt', 'byolp', 'byolh', 'byom', 'byob', 'byobs', 'byos', 'byoss', 'byong', 'byoj', 'byoc', 'byok', 'byot', 'byop', 'byoh', 'bu', 'bug', 'bugg', 'bugs', 'bun', 'bunj', 'bunh', 'bud', 'bul', 'bulg', 'bulm', 'bulb', 'buls', 'bult', 'bulp', 'bulh', 'bum', 'bub', 'bubs', 'bus', 'buss', 'bung', 'buj', 'buc', 'buk', 'but', 'bup', 'buh', 'bweo', 'bweog', 'bweogg', 'bweogs', 'bweon', 'bweonj', 'bweonh', 'bweod', 'bweol', 'bweolg', 'bweolm', 'bweolb', 'bweols', 'bweolt', 'bweolp', 'bweolh', 'bweom', 'bweob', 'bweobs', 'bweos', 'bweoss', 'bweong', 'bweoj', 'bweoc', 'bweok', 'bweot', 'bweop', 'bweoh', 'bwe', 'bweg', 'bwegg', 'bwegs', 'bwen', 'bwenj', 'bwenh', 'bwed', 'bwel', 'bwelg', 'bwelm', 'bwelb', 'bwels', 'bwelt', 'bwelp', 'bwelh', 'bwem', 'bweb', 'bwebs', 'bwes', 'bwess', 'bweng', 'bwej', 'bwec', 'bwek', 'bwet', 'bwep', 'bweh', 'bwi', 'bwig', 'bwigg', 'bwigs', 'bwin', 'bwinj', 'bwinh', 'bwid', 'bwil', 'bwilg', 'bwilm', 'bwilb', 'bwils', 'bwilt', 'bwilp', 'bwilh', 'bwim', 'bwib', 'bwibs', 'bwis', 'bwiss', 'bwing', 'bwij', 'bwic', 'bwik', 'bwit', 'bwip', 'bwih', 'byu', 'byug', 'byugg', 'byugs', 'byun', 'byunj', 'byunh', 'byud', 'byul', 'byulg', 'byulm', 'byulb', 'byuls', 'byult', 'byulp', 'byulh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php
new file mode 100644
index 000000000..bd68ab0c8
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php
@@ -0,0 +1 @@
+<?php return ['byum', 'byub', 'byubs', 'byus', 'byuss', 'byung', 'byuj', 'byuc', 'byuk', 'byut', 'byup', 'byuh', 'beu', 'beug', 'beugg', 'beugs', 'beun', 'beunj', 'beunh', 'beud', 'beul', 'beulg', 'beulm', 'beulb', 'beuls', 'beult', 'beulp', 'beulh', 'beum', 'beub', 'beubs', 'beus', 'beuss', 'beung', 'beuj', 'beuc', 'beuk', 'beut', 'beup', 'beuh', 'byi', 'byig', 'byigg', 'byigs', 'byin', 'byinj', 'byinh', 'byid', 'byil', 'byilg', 'byilm', 'byilb', 'byils', 'byilt', 'byilp', 'byilh', 'byim', 'byib', 'byibs', 'byis', 'byiss', 'bying', 'byij', 'byic', 'byik', 'byit', 'byip', 'byih', 'bi', 'big', 'bigg', 'bigs', 'bin', 'binj', 'binh', 'bid', 'bil', 'bilg', 'bilm', 'bilb', 'bils', 'bilt', 'bilp', 'bilh', 'bim', 'bib', 'bibs', 'bis', 'biss', 'bing', 'bij', 'bic', 'bik', 'bit', 'bip', 'bih', 'bba', 'bbag', 'bbagg', 'bbags', 'bban', 'bbanj', 'bbanh', 'bbad', 'bbal', 'bbalg', 'bbalm', 'bbalb', 'bbals', 'bbalt', 'bbalp', 'bbalh', 'bbam', 'bbab', 'bbabs', 'bbas', 'bbass', 'bbang', 'bbaj', 'bbac', 'bbak', 'bbat', 'bbap', 'bbah', 'bbae', 'bbaeg', 'bbaegg', 'bbaegs', 'bbaen', 'bbaenj', 'bbaenh', 'bbaed', 'bbael', 'bbaelg', 'bbaelm', 'bbaelb', 'bbaels', 'bbaelt', 'bbaelp', 'bbaelh', 'bbaem', 'bbaeb', 'bbaebs', 'bbaes', 'bbaess', 'bbaeng', 'bbaej', 'bbaec', 'bbaek', 'bbaet', 'bbaep', 'bbaeh', 'bbya', 'bbyag', 'bbyagg', 'bbyags', 'bbyan', 'bbyanj', 'bbyanh', 'bbyad', 'bbyal', 'bbyalg', 'bbyalm', 'bbyalb', 'bbyals', 'bbyalt', 'bbyalp', 'bbyalh', 'bbyam', 'bbyab', 'bbyabs', 'bbyas', 'bbyass', 'bbyang', 'bbyaj', 'bbyac', 'bbyak', 'bbyat', 'bbyap', 'bbyah', 'bbyae', 'bbyaeg', 'bbyaegg', 'bbyaegs', 'bbyaen', 'bbyaenj', 'bbyaenh', 'bbyaed', 'bbyael', 'bbyaelg', 'bbyaelm', 'bbyaelb', 'bbyaels', 'bbyaelt', 'bbyaelp', 'bbyaelh', 'bbyaem', 'bbyaeb', 'bbyaebs', 'bbyaes', 'bbyaess', 'bbyaeng', 'bbyaej', 'bbyaec', 'bbyaek', 'bbyaet', 'bbyaep', 'bbyaeh', 'bbeo', 'bbeog', 'bbeogg', 'bbeogs', 'bbeon', 'bbeonj', 'bbeonh', 'bbeod', 'bbeol', 'bbeolg', 'bbeolm', 'bbeolb', 'bbeols', 'bbeolt', 'bbeolp', 'bbeolh', 'bbeom', 'bbeob', 'bbeobs', 'bbeos', 'bbeoss', 'bbeong', 'bbeoj', 'bbeoc', 'bbeok', 'bbeot', 'bbeop', 'bbeoh', 'bbe', 'bbeg', 'bbegg', 'bbegs', 'bben', 'bbenj', 'bbenh', 'bbed', 'bbel', 'bbelg', 'bbelm', 'bbelb', 'bbels', 'bbelt', 'bbelp', 'bbelh', 'bbem', 'bbeb', 'bbebs', 'bbes'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php
new file mode 100644
index 000000000..ddca88e70
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php
@@ -0,0 +1 @@
+<?php return ['bbess', 'bbeng', 'bbej', 'bbec', 'bbek', 'bbet', 'bbep', 'bbeh', 'bbyeo', 'bbyeog', 'bbyeogg', 'bbyeogs', 'bbyeon', 'bbyeonj', 'bbyeonh', 'bbyeod', 'bbyeol', 'bbyeolg', 'bbyeolm', 'bbyeolb', 'bbyeols', 'bbyeolt', 'bbyeolp', 'bbyeolh', 'bbyeom', 'bbyeob', 'bbyeobs', 'bbyeos', 'bbyeoss', 'bbyeong', 'bbyeoj', 'bbyeoc', 'bbyeok', 'bbyeot', 'bbyeop', 'bbyeoh', 'bbye', 'bbyeg', 'bbyegg', 'bbyegs', 'bbyen', 'bbyenj', 'bbyenh', 'bbyed', 'bbyel', 'bbyelg', 'bbyelm', 'bbyelb', 'bbyels', 'bbyelt', 'bbyelp', 'bbyelh', 'bbyem', 'bbyeb', 'bbyebs', 'bbyes', 'bbyess', 'bbyeng', 'bbyej', 'bbyec', 'bbyek', 'bbyet', 'bbyep', 'bbyeh', 'bbo', 'bbog', 'bbogg', 'bbogs', 'bbon', 'bbonj', 'bbonh', 'bbod', 'bbol', 'bbolg', 'bbolm', 'bbolb', 'bbols', 'bbolt', 'bbolp', 'bbolh', 'bbom', 'bbob', 'bbobs', 'bbos', 'bboss', 'bbong', 'bboj', 'bboc', 'bbok', 'bbot', 'bbop', 'bboh', 'bbwa', 'bbwag', 'bbwagg', 'bbwags', 'bbwan', 'bbwanj', 'bbwanh', 'bbwad', 'bbwal', 'bbwalg', 'bbwalm', 'bbwalb', 'bbwals', 'bbwalt', 'bbwalp', 'bbwalh', 'bbwam', 'bbwab', 'bbwabs', 'bbwas', 'bbwass', 'bbwang', 'bbwaj', 'bbwac', 'bbwak', 'bbwat', 'bbwap', 'bbwah', 'bbwae', 'bbwaeg', 'bbwaegg', 'bbwaegs', 'bbwaen', 'bbwaenj', 'bbwaenh', 'bbwaed', 'bbwael', 'bbwaelg', 'bbwaelm', 'bbwaelb', 'bbwaels', 'bbwaelt', 'bbwaelp', 'bbwaelh', 'bbwaem', 'bbwaeb', 'bbwaebs', 'bbwaes', 'bbwaess', 'bbwaeng', 'bbwaej', 'bbwaec', 'bbwaek', 'bbwaet', 'bbwaep', 'bbwaeh', 'bboe', 'bboeg', 'bboegg', 'bboegs', 'bboen', 'bboenj', 'bboenh', 'bboed', 'bboel', 'bboelg', 'bboelm', 'bboelb', 'bboels', 'bboelt', 'bboelp', 'bboelh', 'bboem', 'bboeb', 'bboebs', 'bboes', 'bboess', 'bboeng', 'bboej', 'bboec', 'bboek', 'bboet', 'bboep', 'bboeh', 'bbyo', 'bbyog', 'bbyogg', 'bbyogs', 'bbyon', 'bbyonj', 'bbyonh', 'bbyod', 'bbyol', 'bbyolg', 'bbyolm', 'bbyolb', 'bbyols', 'bbyolt', 'bbyolp', 'bbyolh', 'bbyom', 'bbyob', 'bbyobs', 'bbyos', 'bbyoss', 'bbyong', 'bbyoj', 'bbyoc', 'bbyok', 'bbyot', 'bbyop', 'bbyoh', 'bbu', 'bbug', 'bbugg', 'bbugs', 'bbun', 'bbunj', 'bbunh', 'bbud', 'bbul', 'bbulg', 'bbulm', 'bbulb', 'bbuls', 'bbult', 'bbulp', 'bbulh', 'bbum', 'bbub', 'bbubs', 'bbus', 'bbuss', 'bbung', 'bbuj', 'bbuc', 'bbuk', 'bbut', 'bbup', 'bbuh', 'bbweo', 'bbweog', 'bbweogg', 'bbweogs', 'bbweon', 'bbweonj', 'bbweonh', 'bbweod', 'bbweol', 'bbweolg', 'bbweolm', 'bbweolb', 'bbweols', 'bbweolt', 'bbweolp', 'bbweolh', 'bbweom', 'bbweob', 'bbweobs', 'bbweos', 'bbweoss', 'bbweong', 'bbweoj', 'bbweoc'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php
new file mode 100644
index 000000000..c664e3e93
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php
@@ -0,0 +1 @@
+<?php return ['bbweok', 'bbweot', 'bbweop', 'bbweoh', 'bbwe', 'bbweg', 'bbwegg', 'bbwegs', 'bbwen', 'bbwenj', 'bbwenh', 'bbwed', 'bbwel', 'bbwelg', 'bbwelm', 'bbwelb', 'bbwels', 'bbwelt', 'bbwelp', 'bbwelh', 'bbwem', 'bbweb', 'bbwebs', 'bbwes', 'bbwess', 'bbweng', 'bbwej', 'bbwec', 'bbwek', 'bbwet', 'bbwep', 'bbweh', 'bbwi', 'bbwig', 'bbwigg', 'bbwigs', 'bbwin', 'bbwinj', 'bbwinh', 'bbwid', 'bbwil', 'bbwilg', 'bbwilm', 'bbwilb', 'bbwils', 'bbwilt', 'bbwilp', 'bbwilh', 'bbwim', 'bbwib', 'bbwibs', 'bbwis', 'bbwiss', 'bbwing', 'bbwij', 'bbwic', 'bbwik', 'bbwit', 'bbwip', 'bbwih', 'bbyu', 'bbyug', 'bbyugg', 'bbyugs', 'bbyun', 'bbyunj', 'bbyunh', 'bbyud', 'bbyul', 'bbyulg', 'bbyulm', 'bbyulb', 'bbyuls', 'bbyult', 'bbyulp', 'bbyulh', 'bbyum', 'bbyub', 'bbyubs', 'bbyus', 'bbyuss', 'bbyung', 'bbyuj', 'bbyuc', 'bbyuk', 'bbyut', 'bbyup', 'bbyuh', 'bbeu', 'bbeug', 'bbeugg', 'bbeugs', 'bbeun', 'bbeunj', 'bbeunh', 'bbeud', 'bbeul', 'bbeulg', 'bbeulm', 'bbeulb', 'bbeuls', 'bbeult', 'bbeulp', 'bbeulh', 'bbeum', 'bbeub', 'bbeubs', 'bbeus', 'bbeuss', 'bbeung', 'bbeuj', 'bbeuc', 'bbeuk', 'bbeut', 'bbeup', 'bbeuh', 'bbyi', 'bbyig', 'bbyigg', 'bbyigs', 'bbyin', 'bbyinj', 'bbyinh', 'bbyid', 'bbyil', 'bbyilg', 'bbyilm', 'bbyilb', 'bbyils', 'bbyilt', 'bbyilp', 'bbyilh', 'bbyim', 'bbyib', 'bbyibs', 'bbyis', 'bbyiss', 'bbying', 'bbyij', 'bbyic', 'bbyik', 'bbyit', 'bbyip', 'bbyih', 'bbi', 'bbig', 'bbigg', 'bbigs', 'bbin', 'bbinj', 'bbinh', 'bbid', 'bbil', 'bbilg', 'bbilm', 'bbilb', 'bbils', 'bbilt', 'bbilp', 'bbilh', 'bbim', 'bbib', 'bbibs', 'bbis', 'bbiss', 'bbing', 'bbij', 'bbic', 'bbik', 'bbit', 'bbip', 'bbih', 'sa', 'sag', 'sagg', 'sags', 'san', 'sanj', 'sanh', 'sad', 'sal', 'salg', 'salm', 'salb', 'sals', 'salt', 'salp', 'salh', 'sam', 'sab', 'sabs', 'sas', 'sass', 'sang', 'saj', 'sac', 'sak', 'sat', 'sap', 'sah', 'sae', 'saeg', 'saegg', 'saegs', 'saen', 'saenj', 'saenh', 'saed', 'sael', 'saelg', 'saelm', 'saelb', 'saels', 'saelt', 'saelp', 'saelh', 'saem', 'saeb', 'saebs', 'saes', 'saess', 'saeng', 'saej', 'saec', 'saek', 'saet', 'saep', 'saeh', 'sya', 'syag', 'syagg', 'syags', 'syan', 'syanj', 'syanh', 'syad', 'syal', 'syalg', 'syalm', 'syalb', 'syals', 'syalt', 'syalp', 'syalh', 'syam', 'syab', 'syabs', 'syas', 'syass', 'syang', 'syaj', 'syac', 'syak', 'syat', 'syap', 'syah'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php
new file mode 100644
index 000000000..03bf4afec
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php
@@ -0,0 +1 @@
+<?php return ['syae', 'syaeg', 'syaegg', 'syaegs', 'syaen', 'syaenj', 'syaenh', 'syaed', 'syael', 'syaelg', 'syaelm', 'syaelb', 'syaels', 'syaelt', 'syaelp', 'syaelh', 'syaem', 'syaeb', 'syaebs', 'syaes', 'syaess', 'syaeng', 'syaej', 'syaec', 'syaek', 'syaet', 'syaep', 'syaeh', 'seo', 'seog', 'seogg', 'seogs', 'seon', 'seonj', 'seonh', 'seod', 'seol', 'seolg', 'seolm', 'seolb', 'seols', 'seolt', 'seolp', 'seolh', 'seom', 'seob', 'seobs', 'seos', 'seoss', 'seong', 'seoj', 'seoc', 'seok', 'seot', 'seop', 'seoh', 'se', 'seg', 'segg', 'segs', 'sen', 'senj', 'senh', 'sed', 'sel', 'selg', 'selm', 'selb', 'sels', 'selt', 'selp', 'selh', 'sem', 'seb', 'sebs', 'ses', 'sess', 'seng', 'sej', 'sec', 'sek', 'set', 'sep', 'seh', 'syeo', 'syeog', 'syeogg', 'syeogs', 'syeon', 'syeonj', 'syeonh', 'syeod', 'syeol', 'syeolg', 'syeolm', 'syeolb', 'syeols', 'syeolt', 'syeolp', 'syeolh', 'syeom', 'syeob', 'syeobs', 'syeos', 'syeoss', 'syeong', 'syeoj', 'syeoc', 'syeok', 'syeot', 'syeop', 'syeoh', 'sye', 'syeg', 'syegg', 'syegs', 'syen', 'syenj', 'syenh', 'syed', 'syel', 'syelg', 'syelm', 'syelb', 'syels', 'syelt', 'syelp', 'syelh', 'syem', 'syeb', 'syebs', 'syes', 'syess', 'syeng', 'syej', 'syec', 'syek', 'syet', 'syep', 'syeh', 'so', 'sog', 'sogg', 'sogs', 'son', 'sonj', 'sonh', 'sod', 'sol', 'solg', 'solm', 'solb', 'sols', 'solt', 'solp', 'solh', 'som', 'sob', 'sobs', 'sos', 'soss', 'song', 'soj', 'soc', 'sok', 'sot', 'sop', 'soh', 'swa', 'swag', 'swagg', 'swags', 'swan', 'swanj', 'swanh', 'swad', 'swal', 'swalg', 'swalm', 'swalb', 'swals', 'swalt', 'swalp', 'swalh', 'swam', 'swab', 'swabs', 'swas', 'swass', 'swang', 'swaj', 'swac', 'swak', 'swat', 'swap', 'swah', 'swae', 'swaeg', 'swaegg', 'swaegs', 'swaen', 'swaenj', 'swaenh', 'swaed', 'swael', 'swaelg', 'swaelm', 'swaelb', 'swaels', 'swaelt', 'swaelp', 'swaelh', 'swaem', 'swaeb', 'swaebs', 'swaes', 'swaess', 'swaeng', 'swaej', 'swaec', 'swaek', 'swaet', 'swaep', 'swaeh', 'soe', 'soeg', 'soegg', 'soegs', 'soen', 'soenj', 'soenh', 'soed', 'soel', 'soelg', 'soelm', 'soelb', 'soels', 'soelt', 'soelp', 'soelh', 'soem', 'soeb', 'soebs', 'soes', 'soess', 'soeng', 'soej', 'soec', 'soek', 'soet', 'soep', 'soeh', 'syo', 'syog', 'syogg', 'syogs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php
new file mode 100644
index 000000000..5d87b6d23
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php
@@ -0,0 +1 @@
+<?php return ['syon', 'syonj', 'syonh', 'syod', 'syol', 'syolg', 'syolm', 'syolb', 'syols', 'syolt', 'syolp', 'syolh', 'syom', 'syob', 'syobs', 'syos', 'syoss', 'syong', 'syoj', 'syoc', 'syok', 'syot', 'syop', 'syoh', 'su', 'sug', 'sugg', 'sugs', 'sun', 'sunj', 'sunh', 'sud', 'sul', 'sulg', 'sulm', 'sulb', 'suls', 'sult', 'sulp', 'sulh', 'sum', 'sub', 'subs', 'sus', 'suss', 'sung', 'suj', 'suc', 'suk', 'sut', 'sup', 'suh', 'sweo', 'sweog', 'sweogg', 'sweogs', 'sweon', 'sweonj', 'sweonh', 'sweod', 'sweol', 'sweolg', 'sweolm', 'sweolb', 'sweols', 'sweolt', 'sweolp', 'sweolh', 'sweom', 'sweob', 'sweobs', 'sweos', 'sweoss', 'sweong', 'sweoj', 'sweoc', 'sweok', 'sweot', 'sweop', 'sweoh', 'swe', 'sweg', 'swegg', 'swegs', 'swen', 'swenj', 'swenh', 'swed', 'swel', 'swelg', 'swelm', 'swelb', 'swels', 'swelt', 'swelp', 'swelh', 'swem', 'sweb', 'swebs', 'swes', 'swess', 'sweng', 'swej', 'swec', 'swek', 'swet', 'swep', 'sweh', 'swi', 'swig', 'swigg', 'swigs', 'swin', 'swinj', 'swinh', 'swid', 'swil', 'swilg', 'swilm', 'swilb', 'swils', 'swilt', 'swilp', 'swilh', 'swim', 'swib', 'swibs', 'swis', 'swiss', 'swing', 'swij', 'swic', 'swik', 'swit', 'swip', 'swih', 'syu', 'syug', 'syugg', 'syugs', 'syun', 'syunj', 'syunh', 'syud', 'syul', 'syulg', 'syulm', 'syulb', 'syuls', 'syult', 'syulp', 'syulh', 'syum', 'syub', 'syubs', 'syus', 'syuss', 'syung', 'syuj', 'syuc', 'syuk', 'syut', 'syup', 'syuh', 'seu', 'seug', 'seugg', 'seugs', 'seun', 'seunj', 'seunh', 'seud', 'seul', 'seulg', 'seulm', 'seulb', 'seuls', 'seult', 'seulp', 'seulh', 'seum', 'seub', 'seubs', 'seus', 'seuss', 'seung', 'seuj', 'seuc', 'seuk', 'seut', 'seup', 'seuh', 'syi', 'syig', 'syigg', 'syigs', 'syin', 'syinj', 'syinh', 'syid', 'syil', 'syilg', 'syilm', 'syilb', 'syils', 'syilt', 'syilp', 'syilh', 'syim', 'syib', 'syibs', 'syis', 'syiss', 'sying', 'syij', 'syic', 'syik', 'syit', 'syip', 'syih', 'si', 'sig', 'sigg', 'sigs', 'sin', 'sinj', 'sinh', 'sid', 'sil', 'silg', 'silm', 'silb', 'sils', 'silt', 'silp', 'silh', 'sim', 'sib', 'sibs', 'sis', 'siss', 'sing', 'sij', 'sic', 'sik', 'sit', 'sip', 'sih', 'ssa', 'ssag', 'ssagg', 'ssags', 'ssan', 'ssanj', 'ssanh', 'ssad'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php
new file mode 100644
index 000000000..d038f56d5
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php
@@ -0,0 +1 @@
+<?php return ['ssal', 'ssalg', 'ssalm', 'ssalb', 'ssals', 'ssalt', 'ssalp', 'ssalh', 'ssam', 'ssab', 'ssabs', 'ssas', 'ssass', 'ssang', 'ssaj', 'ssac', 'ssak', 'ssat', 'ssap', 'ssah', 'ssae', 'ssaeg', 'ssaegg', 'ssaegs', 'ssaen', 'ssaenj', 'ssaenh', 'ssaed', 'ssael', 'ssaelg', 'ssaelm', 'ssaelb', 'ssaels', 'ssaelt', 'ssaelp', 'ssaelh', 'ssaem', 'ssaeb', 'ssaebs', 'ssaes', 'ssaess', 'ssaeng', 'ssaej', 'ssaec', 'ssaek', 'ssaet', 'ssaep', 'ssaeh', 'ssya', 'ssyag', 'ssyagg', 'ssyags', 'ssyan', 'ssyanj', 'ssyanh', 'ssyad', 'ssyal', 'ssyalg', 'ssyalm', 'ssyalb', 'ssyals', 'ssyalt', 'ssyalp', 'ssyalh', 'ssyam', 'ssyab', 'ssyabs', 'ssyas', 'ssyass', 'ssyang', 'ssyaj', 'ssyac', 'ssyak', 'ssyat', 'ssyap', 'ssyah', 'ssyae', 'ssyaeg', 'ssyaegg', 'ssyaegs', 'ssyaen', 'ssyaenj', 'ssyaenh', 'ssyaed', 'ssyael', 'ssyaelg', 'ssyaelm', 'ssyaelb', 'ssyaels', 'ssyaelt', 'ssyaelp', 'ssyaelh', 'ssyaem', 'ssyaeb', 'ssyaebs', 'ssyaes', 'ssyaess', 'ssyaeng', 'ssyaej', 'ssyaec', 'ssyaek', 'ssyaet', 'ssyaep', 'ssyaeh', 'sseo', 'sseog', 'sseogg', 'sseogs', 'sseon', 'sseonj', 'sseonh', 'sseod', 'sseol', 'sseolg', 'sseolm', 'sseolb', 'sseols', 'sseolt', 'sseolp', 'sseolh', 'sseom', 'sseob', 'sseobs', 'sseos', 'sseoss', 'sseong', 'sseoj', 'sseoc', 'sseok', 'sseot', 'sseop', 'sseoh', 'sse', 'sseg', 'ssegg', 'ssegs', 'ssen', 'ssenj', 'ssenh', 'ssed', 'ssel', 'sselg', 'sselm', 'sselb', 'ssels', 'sselt', 'sselp', 'sselh', 'ssem', 'sseb', 'ssebs', 'sses', 'ssess', 'sseng', 'ssej', 'ssec', 'ssek', 'sset', 'ssep', 'sseh', 'ssyeo', 'ssyeog', 'ssyeogg', 'ssyeogs', 'ssyeon', 'ssyeonj', 'ssyeonh', 'ssyeod', 'ssyeol', 'ssyeolg', 'ssyeolm', 'ssyeolb', 'ssyeols', 'ssyeolt', 'ssyeolp', 'ssyeolh', 'ssyeom', 'ssyeob', 'ssyeobs', 'ssyeos', 'ssyeoss', 'ssyeong', 'ssyeoj', 'ssyeoc', 'ssyeok', 'ssyeot', 'ssyeop', 'ssyeoh', 'ssye', 'ssyeg', 'ssyegg', 'ssyegs', 'ssyen', 'ssyenj', 'ssyenh', 'ssyed', 'ssyel', 'ssyelg', 'ssyelm', 'ssyelb', 'ssyels', 'ssyelt', 'ssyelp', 'ssyelh', 'ssyem', 'ssyeb', 'ssyebs', 'ssyes', 'ssyess', 'ssyeng', 'ssyej', 'ssyec', 'ssyek', 'ssyet', 'ssyep', 'ssyeh', 'sso', 'ssog', 'ssogg', 'ssogs', 'sson', 'ssonj', 'ssonh', 'ssod', 'ssol', 'ssolg', 'ssolm', 'ssolb', 'ssols', 'ssolt', 'ssolp', 'ssolh', 'ssom', 'ssob', 'ssobs', 'ssos', 'ssoss', 'ssong', 'ssoj', 'ssoc', 'ssok', 'ssot', 'ssop', 'ssoh', 'sswa', 'sswag', 'sswagg', 'sswags', 'sswan', 'sswanj', 'sswanh', 'sswad', 'sswal', 'sswalg', 'sswalm', 'sswalb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php
new file mode 100644
index 000000000..e23434184
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php
@@ -0,0 +1 @@
+<?php return ['sswals', 'sswalt', 'sswalp', 'sswalh', 'sswam', 'sswab', 'sswabs', 'sswas', 'sswass', 'sswang', 'sswaj', 'sswac', 'sswak', 'sswat', 'sswap', 'sswah', 'sswae', 'sswaeg', 'sswaegg', 'sswaegs', 'sswaen', 'sswaenj', 'sswaenh', 'sswaed', 'sswael', 'sswaelg', 'sswaelm', 'sswaelb', 'sswaels', 'sswaelt', 'sswaelp', 'sswaelh', 'sswaem', 'sswaeb', 'sswaebs', 'sswaes', 'sswaess', 'sswaeng', 'sswaej', 'sswaec', 'sswaek', 'sswaet', 'sswaep', 'sswaeh', 'ssoe', 'ssoeg', 'ssoegg', 'ssoegs', 'ssoen', 'ssoenj', 'ssoenh', 'ssoed', 'ssoel', 'ssoelg', 'ssoelm', 'ssoelb', 'ssoels', 'ssoelt', 'ssoelp', 'ssoelh', 'ssoem', 'ssoeb', 'ssoebs', 'ssoes', 'ssoess', 'ssoeng', 'ssoej', 'ssoec', 'ssoek', 'ssoet', 'ssoep', 'ssoeh', 'ssyo', 'ssyog', 'ssyogg', 'ssyogs', 'ssyon', 'ssyonj', 'ssyonh', 'ssyod', 'ssyol', 'ssyolg', 'ssyolm', 'ssyolb', 'ssyols', 'ssyolt', 'ssyolp', 'ssyolh', 'ssyom', 'ssyob', 'ssyobs', 'ssyos', 'ssyoss', 'ssyong', 'ssyoj', 'ssyoc', 'ssyok', 'ssyot', 'ssyop', 'ssyoh', 'ssu', 'ssug', 'ssugg', 'ssugs', 'ssun', 'ssunj', 'ssunh', 'ssud', 'ssul', 'ssulg', 'ssulm', 'ssulb', 'ssuls', 'ssult', 'ssulp', 'ssulh', 'ssum', 'ssub', 'ssubs', 'ssus', 'ssuss', 'ssung', 'ssuj', 'ssuc', 'ssuk', 'ssut', 'ssup', 'ssuh', 'ssweo', 'ssweog', 'ssweogg', 'ssweogs', 'ssweon', 'ssweonj', 'ssweonh', 'ssweod', 'ssweol', 'ssweolg', 'ssweolm', 'ssweolb', 'ssweols', 'ssweolt', 'ssweolp', 'ssweolh', 'ssweom', 'ssweob', 'ssweobs', 'ssweos', 'ssweoss', 'ssweong', 'ssweoj', 'ssweoc', 'ssweok', 'ssweot', 'ssweop', 'ssweoh', 'sswe', 'ssweg', 'sswegg', 'sswegs', 'sswen', 'sswenj', 'sswenh', 'sswed', 'sswel', 'sswelg', 'sswelm', 'sswelb', 'sswels', 'sswelt', 'sswelp', 'sswelh', 'sswem', 'ssweb', 'sswebs', 'sswes', 'sswess', 'ssweng', 'sswej', 'sswec', 'sswek', 'sswet', 'sswep', 'ssweh', 'sswi', 'sswig', 'sswigg', 'sswigs', 'sswin', 'sswinj', 'sswinh', 'sswid', 'sswil', 'sswilg', 'sswilm', 'sswilb', 'sswils', 'sswilt', 'sswilp', 'sswilh', 'sswim', 'sswib', 'sswibs', 'sswis', 'sswiss', 'sswing', 'sswij', 'sswic', 'sswik', 'sswit', 'sswip', 'sswih', 'ssyu', 'ssyug', 'ssyugg', 'ssyugs', 'ssyun', 'ssyunj', 'ssyunh', 'ssyud', 'ssyul', 'ssyulg', 'ssyulm', 'ssyulb', 'ssyuls', 'ssyult', 'ssyulp', 'ssyulh', 'ssyum', 'ssyub', 'ssyubs', 'ssyus', 'ssyuss', 'ssyung', 'ssyuj', 'ssyuc', 'ssyuk', 'ssyut', 'ssyup', 'ssyuh', 'sseu', 'sseug', 'sseugg', 'sseugs', 'sseun', 'sseunj', 'sseunh', 'sseud', 'sseul', 'sseulg', 'sseulm', 'sseulb', 'sseuls', 'sseult', 'sseulp', 'sseulh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php
new file mode 100644
index 000000000..90c8fbd23
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php
@@ -0,0 +1 @@
+<?php return ['sseum', 'sseub', 'sseubs', 'sseus', 'sseuss', 'sseung', 'sseuj', 'sseuc', 'sseuk', 'sseut', 'sseup', 'sseuh', 'ssyi', 'ssyig', 'ssyigg', 'ssyigs', 'ssyin', 'ssyinj', 'ssyinh', 'ssyid', 'ssyil', 'ssyilg', 'ssyilm', 'ssyilb', 'ssyils', 'ssyilt', 'ssyilp', 'ssyilh', 'ssyim', 'ssyib', 'ssyibs', 'ssyis', 'ssyiss', 'ssying', 'ssyij', 'ssyic', 'ssyik', 'ssyit', 'ssyip', 'ssyih', 'ssi', 'ssig', 'ssigg', 'ssigs', 'ssin', 'ssinj', 'ssinh', 'ssid', 'ssil', 'ssilg', 'ssilm', 'ssilb', 'ssils', 'ssilt', 'ssilp', 'ssilh', 'ssim', 'ssib', 'ssibs', 'ssis', 'ssiss', 'ssing', 'ssij', 'ssic', 'ssik', 'ssit', 'ssip', 'ssih', 'a', 'ag', 'agg', 'ags', 'an', 'anj', 'anh', 'ad', 'al', 'alg', 'alm', 'alb', 'als', 'alt', 'alp', 'alh', 'am', 'ab', 'abs', 'as', 'ass', 'ang', 'aj', 'ac', 'ak', 'at', 'ap', 'ah', 'ae', 'aeg', 'aegg', 'aegs', 'aen', 'aenj', 'aenh', 'aed', 'ael', 'aelg', 'aelm', 'aelb', 'aels', 'aelt', 'aelp', 'aelh', 'aem', 'aeb', 'aebs', 'aes', 'aess', 'aeng', 'aej', 'aec', 'aek', 'aet', 'aep', 'aeh', 'ya', 'yag', 'yagg', 'yags', 'yan', 'yanj', 'yanh', 'yad', 'yal', 'yalg', 'yalm', 'yalb', 'yals', 'yalt', 'yalp', 'yalh', 'yam', 'yab', 'yabs', 'yas', 'yass', 'yang', 'yaj', 'yac', 'yak', 'yat', 'yap', 'yah', 'yae', 'yaeg', 'yaegg', 'yaegs', 'yaen', 'yaenj', 'yaenh', 'yaed', 'yael', 'yaelg', 'yaelm', 'yaelb', 'yaels', 'yaelt', 'yaelp', 'yaelh', 'yaem', 'yaeb', 'yaebs', 'yaes', 'yaess', 'yaeng', 'yaej', 'yaec', 'yaek', 'yaet', 'yaep', 'yaeh', 'eo', 'eog', 'eogg', 'eogs', 'eon', 'eonj', 'eonh', 'eod', 'eol', 'eolg', 'eolm', 'eolb', 'eols', 'eolt', 'eolp', 'eolh', 'eom', 'eob', 'eobs', 'eos', 'eoss', 'eong', 'eoj', 'eoc', 'eok', 'eot', 'eop', 'eoh', 'e', 'eg', 'egg', 'egs', 'en', 'enj', 'enh', 'ed', 'el', 'elg', 'elm', 'elb', 'els', 'elt', 'elp', 'elh', 'em', 'eb', 'ebs', 'es', 'ess', 'eng', 'ej', 'ec', 'ek', 'et', 'ep', 'eh', 'yeo', 'yeog', 'yeogg', 'yeogs', 'yeon', 'yeonj', 'yeonh', 'yeod', 'yeol', 'yeolg', 'yeolm', 'yeolb', 'yeols', 'yeolt', 'yeolp', 'yeolh', 'yeom', 'yeob', 'yeobs', 'yeos'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php
new file mode 100644
index 000000000..5e5993aaf
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php
@@ -0,0 +1 @@
+<?php return ['yeoss', 'yeong', 'yeoj', 'yeoc', 'yeok', 'yeot', 'yeop', 'yeoh', 'ye', 'yeg', 'yegg', 'yegs', 'yen', 'yenj', 'yenh', 'yed', 'yel', 'yelg', 'yelm', 'yelb', 'yels', 'yelt', 'yelp', 'yelh', 'yem', 'yeb', 'yebs', 'yes', 'yess', 'yeng', 'yej', 'yec', 'yek', 'yet', 'yep', 'yeh', 'o', 'og', 'ogg', 'ogs', 'on', 'onj', 'onh', 'od', 'ol', 'olg', 'olm', 'olb', 'ols', 'olt', 'olp', 'olh', 'om', 'ob', 'obs', 'os', 'oss', 'ong', 'oj', 'oc', 'ok', 'ot', 'op', 'oh', 'wa', 'wag', 'wagg', 'wags', 'wan', 'wanj', 'wanh', 'wad', 'wal', 'walg', 'walm', 'walb', 'wals', 'walt', 'walp', 'walh', 'wam', 'wab', 'wabs', 'was', 'wass', 'wang', 'waj', 'wac', 'wak', 'wat', 'wap', 'wah', 'wae', 'waeg', 'waegg', 'waegs', 'waen', 'waenj', 'waenh', 'waed', 'wael', 'waelg', 'waelm', 'waelb', 'waels', 'waelt', 'waelp', 'waelh', 'waem', 'waeb', 'waebs', 'waes', 'waess', 'waeng', 'waej', 'waec', 'waek', 'waet', 'waep', 'waeh', 'oe', 'oeg', 'oegg', 'oegs', 'oen', 'oenj', 'oenh', 'oed', 'oel', 'oelg', 'oelm', 'oelb', 'oels', 'oelt', 'oelp', 'oelh', 'oem', 'oeb', 'oebs', 'oes', 'oess', 'oeng', 'oej', 'oec', 'oek', 'oet', 'oep', 'oeh', 'yo', 'yog', 'yogg', 'yogs', 'yon', 'yonj', 'yonh', 'yod', 'yol', 'yolg', 'yolm', 'yolb', 'yols', 'yolt', 'yolp', 'yolh', 'yom', 'yob', 'yobs', 'yos', 'yoss', 'yong', 'yoj', 'yoc', 'yok', 'yot', 'yop', 'yoh', 'u', 'ug', 'ugg', 'ugs', 'un', 'unj', 'unh', 'ud', 'ul', 'ulg', 'ulm', 'ulb', 'uls', 'ult', 'ulp', 'ulh', 'um', 'ub', 'ubs', 'us', 'uss', 'ung', 'uj', 'uc', 'uk', 'ut', 'up', 'uh', 'weo', 'weog', 'weogg', 'weogs', 'weon', 'weonj', 'weonh', 'weod', 'weol', 'weolg', 'weolm', 'weolb', 'weols', 'weolt', 'weolp', 'weolh', 'weom', 'weob', 'weobs', 'weos', 'weoss', 'weong', 'weoj', 'weoc', 'weok', 'weot', 'weop', 'weoh', 'we', 'weg', 'wegg', 'wegs', 'wen', 'wenj', 'wenh', 'wed', 'wel', 'welg', 'welm', 'welb', 'wels', 'welt', 'welp', 'welh', 'wem', 'web', 'webs', 'wes', 'wess', 'weng', 'wej', 'wec'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php
new file mode 100644
index 000000000..3c006a433
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php
@@ -0,0 +1 @@
+<?php return ['wek', 'wet', 'wep', 'weh', 'wi', 'wig', 'wigg', 'wigs', 'win', 'winj', 'winh', 'wid', 'wil', 'wilg', 'wilm', 'wilb', 'wils', 'wilt', 'wilp', 'wilh', 'wim', 'wib', 'wibs', 'wis', 'wiss', 'wing', 'wij', 'wic', 'wik', 'wit', 'wip', 'wih', 'yu', 'yug', 'yugg', 'yugs', 'yun', 'yunj', 'yunh', 'yud', 'yul', 'yulg', 'yulm', 'yulb', 'yuls', 'yult', 'yulp', 'yulh', 'yum', 'yub', 'yubs', 'yus', 'yuss', 'yung', 'yuj', 'yuc', 'yuk', 'yut', 'yup', 'yuh', 'eu', 'eug', 'eugg', 'eugs', 'eun', 'eunj', 'eunh', 'eud', 'eul', 'eulg', 'eulm', 'eulb', 'euls', 'eult', 'eulp', 'eulh', 'eum', 'eub', 'eubs', 'eus', 'euss', 'eung', 'euj', 'euc', 'euk', 'eut', 'eup', 'euh', 'yi', 'yig', 'yigg', 'yigs', 'yin', 'yinj', 'yinh', 'yid', 'yil', 'yilg', 'yilm', 'yilb', 'yils', 'yilt', 'yilp', 'yilh', 'yim', 'yib', 'yibs', 'yis', 'yiss', 'ying', 'yij', 'yic', 'yik', 'yit', 'yip', 'yih', 'i', 'ig', 'igg', 'igs', 'in', 'inj', 'inh', 'id', 'il', 'ilg', 'ilm', 'ilb', 'ils', 'ilt', 'ilp', 'ilh', 'im', 'ib', 'ibs', 'is', 'iss', 'ing', 'ij', 'ic', 'ik', 'it', 'ip', 'ih', 'ja', 'jag', 'jagg', 'jags', 'jan', 'janj', 'janh', 'jad', 'jal', 'jalg', 'jalm', 'jalb', 'jals', 'jalt', 'jalp', 'jalh', 'jam', 'jab', 'jabs', 'jas', 'jass', 'jang', 'jaj', 'jac', 'jak', 'jat', 'jap', 'jah', 'jae', 'jaeg', 'jaegg', 'jaegs', 'jaen', 'jaenj', 'jaenh', 'jaed', 'jael', 'jaelg', 'jaelm', 'jaelb', 'jaels', 'jaelt', 'jaelp', 'jaelh', 'jaem', 'jaeb', 'jaebs', 'jaes', 'jaess', 'jaeng', 'jaej', 'jaec', 'jaek', 'jaet', 'jaep', 'jaeh', 'jya', 'jyag', 'jyagg', 'jyags', 'jyan', 'jyanj', 'jyanh', 'jyad', 'jyal', 'jyalg', 'jyalm', 'jyalb', 'jyals', 'jyalt', 'jyalp', 'jyalh', 'jyam', 'jyab', 'jyabs', 'jyas', 'jyass', 'jyang', 'jyaj', 'jyac', 'jyak', 'jyat', 'jyap', 'jyah', 'jyae', 'jyaeg', 'jyaegg', 'jyaegs', 'jyaen', 'jyaenj', 'jyaenh', 'jyaed', 'jyael', 'jyaelg', 'jyaelm', 'jyaelb', 'jyaels', 'jyaelt', 'jyaelp', 'jyaelh', 'jyaem', 'jyaeb', 'jyaebs', 'jyaes', 'jyaess', 'jyaeng', 'jyaej', 'jyaec', 'jyaek', 'jyaet', 'jyaep', 'jyaeh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php
new file mode 100644
index 000000000..911138696
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php
@@ -0,0 +1 @@
+<?php return ['jeo', 'jeog', 'jeogg', 'jeogs', 'jeon', 'jeonj', 'jeonh', 'jeod', 'jeol', 'jeolg', 'jeolm', 'jeolb', 'jeols', 'jeolt', 'jeolp', 'jeolh', 'jeom', 'jeob', 'jeobs', 'jeos', 'jeoss', 'jeong', 'jeoj', 'jeoc', 'jeok', 'jeot', 'jeop', 'jeoh', 'je', 'jeg', 'jegg', 'jegs', 'jen', 'jenj', 'jenh', 'jed', 'jel', 'jelg', 'jelm', 'jelb', 'jels', 'jelt', 'jelp', 'jelh', 'jem', 'jeb', 'jebs', 'jes', 'jess', 'jeng', 'jej', 'jec', 'jek', 'jet', 'jep', 'jeh', 'jyeo', 'jyeog', 'jyeogg', 'jyeogs', 'jyeon', 'jyeonj', 'jyeonh', 'jyeod', 'jyeol', 'jyeolg', 'jyeolm', 'jyeolb', 'jyeols', 'jyeolt', 'jyeolp', 'jyeolh', 'jyeom', 'jyeob', 'jyeobs', 'jyeos', 'jyeoss', 'jyeong', 'jyeoj', 'jyeoc', 'jyeok', 'jyeot', 'jyeop', 'jyeoh', 'jye', 'jyeg', 'jyegg', 'jyegs', 'jyen', 'jyenj', 'jyenh', 'jyed', 'jyel', 'jyelg', 'jyelm', 'jyelb', 'jyels', 'jyelt', 'jyelp', 'jyelh', 'jyem', 'jyeb', 'jyebs', 'jyes', 'jyess', 'jyeng', 'jyej', 'jyec', 'jyek', 'jyet', 'jyep', 'jyeh', 'jo', 'jog', 'jogg', 'jogs', 'jon', 'jonj', 'jonh', 'jod', 'jol', 'jolg', 'jolm', 'jolb', 'jols', 'jolt', 'jolp', 'jolh', 'jom', 'job', 'jobs', 'jos', 'joss', 'jong', 'joj', 'joc', 'jok', 'jot', 'jop', 'joh', 'jwa', 'jwag', 'jwagg', 'jwags', 'jwan', 'jwanj', 'jwanh', 'jwad', 'jwal', 'jwalg', 'jwalm', 'jwalb', 'jwals', 'jwalt', 'jwalp', 'jwalh', 'jwam', 'jwab', 'jwabs', 'jwas', 'jwass', 'jwang', 'jwaj', 'jwac', 'jwak', 'jwat', 'jwap', 'jwah', 'jwae', 'jwaeg', 'jwaegg', 'jwaegs', 'jwaen', 'jwaenj', 'jwaenh', 'jwaed', 'jwael', 'jwaelg', 'jwaelm', 'jwaelb', 'jwaels', 'jwaelt', 'jwaelp', 'jwaelh', 'jwaem', 'jwaeb', 'jwaebs', 'jwaes', 'jwaess', 'jwaeng', 'jwaej', 'jwaec', 'jwaek', 'jwaet', 'jwaep', 'jwaeh', 'joe', 'joeg', 'joegg', 'joegs', 'joen', 'joenj', 'joenh', 'joed', 'joel', 'joelg', 'joelm', 'joelb', 'joels', 'joelt', 'joelp', 'joelh', 'joem', 'joeb', 'joebs', 'joes', 'joess', 'joeng', 'joej', 'joec', 'joek', 'joet', 'joep', 'joeh', 'jyo', 'jyog', 'jyogg', 'jyogs', 'jyon', 'jyonj', 'jyonh', 'jyod', 'jyol', 'jyolg', 'jyolm', 'jyolb', 'jyols', 'jyolt', 'jyolp', 'jyolh', 'jyom', 'jyob', 'jyobs', 'jyos', 'jyoss', 'jyong', 'jyoj', 'jyoc', 'jyok', 'jyot', 'jyop', 'jyoh', 'ju', 'jug', 'jugg', 'jugs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php
new file mode 100644
index 000000000..31c897375
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php
@@ -0,0 +1 @@
+<?php return ['jun', 'junj', 'junh', 'jud', 'jul', 'julg', 'julm', 'julb', 'juls', 'jult', 'julp', 'julh', 'jum', 'jub', 'jubs', 'jus', 'juss', 'jung', 'juj', 'juc', 'juk', 'jut', 'jup', 'juh', 'jweo', 'jweog', 'jweogg', 'jweogs', 'jweon', 'jweonj', 'jweonh', 'jweod', 'jweol', 'jweolg', 'jweolm', 'jweolb', 'jweols', 'jweolt', 'jweolp', 'jweolh', 'jweom', 'jweob', 'jweobs', 'jweos', 'jweoss', 'jweong', 'jweoj', 'jweoc', 'jweok', 'jweot', 'jweop', 'jweoh', 'jwe', 'jweg', 'jwegg', 'jwegs', 'jwen', 'jwenj', 'jwenh', 'jwed', 'jwel', 'jwelg', 'jwelm', 'jwelb', 'jwels', 'jwelt', 'jwelp', 'jwelh', 'jwem', 'jweb', 'jwebs', 'jwes', 'jwess', 'jweng', 'jwej', 'jwec', 'jwek', 'jwet', 'jwep', 'jweh', 'jwi', 'jwig', 'jwigg', 'jwigs', 'jwin', 'jwinj', 'jwinh', 'jwid', 'jwil', 'jwilg', 'jwilm', 'jwilb', 'jwils', 'jwilt', 'jwilp', 'jwilh', 'jwim', 'jwib', 'jwibs', 'jwis', 'jwiss', 'jwing', 'jwij', 'jwic', 'jwik', 'jwit', 'jwip', 'jwih', 'jyu', 'jyug', 'jyugg', 'jyugs', 'jyun', 'jyunj', 'jyunh', 'jyud', 'jyul', 'jyulg', 'jyulm', 'jyulb', 'jyuls', 'jyult', 'jyulp', 'jyulh', 'jyum', 'jyub', 'jyubs', 'jyus', 'jyuss', 'jyung', 'jyuj', 'jyuc', 'jyuk', 'jyut', 'jyup', 'jyuh', 'jeu', 'jeug', 'jeugg', 'jeugs', 'jeun', 'jeunj', 'jeunh', 'jeud', 'jeul', 'jeulg', 'jeulm', 'jeulb', 'jeuls', 'jeult', 'jeulp', 'jeulh', 'jeum', 'jeub', 'jeubs', 'jeus', 'jeuss', 'jeung', 'jeuj', 'jeuc', 'jeuk', 'jeut', 'jeup', 'jeuh', 'jyi', 'jyig', 'jyigg', 'jyigs', 'jyin', 'jyinj', 'jyinh', 'jyid', 'jyil', 'jyilg', 'jyilm', 'jyilb', 'jyils', 'jyilt', 'jyilp', 'jyilh', 'jyim', 'jyib', 'jyibs', 'jyis', 'jyiss', 'jying', 'jyij', 'jyic', 'jyik', 'jyit', 'jyip', 'jyih', 'ji', 'jig', 'jigg', 'jigs', 'jin', 'jinj', 'jinh', 'jid', 'jil', 'jilg', 'jilm', 'jilb', 'jils', 'jilt', 'jilp', 'jilh', 'jim', 'jib', 'jibs', 'jis', 'jiss', 'jing', 'jij', 'jic', 'jik', 'jit', 'jip', 'jih', 'jja', 'jjag', 'jjagg', 'jjags', 'jjan', 'jjanj', 'jjanh', 'jjad', 'jjal', 'jjalg', 'jjalm', 'jjalb', 'jjals', 'jjalt', 'jjalp', 'jjalh', 'jjam', 'jjab', 'jjabs', 'jjas', 'jjass', 'jjang', 'jjaj', 'jjac', 'jjak', 'jjat', 'jjap', 'jjah', 'jjae', 'jjaeg', 'jjaegg', 'jjaegs', 'jjaen', 'jjaenj', 'jjaenh', 'jjaed'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php
new file mode 100644
index 000000000..79bb944d9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php
@@ -0,0 +1 @@
+<?php return ['jjael', 'jjaelg', 'jjaelm', 'jjaelb', 'jjaels', 'jjaelt', 'jjaelp', 'jjaelh', 'jjaem', 'jjaeb', 'jjaebs', 'jjaes', 'jjaess', 'jjaeng', 'jjaej', 'jjaec', 'jjaek', 'jjaet', 'jjaep', 'jjaeh', 'jjya', 'jjyag', 'jjyagg', 'jjyags', 'jjyan', 'jjyanj', 'jjyanh', 'jjyad', 'jjyal', 'jjyalg', 'jjyalm', 'jjyalb', 'jjyals', 'jjyalt', 'jjyalp', 'jjyalh', 'jjyam', 'jjyab', 'jjyabs', 'jjyas', 'jjyass', 'jjyang', 'jjyaj', 'jjyac', 'jjyak', 'jjyat', 'jjyap', 'jjyah', 'jjyae', 'jjyaeg', 'jjyaegg', 'jjyaegs', 'jjyaen', 'jjyaenj', 'jjyaenh', 'jjyaed', 'jjyael', 'jjyaelg', 'jjyaelm', 'jjyaelb', 'jjyaels', 'jjyaelt', 'jjyaelp', 'jjyaelh', 'jjyaem', 'jjyaeb', 'jjyaebs', 'jjyaes', 'jjyaess', 'jjyaeng', 'jjyaej', 'jjyaec', 'jjyaek', 'jjyaet', 'jjyaep', 'jjyaeh', 'jjeo', 'jjeog', 'jjeogg', 'jjeogs', 'jjeon', 'jjeonj', 'jjeonh', 'jjeod', 'jjeol', 'jjeolg', 'jjeolm', 'jjeolb', 'jjeols', 'jjeolt', 'jjeolp', 'jjeolh', 'jjeom', 'jjeob', 'jjeobs', 'jjeos', 'jjeoss', 'jjeong', 'jjeoj', 'jjeoc', 'jjeok', 'jjeot', 'jjeop', 'jjeoh', 'jje', 'jjeg', 'jjegg', 'jjegs', 'jjen', 'jjenj', 'jjenh', 'jjed', 'jjel', 'jjelg', 'jjelm', 'jjelb', 'jjels', 'jjelt', 'jjelp', 'jjelh', 'jjem', 'jjeb', 'jjebs', 'jjes', 'jjess', 'jjeng', 'jjej', 'jjec', 'jjek', 'jjet', 'jjep', 'jjeh', 'jjyeo', 'jjyeog', 'jjyeogg', 'jjyeogs', 'jjyeon', 'jjyeonj', 'jjyeonh', 'jjyeod', 'jjyeol', 'jjyeolg', 'jjyeolm', 'jjyeolb', 'jjyeols', 'jjyeolt', 'jjyeolp', 'jjyeolh', 'jjyeom', 'jjyeob', 'jjyeobs', 'jjyeos', 'jjyeoss', 'jjyeong', 'jjyeoj', 'jjyeoc', 'jjyeok', 'jjyeot', 'jjyeop', 'jjyeoh', 'jjye', 'jjyeg', 'jjyegg', 'jjyegs', 'jjyen', 'jjyenj', 'jjyenh', 'jjyed', 'jjyel', 'jjyelg', 'jjyelm', 'jjyelb', 'jjyels', 'jjyelt', 'jjyelp', 'jjyelh', 'jjyem', 'jjyeb', 'jjyebs', 'jjyes', 'jjyess', 'jjyeng', 'jjyej', 'jjyec', 'jjyek', 'jjyet', 'jjyep', 'jjyeh', 'jjo', 'jjog', 'jjogg', 'jjogs', 'jjon', 'jjonj', 'jjonh', 'jjod', 'jjol', 'jjolg', 'jjolm', 'jjolb', 'jjols', 'jjolt', 'jjolp', 'jjolh', 'jjom', 'jjob', 'jjobs', 'jjos', 'jjoss', 'jjong', 'jjoj', 'jjoc', 'jjok', 'jjot', 'jjop', 'jjoh', 'jjwa', 'jjwag', 'jjwagg', 'jjwags', 'jjwan', 'jjwanj', 'jjwanh', 'jjwad', 'jjwal', 'jjwalg', 'jjwalm', 'jjwalb', 'jjwals', 'jjwalt', 'jjwalp', 'jjwalh', 'jjwam', 'jjwab', 'jjwabs', 'jjwas', 'jjwass', 'jjwang', 'jjwaj', 'jjwac', 'jjwak', 'jjwat', 'jjwap', 'jjwah', 'jjwae', 'jjwaeg', 'jjwaegg', 'jjwaegs', 'jjwaen', 'jjwaenj', 'jjwaenh', 'jjwaed', 'jjwael', 'jjwaelg', 'jjwaelm', 'jjwaelb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php
new file mode 100644
index 000000000..117a8dd8c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php
@@ -0,0 +1 @@
+<?php return ['jjwaels', 'jjwaelt', 'jjwaelp', 'jjwaelh', 'jjwaem', 'jjwaeb', 'jjwaebs', 'jjwaes', 'jjwaess', 'jjwaeng', 'jjwaej', 'jjwaec', 'jjwaek', 'jjwaet', 'jjwaep', 'jjwaeh', 'jjoe', 'jjoeg', 'jjoegg', 'jjoegs', 'jjoen', 'jjoenj', 'jjoenh', 'jjoed', 'jjoel', 'jjoelg', 'jjoelm', 'jjoelb', 'jjoels', 'jjoelt', 'jjoelp', 'jjoelh', 'jjoem', 'jjoeb', 'jjoebs', 'jjoes', 'jjoess', 'jjoeng', 'jjoej', 'jjoec', 'jjoek', 'jjoet', 'jjoep', 'jjoeh', 'jjyo', 'jjyog', 'jjyogg', 'jjyogs', 'jjyon', 'jjyonj', 'jjyonh', 'jjyod', 'jjyol', 'jjyolg', 'jjyolm', 'jjyolb', 'jjyols', 'jjyolt', 'jjyolp', 'jjyolh', 'jjyom', 'jjyob', 'jjyobs', 'jjyos', 'jjyoss', 'jjyong', 'jjyoj', 'jjyoc', 'jjyok', 'jjyot', 'jjyop', 'jjyoh', 'jju', 'jjug', 'jjugg', 'jjugs', 'jjun', 'jjunj', 'jjunh', 'jjud', 'jjul', 'jjulg', 'jjulm', 'jjulb', 'jjuls', 'jjult', 'jjulp', 'jjulh', 'jjum', 'jjub', 'jjubs', 'jjus', 'jjuss', 'jjung', 'jjuj', 'jjuc', 'jjuk', 'jjut', 'jjup', 'jjuh', 'jjweo', 'jjweog', 'jjweogg', 'jjweogs', 'jjweon', 'jjweonj', 'jjweonh', 'jjweod', 'jjweol', 'jjweolg', 'jjweolm', 'jjweolb', 'jjweols', 'jjweolt', 'jjweolp', 'jjweolh', 'jjweom', 'jjweob', 'jjweobs', 'jjweos', 'jjweoss', 'jjweong', 'jjweoj', 'jjweoc', 'jjweok', 'jjweot', 'jjweop', 'jjweoh', 'jjwe', 'jjweg', 'jjwegg', 'jjwegs', 'jjwen', 'jjwenj', 'jjwenh', 'jjwed', 'jjwel', 'jjwelg', 'jjwelm', 'jjwelb', 'jjwels', 'jjwelt', 'jjwelp', 'jjwelh', 'jjwem', 'jjweb', 'jjwebs', 'jjwes', 'jjwess', 'jjweng', 'jjwej', 'jjwec', 'jjwek', 'jjwet', 'jjwep', 'jjweh', 'jjwi', 'jjwig', 'jjwigg', 'jjwigs', 'jjwin', 'jjwinj', 'jjwinh', 'jjwid', 'jjwil', 'jjwilg', 'jjwilm', 'jjwilb', 'jjwils', 'jjwilt', 'jjwilp', 'jjwilh', 'jjwim', 'jjwib', 'jjwibs', 'jjwis', 'jjwiss', 'jjwing', 'jjwij', 'jjwic', 'jjwik', 'jjwit', 'jjwip', 'jjwih', 'jjyu', 'jjyug', 'jjyugg', 'jjyugs', 'jjyun', 'jjyunj', 'jjyunh', 'jjyud', 'jjyul', 'jjyulg', 'jjyulm', 'jjyulb', 'jjyuls', 'jjyult', 'jjyulp', 'jjyulh', 'jjyum', 'jjyub', 'jjyubs', 'jjyus', 'jjyuss', 'jjyung', 'jjyuj', 'jjyuc', 'jjyuk', 'jjyut', 'jjyup', 'jjyuh', 'jjeu', 'jjeug', 'jjeugg', 'jjeugs', 'jjeun', 'jjeunj', 'jjeunh', 'jjeud', 'jjeul', 'jjeulg', 'jjeulm', 'jjeulb', 'jjeuls', 'jjeult', 'jjeulp', 'jjeulh', 'jjeum', 'jjeub', 'jjeubs', 'jjeus', 'jjeuss', 'jjeung', 'jjeuj', 'jjeuc', 'jjeuk', 'jjeut', 'jjeup', 'jjeuh', 'jjyi', 'jjyig', 'jjyigg', 'jjyigs', 'jjyin', 'jjyinj', 'jjyinh', 'jjyid', 'jjyil', 'jjyilg', 'jjyilm', 'jjyilb', 'jjyils', 'jjyilt', 'jjyilp', 'jjyilh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php
new file mode 100644
index 000000000..7d38e9ca0
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php
@@ -0,0 +1 @@
+<?php return ['jjyim', 'jjyib', 'jjyibs', 'jjyis', 'jjyiss', 'jjying', 'jjyij', 'jjyic', 'jjyik', 'jjyit', 'jjyip', 'jjyih', 'jji', 'jjig', 'jjigg', 'jjigs', 'jjin', 'jjinj', 'jjinh', 'jjid', 'jjil', 'jjilg', 'jjilm', 'jjilb', 'jjils', 'jjilt', 'jjilp', 'jjilh', 'jjim', 'jjib', 'jjibs', 'jjis', 'jjiss', 'jjing', 'jjij', 'jjic', 'jjik', 'jjit', 'jjip', 'jjih', 'ca', 'cag', 'cagg', 'cags', 'can', 'canj', 'canh', 'cad', 'cal', 'calg', 'calm', 'calb', 'cals', 'calt', 'calp', 'calh', 'cam', 'cab', 'cabs', 'cas', 'cass', 'cang', 'caj', 'cac', 'cak', 'cat', 'cap', 'cah', 'cae', 'caeg', 'caegg', 'caegs', 'caen', 'caenj', 'caenh', 'caed', 'cael', 'caelg', 'caelm', 'caelb', 'caels', 'caelt', 'caelp', 'caelh', 'caem', 'caeb', 'caebs', 'caes', 'caess', 'caeng', 'caej', 'caec', 'caek', 'caet', 'caep', 'caeh', 'cya', 'cyag', 'cyagg', 'cyags', 'cyan', 'cyanj', 'cyanh', 'cyad', 'cyal', 'cyalg', 'cyalm', 'cyalb', 'cyals', 'cyalt', 'cyalp', 'cyalh', 'cyam', 'cyab', 'cyabs', 'cyas', 'cyass', 'cyang', 'cyaj', 'cyac', 'cyak', 'cyat', 'cyap', 'cyah', 'cyae', 'cyaeg', 'cyaegg', 'cyaegs', 'cyaen', 'cyaenj', 'cyaenh', 'cyaed', 'cyael', 'cyaelg', 'cyaelm', 'cyaelb', 'cyaels', 'cyaelt', 'cyaelp', 'cyaelh', 'cyaem', 'cyaeb', 'cyaebs', 'cyaes', 'cyaess', 'cyaeng', 'cyaej', 'cyaec', 'cyaek', 'cyaet', 'cyaep', 'cyaeh', 'ceo', 'ceog', 'ceogg', 'ceogs', 'ceon', 'ceonj', 'ceonh', 'ceod', 'ceol', 'ceolg', 'ceolm', 'ceolb', 'ceols', 'ceolt', 'ceolp', 'ceolh', 'ceom', 'ceob', 'ceobs', 'ceos', 'ceoss', 'ceong', 'ceoj', 'ceoc', 'ceok', 'ceot', 'ceop', 'ceoh', 'ce', 'ceg', 'cegg', 'cegs', 'cen', 'cenj', 'cenh', 'ced', 'cel', 'celg', 'celm', 'celb', 'cels', 'celt', 'celp', 'celh', 'cem', 'ceb', 'cebs', 'ces', 'cess', 'ceng', 'cej', 'cec', 'cek', 'cet', 'cep', 'ceh', 'cyeo', 'cyeog', 'cyeogg', 'cyeogs', 'cyeon', 'cyeonj', 'cyeonh', 'cyeod', 'cyeol', 'cyeolg', 'cyeolm', 'cyeolb', 'cyeols', 'cyeolt', 'cyeolp', 'cyeolh', 'cyeom', 'cyeob', 'cyeobs', 'cyeos', 'cyeoss', 'cyeong', 'cyeoj', 'cyeoc', 'cyeok', 'cyeot', 'cyeop', 'cyeoh', 'cye', 'cyeg', 'cyegg', 'cyegs', 'cyen', 'cyenj', 'cyenh', 'cyed', 'cyel', 'cyelg', 'cyelm', 'cyelb', 'cyels', 'cyelt', 'cyelp', 'cyelh', 'cyem', 'cyeb', 'cyebs', 'cyes'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php
new file mode 100644
index 000000000..f40bb6469
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php
@@ -0,0 +1 @@
+<?php return ['cyess', 'cyeng', 'cyej', 'cyec', 'cyek', 'cyet', 'cyep', 'cyeh', 'co', 'cog', 'cogg', 'cogs', 'con', 'conj', 'conh', 'cod', 'col', 'colg', 'colm', 'colb', 'cols', 'colt', 'colp', 'colh', 'com', 'cob', 'cobs', 'cos', 'coss', 'cong', 'coj', 'coc', 'cok', 'cot', 'cop', 'coh', 'cwa', 'cwag', 'cwagg', 'cwags', 'cwan', 'cwanj', 'cwanh', 'cwad', 'cwal', 'cwalg', 'cwalm', 'cwalb', 'cwals', 'cwalt', 'cwalp', 'cwalh', 'cwam', 'cwab', 'cwabs', 'cwas', 'cwass', 'cwang', 'cwaj', 'cwac', 'cwak', 'cwat', 'cwap', 'cwah', 'cwae', 'cwaeg', 'cwaegg', 'cwaegs', 'cwaen', 'cwaenj', 'cwaenh', 'cwaed', 'cwael', 'cwaelg', 'cwaelm', 'cwaelb', 'cwaels', 'cwaelt', 'cwaelp', 'cwaelh', 'cwaem', 'cwaeb', 'cwaebs', 'cwaes', 'cwaess', 'cwaeng', 'cwaej', 'cwaec', 'cwaek', 'cwaet', 'cwaep', 'cwaeh', 'coe', 'coeg', 'coegg', 'coegs', 'coen', 'coenj', 'coenh', 'coed', 'coel', 'coelg', 'coelm', 'coelb', 'coels', 'coelt', 'coelp', 'coelh', 'coem', 'coeb', 'coebs', 'coes', 'coess', 'coeng', 'coej', 'coec', 'coek', 'coet', 'coep', 'coeh', 'cyo', 'cyog', 'cyogg', 'cyogs', 'cyon', 'cyonj', 'cyonh', 'cyod', 'cyol', 'cyolg', 'cyolm', 'cyolb', 'cyols', 'cyolt', 'cyolp', 'cyolh', 'cyom', 'cyob', 'cyobs', 'cyos', 'cyoss', 'cyong', 'cyoj', 'cyoc', 'cyok', 'cyot', 'cyop', 'cyoh', 'cu', 'cug', 'cugg', 'cugs', 'cun', 'cunj', 'cunh', 'cud', 'cul', 'culg', 'culm', 'culb', 'culs', 'cult', 'culp', 'culh', 'cum', 'cub', 'cubs', 'cus', 'cuss', 'cung', 'cuj', 'cuc', 'cuk', 'cut', 'cup', 'cuh', 'cweo', 'cweog', 'cweogg', 'cweogs', 'cweon', 'cweonj', 'cweonh', 'cweod', 'cweol', 'cweolg', 'cweolm', 'cweolb', 'cweols', 'cweolt', 'cweolp', 'cweolh', 'cweom', 'cweob', 'cweobs', 'cweos', 'cweoss', 'cweong', 'cweoj', 'cweoc', 'cweok', 'cweot', 'cweop', 'cweoh', 'cwe', 'cweg', 'cwegg', 'cwegs', 'cwen', 'cwenj', 'cwenh', 'cwed', 'cwel', 'cwelg', 'cwelm', 'cwelb', 'cwels', 'cwelt', 'cwelp', 'cwelh', 'cwem', 'cweb', 'cwebs', 'cwes', 'cwess', 'cweng', 'cwej', 'cwec', 'cwek', 'cwet', 'cwep', 'cweh', 'cwi', 'cwig', 'cwigg', 'cwigs', 'cwin', 'cwinj', 'cwinh', 'cwid', 'cwil', 'cwilg', 'cwilm', 'cwilb', 'cwils', 'cwilt', 'cwilp', 'cwilh', 'cwim', 'cwib', 'cwibs', 'cwis', 'cwiss', 'cwing', 'cwij', 'cwic'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php
new file mode 100644
index 000000000..92e8b2df5
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php
@@ -0,0 +1 @@
+<?php return ['cwik', 'cwit', 'cwip', 'cwih', 'cyu', 'cyug', 'cyugg', 'cyugs', 'cyun', 'cyunj', 'cyunh', 'cyud', 'cyul', 'cyulg', 'cyulm', 'cyulb', 'cyuls', 'cyult', 'cyulp', 'cyulh', 'cyum', 'cyub', 'cyubs', 'cyus', 'cyuss', 'cyung', 'cyuj', 'cyuc', 'cyuk', 'cyut', 'cyup', 'cyuh', 'ceu', 'ceug', 'ceugg', 'ceugs', 'ceun', 'ceunj', 'ceunh', 'ceud', 'ceul', 'ceulg', 'ceulm', 'ceulb', 'ceuls', 'ceult', 'ceulp', 'ceulh', 'ceum', 'ceub', 'ceubs', 'ceus', 'ceuss', 'ceung', 'ceuj', 'ceuc', 'ceuk', 'ceut', 'ceup', 'ceuh', 'cyi', 'cyig', 'cyigg', 'cyigs', 'cyin', 'cyinj', 'cyinh', 'cyid', 'cyil', 'cyilg', 'cyilm', 'cyilb', 'cyils', 'cyilt', 'cyilp', 'cyilh', 'cyim', 'cyib', 'cyibs', 'cyis', 'cyiss', 'cying', 'cyij', 'cyic', 'cyik', 'cyit', 'cyip', 'cyih', 'ci', 'cig', 'cigg', 'cigs', 'cin', 'cinj', 'cinh', 'cid', 'cil', 'cilg', 'cilm', 'cilb', 'cils', 'cilt', 'cilp', 'cilh', 'cim', 'cib', 'cibs', 'cis', 'ciss', 'cing', 'cij', 'cic', 'cik', 'cit', 'cip', 'cih', 'ka', 'kag', 'kagg', 'kags', 'kan', 'kanj', 'kanh', 'kad', 'kal', 'kalg', 'kalm', 'kalb', 'kals', 'kalt', 'kalp', 'kalh', 'kam', 'kab', 'kabs', 'kas', 'kass', 'kang', 'kaj', 'kac', 'kak', 'kat', 'kap', 'kah', 'kae', 'kaeg', 'kaegg', 'kaegs', 'kaen', 'kaenj', 'kaenh', 'kaed', 'kael', 'kaelg', 'kaelm', 'kaelb', 'kaels', 'kaelt', 'kaelp', 'kaelh', 'kaem', 'kaeb', 'kaebs', 'kaes', 'kaess', 'kaeng', 'kaej', 'kaec', 'kaek', 'kaet', 'kaep', 'kaeh', 'kya', 'kyag', 'kyagg', 'kyags', 'kyan', 'kyanj', 'kyanh', 'kyad', 'kyal', 'kyalg', 'kyalm', 'kyalb', 'kyals', 'kyalt', 'kyalp', 'kyalh', 'kyam', 'kyab', 'kyabs', 'kyas', 'kyass', 'kyang', 'kyaj', 'kyac', 'kyak', 'kyat', 'kyap', 'kyah', 'kyae', 'kyaeg', 'kyaegg', 'kyaegs', 'kyaen', 'kyaenj', 'kyaenh', 'kyaed', 'kyael', 'kyaelg', 'kyaelm', 'kyaelb', 'kyaels', 'kyaelt', 'kyaelp', 'kyaelh', 'kyaem', 'kyaeb', 'kyaebs', 'kyaes', 'kyaess', 'kyaeng', 'kyaej', 'kyaec', 'kyaek', 'kyaet', 'kyaep', 'kyaeh', 'keo', 'keog', 'keogg', 'keogs', 'keon', 'keonj', 'keonh', 'keod', 'keol', 'keolg', 'keolm', 'keolb', 'keols', 'keolt', 'keolp', 'keolh', 'keom', 'keob', 'keobs', 'keos', 'keoss', 'keong', 'keoj', 'keoc', 'keok', 'keot', 'keop', 'keoh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php
new file mode 100644
index 000000000..607d1e1ff
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php
@@ -0,0 +1 @@
+<?php return ['ke', 'keg', 'kegg', 'kegs', 'ken', 'kenj', 'kenh', 'ked', 'kel', 'kelg', 'kelm', 'kelb', 'kels', 'kelt', 'kelp', 'kelh', 'kem', 'keb', 'kebs', 'kes', 'kess', 'keng', 'kej', 'kec', 'kek', 'ket', 'kep', 'keh', 'kyeo', 'kyeog', 'kyeogg', 'kyeogs', 'kyeon', 'kyeonj', 'kyeonh', 'kyeod', 'kyeol', 'kyeolg', 'kyeolm', 'kyeolb', 'kyeols', 'kyeolt', 'kyeolp', 'kyeolh', 'kyeom', 'kyeob', 'kyeobs', 'kyeos', 'kyeoss', 'kyeong', 'kyeoj', 'kyeoc', 'kyeok', 'kyeot', 'kyeop', 'kyeoh', 'kye', 'kyeg', 'kyegg', 'kyegs', 'kyen', 'kyenj', 'kyenh', 'kyed', 'kyel', 'kyelg', 'kyelm', 'kyelb', 'kyels', 'kyelt', 'kyelp', 'kyelh', 'kyem', 'kyeb', 'kyebs', 'kyes', 'kyess', 'kyeng', 'kyej', 'kyec', 'kyek', 'kyet', 'kyep', 'kyeh', 'ko', 'kog', 'kogg', 'kogs', 'kon', 'konj', 'konh', 'kod', 'kol', 'kolg', 'kolm', 'kolb', 'kols', 'kolt', 'kolp', 'kolh', 'kom', 'kob', 'kobs', 'kos', 'koss', 'kong', 'koj', 'koc', 'kok', 'kot', 'kop', 'koh', 'kwa', 'kwag', 'kwagg', 'kwags', 'kwan', 'kwanj', 'kwanh', 'kwad', 'kwal', 'kwalg', 'kwalm', 'kwalb', 'kwals', 'kwalt', 'kwalp', 'kwalh', 'kwam', 'kwab', 'kwabs', 'kwas', 'kwass', 'kwang', 'kwaj', 'kwac', 'kwak', 'kwat', 'kwap', 'kwah', 'kwae', 'kwaeg', 'kwaegg', 'kwaegs', 'kwaen', 'kwaenj', 'kwaenh', 'kwaed', 'kwael', 'kwaelg', 'kwaelm', 'kwaelb', 'kwaels', 'kwaelt', 'kwaelp', 'kwaelh', 'kwaem', 'kwaeb', 'kwaebs', 'kwaes', 'kwaess', 'kwaeng', 'kwaej', 'kwaec', 'kwaek', 'kwaet', 'kwaep', 'kwaeh', 'koe', 'koeg', 'koegg', 'koegs', 'koen', 'koenj', 'koenh', 'koed', 'koel', 'koelg', 'koelm', 'koelb', 'koels', 'koelt', 'koelp', 'koelh', 'koem', 'koeb', 'koebs', 'koes', 'koess', 'koeng', 'koej', 'koec', 'koek', 'koet', 'koep', 'koeh', 'kyo', 'kyog', 'kyogg', 'kyogs', 'kyon', 'kyonj', 'kyonh', 'kyod', 'kyol', 'kyolg', 'kyolm', 'kyolb', 'kyols', 'kyolt', 'kyolp', 'kyolh', 'kyom', 'kyob', 'kyobs', 'kyos', 'kyoss', 'kyong', 'kyoj', 'kyoc', 'kyok', 'kyot', 'kyop', 'kyoh', 'ku', 'kug', 'kugg', 'kugs', 'kun', 'kunj', 'kunh', 'kud', 'kul', 'kulg', 'kulm', 'kulb', 'kuls', 'kult', 'kulp', 'kulh', 'kum', 'kub', 'kubs', 'kus', 'kuss', 'kung', 'kuj', 'kuc', 'kuk', 'kut', 'kup', 'kuh', 'kweo', 'kweog', 'kweogg', 'kweogs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php
new file mode 100644
index 000000000..f92179381
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php
@@ -0,0 +1 @@
+<?php return ['kweon', 'kweonj', 'kweonh', 'kweod', 'kweol', 'kweolg', 'kweolm', 'kweolb', 'kweols', 'kweolt', 'kweolp', 'kweolh', 'kweom', 'kweob', 'kweobs', 'kweos', 'kweoss', 'kweong', 'kweoj', 'kweoc', 'kweok', 'kweot', 'kweop', 'kweoh', 'kwe', 'kweg', 'kwegg', 'kwegs', 'kwen', 'kwenj', 'kwenh', 'kwed', 'kwel', 'kwelg', 'kwelm', 'kwelb', 'kwels', 'kwelt', 'kwelp', 'kwelh', 'kwem', 'kweb', 'kwebs', 'kwes', 'kwess', 'kweng', 'kwej', 'kwec', 'kwek', 'kwet', 'kwep', 'kweh', 'kwi', 'kwig', 'kwigg', 'kwigs', 'kwin', 'kwinj', 'kwinh', 'kwid', 'kwil', 'kwilg', 'kwilm', 'kwilb', 'kwils', 'kwilt', 'kwilp', 'kwilh', 'kwim', 'kwib', 'kwibs', 'kwis', 'kwiss', 'kwing', 'kwij', 'kwic', 'kwik', 'kwit', 'kwip', 'kwih', 'kyu', 'kyug', 'kyugg', 'kyugs', 'kyun', 'kyunj', 'kyunh', 'kyud', 'kyul', 'kyulg', 'kyulm', 'kyulb', 'kyuls', 'kyult', 'kyulp', 'kyulh', 'kyum', 'kyub', 'kyubs', 'kyus', 'kyuss', 'kyung', 'kyuj', 'kyuc', 'kyuk', 'kyut', 'kyup', 'kyuh', 'keu', 'keug', 'keugg', 'keugs', 'keun', 'keunj', 'keunh', 'keud', 'keul', 'keulg', 'keulm', 'keulb', 'keuls', 'keult', 'keulp', 'keulh', 'keum', 'keub', 'keubs', 'keus', 'keuss', 'keung', 'keuj', 'keuc', 'keuk', 'keut', 'keup', 'keuh', 'kyi', 'kyig', 'kyigg', 'kyigs', 'kyin', 'kyinj', 'kyinh', 'kyid', 'kyil', 'kyilg', 'kyilm', 'kyilb', 'kyils', 'kyilt', 'kyilp', 'kyilh', 'kyim', 'kyib', 'kyibs', 'kyis', 'kyiss', 'kying', 'kyij', 'kyic', 'kyik', 'kyit', 'kyip', 'kyih', 'ki', 'kig', 'kigg', 'kigs', 'kin', 'kinj', 'kinh', 'kid', 'kil', 'kilg', 'kilm', 'kilb', 'kils', 'kilt', 'kilp', 'kilh', 'kim', 'kib', 'kibs', 'kis', 'kiss', 'king', 'kij', 'kic', 'kik', 'kit', 'kip', 'kih', 'ta', 'tag', 'tagg', 'tags', 'tan', 'tanj', 'tanh', 'tad', 'tal', 'talg', 'talm', 'talb', 'tals', 'talt', 'talp', 'talh', 'tam', 'tab', 'tabs', 'tas', 'tass', 'tang', 'taj', 'tac', 'tak', 'tat', 'tap', 'tah', 'tae', 'taeg', 'taegg', 'taegs', 'taen', 'taenj', 'taenh', 'taed', 'tael', 'taelg', 'taelm', 'taelb', 'taels', 'taelt', 'taelp', 'taelh', 'taem', 'taeb', 'taebs', 'taes', 'taess', 'taeng', 'taej', 'taec', 'taek', 'taet', 'taep', 'taeh', 'tya', 'tyag', 'tyagg', 'tyags', 'tyan', 'tyanj', 'tyanh', 'tyad'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php
new file mode 100644
index 000000000..ea8455a0b
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php
@@ -0,0 +1 @@
+<?php return ['tyal', 'tyalg', 'tyalm', 'tyalb', 'tyals', 'tyalt', 'tyalp', 'tyalh', 'tyam', 'tyab', 'tyabs', 'tyas', 'tyass', 'tyang', 'tyaj', 'tyac', 'tyak', 'tyat', 'tyap', 'tyah', 'tyae', 'tyaeg', 'tyaegg', 'tyaegs', 'tyaen', 'tyaenj', 'tyaenh', 'tyaed', 'tyael', 'tyaelg', 'tyaelm', 'tyaelb', 'tyaels', 'tyaelt', 'tyaelp', 'tyaelh', 'tyaem', 'tyaeb', 'tyaebs', 'tyaes', 'tyaess', 'tyaeng', 'tyaej', 'tyaec', 'tyaek', 'tyaet', 'tyaep', 'tyaeh', 'teo', 'teog', 'teogg', 'teogs', 'teon', 'teonj', 'teonh', 'teod', 'teol', 'teolg', 'teolm', 'teolb', 'teols', 'teolt', 'teolp', 'teolh', 'teom', 'teob', 'teobs', 'teos', 'teoss', 'teong', 'teoj', 'teoc', 'teok', 'teot', 'teop', 'teoh', 'te', 'teg', 'tegg', 'tegs', 'ten', 'tenj', 'tenh', 'ted', 'tel', 'telg', 'telm', 'telb', 'tels', 'telt', 'telp', 'telh', 'tem', 'teb', 'tebs', 'tes', 'tess', 'teng', 'tej', 'tec', 'tek', 'tet', 'tep', 'teh', 'tyeo', 'tyeog', 'tyeogg', 'tyeogs', 'tyeon', 'tyeonj', 'tyeonh', 'tyeod', 'tyeol', 'tyeolg', 'tyeolm', 'tyeolb', 'tyeols', 'tyeolt', 'tyeolp', 'tyeolh', 'tyeom', 'tyeob', 'tyeobs', 'tyeos', 'tyeoss', 'tyeong', 'tyeoj', 'tyeoc', 'tyeok', 'tyeot', 'tyeop', 'tyeoh', 'tye', 'tyeg', 'tyegg', 'tyegs', 'tyen', 'tyenj', 'tyenh', 'tyed', 'tyel', 'tyelg', 'tyelm', 'tyelb', 'tyels', 'tyelt', 'tyelp', 'tyelh', 'tyem', 'tyeb', 'tyebs', 'tyes', 'tyess', 'tyeng', 'tyej', 'tyec', 'tyek', 'tyet', 'tyep', 'tyeh', 'to', 'tog', 'togg', 'togs', 'ton', 'tonj', 'tonh', 'tod', 'tol', 'tolg', 'tolm', 'tolb', 'tols', 'tolt', 'tolp', 'tolh', 'tom', 'tob', 'tobs', 'tos', 'toss', 'tong', 'toj', 'toc', 'tok', 'tot', 'top', 'toh', 'twa', 'twag', 'twagg', 'twags', 'twan', 'twanj', 'twanh', 'twad', 'twal', 'twalg', 'twalm', 'twalb', 'twals', 'twalt', 'twalp', 'twalh', 'twam', 'twab', 'twabs', 'twas', 'twass', 'twang', 'twaj', 'twac', 'twak', 'twat', 'twap', 'twah', 'twae', 'twaeg', 'twaegg', 'twaegs', 'twaen', 'twaenj', 'twaenh', 'twaed', 'twael', 'twaelg', 'twaelm', 'twaelb', 'twaels', 'twaelt', 'twaelp', 'twaelh', 'twaem', 'twaeb', 'twaebs', 'twaes', 'twaess', 'twaeng', 'twaej', 'twaec', 'twaek', 'twaet', 'twaep', 'twaeh', 'toe', 'toeg', 'toegg', 'toegs', 'toen', 'toenj', 'toenh', 'toed', 'toel', 'toelg', 'toelm', 'toelb'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php
new file mode 100644
index 000000000..f18334d3c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php
@@ -0,0 +1 @@
+<?php return ['toels', 'toelt', 'toelp', 'toelh', 'toem', 'toeb', 'toebs', 'toes', 'toess', 'toeng', 'toej', 'toec', 'toek', 'toet', 'toep', 'toeh', 'tyo', 'tyog', 'tyogg', 'tyogs', 'tyon', 'tyonj', 'tyonh', 'tyod', 'tyol', 'tyolg', 'tyolm', 'tyolb', 'tyols', 'tyolt', 'tyolp', 'tyolh', 'tyom', 'tyob', 'tyobs', 'tyos', 'tyoss', 'tyong', 'tyoj', 'tyoc', 'tyok', 'tyot', 'tyop', 'tyoh', 'tu', 'tug', 'tugg', 'tugs', 'tun', 'tunj', 'tunh', 'tud', 'tul', 'tulg', 'tulm', 'tulb', 'tuls', 'tult', 'tulp', 'tulh', 'tum', 'tub', 'tubs', 'tus', 'tuss', 'tung', 'tuj', 'tuc', 'tuk', 'tut', 'tup', 'tuh', 'tweo', 'tweog', 'tweogg', 'tweogs', 'tweon', 'tweonj', 'tweonh', 'tweod', 'tweol', 'tweolg', 'tweolm', 'tweolb', 'tweols', 'tweolt', 'tweolp', 'tweolh', 'tweom', 'tweob', 'tweobs', 'tweos', 'tweoss', 'tweong', 'tweoj', 'tweoc', 'tweok', 'tweot', 'tweop', 'tweoh', 'twe', 'tweg', 'twegg', 'twegs', 'twen', 'twenj', 'twenh', 'twed', 'twel', 'twelg', 'twelm', 'twelb', 'twels', 'twelt', 'twelp', 'twelh', 'twem', 'tweb', 'twebs', 'twes', 'twess', 'tweng', 'twej', 'twec', 'twek', 'twet', 'twep', 'tweh', 'twi', 'twig', 'twigg', 'twigs', 'twin', 'twinj', 'twinh', 'twid', 'twil', 'twilg', 'twilm', 'twilb', 'twils', 'twilt', 'twilp', 'twilh', 'twim', 'twib', 'twibs', 'twis', 'twiss', 'twing', 'twij', 'twic', 'twik', 'twit', 'twip', 'twih', 'tyu', 'tyug', 'tyugg', 'tyugs', 'tyun', 'tyunj', 'tyunh', 'tyud', 'tyul', 'tyulg', 'tyulm', 'tyulb', 'tyuls', 'tyult', 'tyulp', 'tyulh', 'tyum', 'tyub', 'tyubs', 'tyus', 'tyuss', 'tyung', 'tyuj', 'tyuc', 'tyuk', 'tyut', 'tyup', 'tyuh', 'teu', 'teug', 'teugg', 'teugs', 'teun', 'teunj', 'teunh', 'teud', 'teul', 'teulg', 'teulm', 'teulb', 'teuls', 'teult', 'teulp', 'teulh', 'teum', 'teub', 'teubs', 'teus', 'teuss', 'teung', 'teuj', 'teuc', 'teuk', 'teut', 'teup', 'teuh', 'tyi', 'tyig', 'tyigg', 'tyigs', 'tyin', 'tyinj', 'tyinh', 'tyid', 'tyil', 'tyilg', 'tyilm', 'tyilb', 'tyils', 'tyilt', 'tyilp', 'tyilh', 'tyim', 'tyib', 'tyibs', 'tyis', 'tyiss', 'tying', 'tyij', 'tyic', 'tyik', 'tyit', 'tyip', 'tyih', 'ti', 'tig', 'tigg', 'tigs', 'tin', 'tinj', 'tinh', 'tid', 'til', 'tilg', 'tilm', 'tilb', 'tils', 'tilt', 'tilp', 'tilh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php
new file mode 100644
index 000000000..5f73d8457
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php
@@ -0,0 +1 @@
+<?php return ['tim', 'tib', 'tibs', 'tis', 'tiss', 'ting', 'tij', 'tic', 'tik', 'tit', 'tip', 'tih', 'pa', 'pag', 'pagg', 'pags', 'pan', 'panj', 'panh', 'pad', 'pal', 'palg', 'palm', 'palb', 'pals', 'palt', 'palp', 'palh', 'pam', 'pab', 'pabs', 'pas', 'pass', 'pang', 'paj', 'pac', 'pak', 'pat', 'pap', 'pah', 'pae', 'paeg', 'paegg', 'paegs', 'paen', 'paenj', 'paenh', 'paed', 'pael', 'paelg', 'paelm', 'paelb', 'paels', 'paelt', 'paelp', 'paelh', 'paem', 'paeb', 'paebs', 'paes', 'paess', 'paeng', 'paej', 'paec', 'paek', 'paet', 'paep', 'paeh', 'pya', 'pyag', 'pyagg', 'pyags', 'pyan', 'pyanj', 'pyanh', 'pyad', 'pyal', 'pyalg', 'pyalm', 'pyalb', 'pyals', 'pyalt', 'pyalp', 'pyalh', 'pyam', 'pyab', 'pyabs', 'pyas', 'pyass', 'pyang', 'pyaj', 'pyac', 'pyak', 'pyat', 'pyap', 'pyah', 'pyae', 'pyaeg', 'pyaegg', 'pyaegs', 'pyaen', 'pyaenj', 'pyaenh', 'pyaed', 'pyael', 'pyaelg', 'pyaelm', 'pyaelb', 'pyaels', 'pyaelt', 'pyaelp', 'pyaelh', 'pyaem', 'pyaeb', 'pyaebs', 'pyaes', 'pyaess', 'pyaeng', 'pyaej', 'pyaec', 'pyaek', 'pyaet', 'pyaep', 'pyaeh', 'peo', 'peog', 'peogg', 'peogs', 'peon', 'peonj', 'peonh', 'peod', 'peol', 'peolg', 'peolm', 'peolb', 'peols', 'peolt', 'peolp', 'peolh', 'peom', 'peob', 'peobs', 'peos', 'peoss', 'peong', 'peoj', 'peoc', 'peok', 'peot', 'peop', 'peoh', 'pe', 'peg', 'pegg', 'pegs', 'pen', 'penj', 'penh', 'ped', 'pel', 'pelg', 'pelm', 'pelb', 'pels', 'pelt', 'pelp', 'pelh', 'pem', 'peb', 'pebs', 'pes', 'pess', 'peng', 'pej', 'pec', 'pek', 'pet', 'pep', 'peh', 'pyeo', 'pyeog', 'pyeogg', 'pyeogs', 'pyeon', 'pyeonj', 'pyeonh', 'pyeod', 'pyeol', 'pyeolg', 'pyeolm', 'pyeolb', 'pyeols', 'pyeolt', 'pyeolp', 'pyeolh', 'pyeom', 'pyeob', 'pyeobs', 'pyeos', 'pyeoss', 'pyeong', 'pyeoj', 'pyeoc', 'pyeok', 'pyeot', 'pyeop', 'pyeoh', 'pye', 'pyeg', 'pyegg', 'pyegs', 'pyen', 'pyenj', 'pyenh', 'pyed', 'pyel', 'pyelg', 'pyelm', 'pyelb', 'pyels', 'pyelt', 'pyelp', 'pyelh', 'pyem', 'pyeb', 'pyebs', 'pyes', 'pyess', 'pyeng', 'pyej', 'pyec', 'pyek', 'pyet', 'pyep', 'pyeh', 'po', 'pog', 'pogg', 'pogs', 'pon', 'ponj', 'ponh', 'pod', 'pol', 'polg', 'polm', 'polb', 'pols', 'polt', 'polp', 'polh', 'pom', 'pob', 'pobs', 'pos'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php
new file mode 100644
index 000000000..21bdc3532
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php
@@ -0,0 +1 @@
+<?php return ['poss', 'pong', 'poj', 'poc', 'pok', 'pot', 'pop', 'poh', 'pwa', 'pwag', 'pwagg', 'pwags', 'pwan', 'pwanj', 'pwanh', 'pwad', 'pwal', 'pwalg', 'pwalm', 'pwalb', 'pwals', 'pwalt', 'pwalp', 'pwalh', 'pwam', 'pwab', 'pwabs', 'pwas', 'pwass', 'pwang', 'pwaj', 'pwac', 'pwak', 'pwat', 'pwap', 'pwah', 'pwae', 'pwaeg', 'pwaegg', 'pwaegs', 'pwaen', 'pwaenj', 'pwaenh', 'pwaed', 'pwael', 'pwaelg', 'pwaelm', 'pwaelb', 'pwaels', 'pwaelt', 'pwaelp', 'pwaelh', 'pwaem', 'pwaeb', 'pwaebs', 'pwaes', 'pwaess', 'pwaeng', 'pwaej', 'pwaec', 'pwaek', 'pwaet', 'pwaep', 'pwaeh', 'poe', 'poeg', 'poegg', 'poegs', 'poen', 'poenj', 'poenh', 'poed', 'poel', 'poelg', 'poelm', 'poelb', 'poels', 'poelt', 'poelp', 'poelh', 'poem', 'poeb', 'poebs', 'poes', 'poess', 'poeng', 'poej', 'poec', 'poek', 'poet', 'poep', 'poeh', 'pyo', 'pyog', 'pyogg', 'pyogs', 'pyon', 'pyonj', 'pyonh', 'pyod', 'pyol', 'pyolg', 'pyolm', 'pyolb', 'pyols', 'pyolt', 'pyolp', 'pyolh', 'pyom', 'pyob', 'pyobs', 'pyos', 'pyoss', 'pyong', 'pyoj', 'pyoc', 'pyok', 'pyot', 'pyop', 'pyoh', 'pu', 'pug', 'pugg', 'pugs', 'pun', 'punj', 'punh', 'pud', 'pul', 'pulg', 'pulm', 'pulb', 'puls', 'pult', 'pulp', 'pulh', 'pum', 'pub', 'pubs', 'pus', 'puss', 'pung', 'puj', 'puc', 'puk', 'put', 'pup', 'puh', 'pweo', 'pweog', 'pweogg', 'pweogs', 'pweon', 'pweonj', 'pweonh', 'pweod', 'pweol', 'pweolg', 'pweolm', 'pweolb', 'pweols', 'pweolt', 'pweolp', 'pweolh', 'pweom', 'pweob', 'pweobs', 'pweos', 'pweoss', 'pweong', 'pweoj', 'pweoc', 'pweok', 'pweot', 'pweop', 'pweoh', 'pwe', 'pweg', 'pwegg', 'pwegs', 'pwen', 'pwenj', 'pwenh', 'pwed', 'pwel', 'pwelg', 'pwelm', 'pwelb', 'pwels', 'pwelt', 'pwelp', 'pwelh', 'pwem', 'pweb', 'pwebs', 'pwes', 'pwess', 'pweng', 'pwej', 'pwec', 'pwek', 'pwet', 'pwep', 'pweh', 'pwi', 'pwig', 'pwigg', 'pwigs', 'pwin', 'pwinj', 'pwinh', 'pwid', 'pwil', 'pwilg', 'pwilm', 'pwilb', 'pwils', 'pwilt', 'pwilp', 'pwilh', 'pwim', 'pwib', 'pwibs', 'pwis', 'pwiss', 'pwing', 'pwij', 'pwic', 'pwik', 'pwit', 'pwip', 'pwih', 'pyu', 'pyug', 'pyugg', 'pyugs', 'pyun', 'pyunj', 'pyunh', 'pyud', 'pyul', 'pyulg', 'pyulm', 'pyulb', 'pyuls', 'pyult', 'pyulp', 'pyulh', 'pyum', 'pyub', 'pyubs', 'pyus', 'pyuss', 'pyung', 'pyuj', 'pyuc'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php
new file mode 100644
index 000000000..871f7964c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php
@@ -0,0 +1 @@
+<?php return ['pyuk', 'pyut', 'pyup', 'pyuh', 'peu', 'peug', 'peugg', 'peugs', 'peun', 'peunj', 'peunh', 'peud', 'peul', 'peulg', 'peulm', 'peulb', 'peuls', 'peult', 'peulp', 'peulh', 'peum', 'peub', 'peubs', 'peus', 'peuss', 'peung', 'peuj', 'peuc', 'peuk', 'peut', 'peup', 'peuh', 'pyi', 'pyig', 'pyigg', 'pyigs', 'pyin', 'pyinj', 'pyinh', 'pyid', 'pyil', 'pyilg', 'pyilm', 'pyilb', 'pyils', 'pyilt', 'pyilp', 'pyilh', 'pyim', 'pyib', 'pyibs', 'pyis', 'pyiss', 'pying', 'pyij', 'pyic', 'pyik', 'pyit', 'pyip', 'pyih', 'pi', 'pig', 'pigg', 'pigs', 'pin', 'pinj', 'pinh', 'pid', 'pil', 'pilg', 'pilm', 'pilb', 'pils', 'pilt', 'pilp', 'pilh', 'pim', 'pib', 'pibs', 'pis', 'piss', 'ping', 'pij', 'pic', 'pik', 'pit', 'pip', 'pih', 'ha', 'hag', 'hagg', 'hags', 'han', 'hanj', 'hanh', 'had', 'hal', 'halg', 'halm', 'halb', 'hals', 'halt', 'halp', 'halh', 'ham', 'hab', 'habs', 'has', 'hass', 'hang', 'haj', 'hac', 'hak', 'hat', 'hap', 'hah', 'hae', 'haeg', 'haegg', 'haegs', 'haen', 'haenj', 'haenh', 'haed', 'hael', 'haelg', 'haelm', 'haelb', 'haels', 'haelt', 'haelp', 'haelh', 'haem', 'haeb', 'haebs', 'haes', 'haess', 'haeng', 'haej', 'haec', 'haek', 'haet', 'haep', 'haeh', 'hya', 'hyag', 'hyagg', 'hyags', 'hyan', 'hyanj', 'hyanh', 'hyad', 'hyal', 'hyalg', 'hyalm', 'hyalb', 'hyals', 'hyalt', 'hyalp', 'hyalh', 'hyam', 'hyab', 'hyabs', 'hyas', 'hyass', 'hyang', 'hyaj', 'hyac', 'hyak', 'hyat', 'hyap', 'hyah', 'hyae', 'hyaeg', 'hyaegg', 'hyaegs', 'hyaen', 'hyaenj', 'hyaenh', 'hyaed', 'hyael', 'hyaelg', 'hyaelm', 'hyaelb', 'hyaels', 'hyaelt', 'hyaelp', 'hyaelh', 'hyaem', 'hyaeb', 'hyaebs', 'hyaes', 'hyaess', 'hyaeng', 'hyaej', 'hyaec', 'hyaek', 'hyaet', 'hyaep', 'hyaeh', 'heo', 'heog', 'heogg', 'heogs', 'heon', 'heonj', 'heonh', 'heod', 'heol', 'heolg', 'heolm', 'heolb', 'heols', 'heolt', 'heolp', 'heolh', 'heom', 'heob', 'heobs', 'heos', 'heoss', 'heong', 'heoj', 'heoc', 'heok', 'heot', 'heop', 'heoh', 'he', 'heg', 'hegg', 'hegs', 'hen', 'henj', 'henh', 'hed', 'hel', 'helg', 'helm', 'helb', 'hels', 'helt', 'help', 'helh', 'hem', 'heb', 'hebs', 'hes', 'hess', 'heng', 'hej', 'hec', 'hek', 'het', 'hep', 'heh'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php
new file mode 100644
index 000000000..6b6b6bef9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php
@@ -0,0 +1 @@
+<?php return ['hyeo', 'hyeog', 'hyeogg', 'hyeogs', 'hyeon', 'hyeonj', 'hyeonh', 'hyeod', 'hyeol', 'hyeolg', 'hyeolm', 'hyeolb', 'hyeols', 'hyeolt', 'hyeolp', 'hyeolh', 'hyeom', 'hyeob', 'hyeobs', 'hyeos', 'hyeoss', 'hyeong', 'hyeoj', 'hyeoc', 'hyeok', 'hyeot', 'hyeop', 'hyeoh', 'hye', 'hyeg', 'hyegg', 'hyegs', 'hyen', 'hyenj', 'hyenh', 'hyed', 'hyel', 'hyelg', 'hyelm', 'hyelb', 'hyels', 'hyelt', 'hyelp', 'hyelh', 'hyem', 'hyeb', 'hyebs', 'hyes', 'hyess', 'hyeng', 'hyej', 'hyec', 'hyek', 'hyet', 'hyep', 'hyeh', 'ho', 'hog', 'hogg', 'hogs', 'hon', 'honj', 'honh', 'hod', 'hol', 'holg', 'holm', 'holb', 'hols', 'holt', 'holp', 'holh', 'hom', 'hob', 'hobs', 'hos', 'hoss', 'hong', 'hoj', 'hoc', 'hok', 'hot', 'hop', 'hoh', 'hwa', 'hwag', 'hwagg', 'hwags', 'hwan', 'hwanj', 'hwanh', 'hwad', 'hwal', 'hwalg', 'hwalm', 'hwalb', 'hwals', 'hwalt', 'hwalp', 'hwalh', 'hwam', 'hwab', 'hwabs', 'hwas', 'hwass', 'hwang', 'hwaj', 'hwac', 'hwak', 'hwat', 'hwap', 'hwah', 'hwae', 'hwaeg', 'hwaegg', 'hwaegs', 'hwaen', 'hwaenj', 'hwaenh', 'hwaed', 'hwael', 'hwaelg', 'hwaelm', 'hwaelb', 'hwaels', 'hwaelt', 'hwaelp', 'hwaelh', 'hwaem', 'hwaeb', 'hwaebs', 'hwaes', 'hwaess', 'hwaeng', 'hwaej', 'hwaec', 'hwaek', 'hwaet', 'hwaep', 'hwaeh', 'hoe', 'hoeg', 'hoegg', 'hoegs', 'hoen', 'hoenj', 'hoenh', 'hoed', 'hoel', 'hoelg', 'hoelm', 'hoelb', 'hoels', 'hoelt', 'hoelp', 'hoelh', 'hoem', 'hoeb', 'hoebs', 'hoes', 'hoess', 'hoeng', 'hoej', 'hoec', 'hoek', 'hoet', 'hoep', 'hoeh', 'hyo', 'hyog', 'hyogg', 'hyogs', 'hyon', 'hyonj', 'hyonh', 'hyod', 'hyol', 'hyolg', 'hyolm', 'hyolb', 'hyols', 'hyolt', 'hyolp', 'hyolh', 'hyom', 'hyob', 'hyobs', 'hyos', 'hyoss', 'hyong', 'hyoj', 'hyoc', 'hyok', 'hyot', 'hyop', 'hyoh', 'hu', 'hug', 'hugg', 'hugs', 'hun', 'hunj', 'hunh', 'hud', 'hul', 'hulg', 'hulm', 'hulb', 'huls', 'hult', 'hulp', 'hulh', 'hum', 'hub', 'hubs', 'hus', 'huss', 'hung', 'huj', 'huc', 'huk', 'hut', 'hup', 'huh', 'hweo', 'hweog', 'hweogg', 'hweogs', 'hweon', 'hweonj', 'hweonh', 'hweod', 'hweol', 'hweolg', 'hweolm', 'hweolb', 'hweols', 'hweolt', 'hweolp', 'hweolh', 'hweom', 'hweob', 'hweobs', 'hweos', 'hweoss', 'hweong', 'hweoj', 'hweoc', 'hweok', 'hweot', 'hweop', 'hweoh', 'hwe', 'hweg', 'hwegg', 'hwegs'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php
new file mode 100644
index 000000000..97835b005
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php
@@ -0,0 +1 @@
+<?php return ['hwen', 'hwenj', 'hwenh', 'hwed', 'hwel', 'hwelg', 'hwelm', 'hwelb', 'hwels', 'hwelt', 'hwelp', 'hwelh', 'hwem', 'hweb', 'hwebs', 'hwes', 'hwess', 'hweng', 'hwej', 'hwec', 'hwek', 'hwet', 'hwep', 'hweh', 'hwi', 'hwig', 'hwigg', 'hwigs', 'hwin', 'hwinj', 'hwinh', 'hwid', 'hwil', 'hwilg', 'hwilm', 'hwilb', 'hwils', 'hwilt', 'hwilp', 'hwilh', 'hwim', 'hwib', 'hwibs', 'hwis', 'hwiss', 'hwing', 'hwij', 'hwic', 'hwik', 'hwit', 'hwip', 'hwih', 'hyu', 'hyug', 'hyugg', 'hyugs', 'hyun', 'hyunj', 'hyunh', 'hyud', 'hyul', 'hyulg', 'hyulm', 'hyulb', 'hyuls', 'hyult', 'hyulp', 'hyulh', 'hyum', 'hyub', 'hyubs', 'hyus', 'hyuss', 'hyung', 'hyuj', 'hyuc', 'hyuk', 'hyut', 'hyup', 'hyuh', 'heu', 'heug', 'heugg', 'heugs', 'heun', 'heunj', 'heunh', 'heud', 'heul', 'heulg', 'heulm', 'heulb', 'heuls', 'heult', 'heulp', 'heulh', 'heum', 'heub', 'heubs', 'heus', 'heuss', 'heung', 'heuj', 'heuc', 'heuk', 'heut', 'heup', 'heuh', 'hyi', 'hyig', 'hyigg', 'hyigs', 'hyin', 'hyinj', 'hyinh', 'hyid', 'hyil', 'hyilg', 'hyilm', 'hyilb', 'hyils', 'hyilt', 'hyilp', 'hyilh', 'hyim', 'hyib', 'hyibs', 'hyis', 'hyiss', 'hying', 'hyij', 'hyic', 'hyik', 'hyit', 'hyip', 'hyih', 'hi', 'hig', 'higg', 'higs', 'hin', 'hinj', 'hinh', 'hid', 'hil', 'hilg', 'hilm', 'hilb', 'hils', 'hilt', 'hilp', 'hilh', 'him', 'hib', 'hibs', 'his', 'hiss', 'hing', 'hij', 'hic', 'hik', 'hit', 'hip', 'hih', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php
new file mode 100644
index 000000000..d0b4241cd
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php
@@ -0,0 +1 @@
+<?php return ['Kay ', 'Kayng ', 'Ke ', 'Ko ', 'Kol ', 'Koc ', 'Kwi ', 'Kwi ', 'Kyun ', 'Kul ', 'Kum ', 'Na ', 'Na ', 'Na ', 'La ', 'Na ', 'Na ', 'Na ', 'Na ', 'Na ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nam ', 'Nam ', 'Nam ', 'Nam ', 'Nap ', 'Nap ', 'Nap ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nay ', 'Nayng ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Non ', 'Nong ', 'Nong ', 'Nong ', 'Nong ', 'Noy ', 'Noy ', 'Noy ', 'Noy ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nuk ', 'Nuk ', 'Num ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Twu ', 'La ', 'Lak ', 'Lak ', 'Lan ', 'Lyeng ', 'Lo ', 'Lyul ', 'Li ', 'Pey ', 'Pen ', 'Pyen ', 'Pwu ', 'Pwul ', 'Pi ', 'Sak ', 'Sak ', 'Sam ', 'Sayk ', 'Sayng ', 'Sep ', 'Sey ', 'Sway ', 'Sin ', 'Sim ', 'Sip ', 'Ya ', 'Yak ', 'Yak ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Yek ', 'Yek ', 'Yek ', 'Yek ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yep ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yey ', 'Yey ', 'Yey ', 'Yey ', 'O ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yong ', 'Wun ', 'Wen ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yuk ', 'Yuk ', 'Yuk ', 'Yun ', 'Yun ', 'Yun ', 'Yun ', 'Yul ', 'Yul ', 'Yul ', 'Yul ', 'Yung ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'Ik ', 'Ik ', 'In ', 'In ', 'In ', 'In ', 'In ', 'In ', 'In ', 'Im ', 'Im ', 'Im ', 'Ip ', 'Ip ', 'Ip ', 'Cang ', 'Cek ', 'Ci ', 'Cip ', 'Cha ', 'Chek '];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php
new file mode 100644
index 000000000..c5afa60ba
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php
@@ -0,0 +1 @@
+<?php return ['Chey ', 'Thak ', 'Thak ', 'Thang ', 'Thayk ', 'Thong ', 'Pho ', 'Phok ', 'Hang ', 'Hang ', 'Hyen ', 'Hwak ', 'Wu ', 'Huo ', '[?] ', '[?] ', 'Zhong ', '[?] ', 'Qing ', '[?] ', '[?] ', 'Xi ', 'Zhu ', 'Yi ', 'Li ', 'Shen ', 'Xiang ', 'Fu ', 'Jing ', 'Jing ', 'Yu ', '[?] ', 'Hagi ', '[?] ', 'Zhu ', '[?] ', '[?] ', 'Yi ', 'Du ', '[?] ', '[?] ', '[?] ', 'Fan ', 'Si ', 'Guan ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php
new file mode 100644
index 000000000..af2ac33b9
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php
@@ -0,0 +1 @@
+<?php return ['ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'mn', 'me', 'mi', 'vn', 'mkh', '[?]', '[?]', '[?]', '[?]', '[?]', 'yi', '', 'ay', '`', '', 'd', 'h', 'k', 'l', 'm', 'm', 't', '+', 'sh', 's', 'sh', 's', 'a', 'a', '', 'b', 'g', 'd', 'h', 'v', 'z', '[?]', 't', 'y', 'k', 'k', 'l', '[?]', 'l', '[?]', 'n', 'n', '[?]', 'p', 'p', '[?]', 'ts', 'ts', 'r', 'sh', 't', 'vo', 'b', 'k', 'p', 'l', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php
new file mode 100644
index 000000000..7023059af
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php
new file mode 100644
index 000000000..09930de56
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{Salla}', '{Qala}', 'Allah', 'Akbar', 'Mohammed', 'SL`M', 'Rasul', '{Alayhi}', '{WaSallam}', '{Salla}', '{Salla Llahu Alayhi WaSallam}', '{Jalla Jalalahu}', 'Rial ', '{Bismillah Ar-Rahman Ar-Rahimi}', '[?]', '[?]'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php
new file mode 100644
index 000000000..33cfd8826
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php
@@ -0,0 +1 @@
+<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '~', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '..', '--', '-', '_', '_', '(', ') ', '{', '} ', '[', '] ', '[(', ')] ', '<<', '>> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php
new file mode 100644
index 000000000..b3a15398c
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php
@@ -0,0 +1 @@
+<?php return ['[?]', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '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', '[', '\\', ']', '^', '_', '`', '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', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php
new file mode 100644
index 000000000..ad8d3b257
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php
@@ -0,0 +1 @@
+<?php return ['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', 26 => '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', 52 => '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', 78 => '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', 104 => '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', 130 => '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', 156 => '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', 181 => 'Z', 182 => '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', 208 => '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', 234 => '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'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php
new file mode 100644
index 000000000..a2a9b908d
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php
@@ -0,0 +1,4 @@
+<?php
+
+return [
+ 0 => 'w', 'x', 'y', 'z', 4 => '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', 30 => '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', 56 => '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', 82 => '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', 108 => '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', 134 => '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', 160 => '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', 186 => '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', 212 => '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', 238 => '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', ];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php
new file mode 100644
index 000000000..315ef5e40
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php
@@ -0,0 +1 @@
+<?php return ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z', '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', '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', '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', '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', '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', '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', 'i', 'j', '', '', 'Alpha', 'Beta', 'Gamma', 'Delta', 'Epsilon', 'Zeta', 'Eta', 'Theta', 'Iota', 'Kappa', 'Lamda', 'Mu', 'Nu', 'Xi', 'Omicron', 'Pi', 'Rho', 'Theta', 'Sigma', 'Tau', 'Upsilon', 'Phi', 'Chi', 'Psi', 'Omega', 'nabla', 'alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta', 'theta', 'iota', 'kappa', 'lamda', 'mu', 'nu', 'xi', 'omicron', 'pi', 'rho', 'sigma', 'sigma', 'tai', 'upsilon', 'phi', 'chi', 'psi', 'omega', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php
new file mode 100644
index 000000000..d2b885c36
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php
@@ -0,0 +1 @@
+<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php
new file mode 100644
index 000000000..c0f4cfa46
--- /dev/null
+++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php
@@ -0,0 +1,2 @@
+<?php return ['0.', '0,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '8,', '9,', '', '', '', '', '', '(A)', '(B)', '(C)', '(D)', '(E)', '(F)', '(G)', '(H)', '(I)', '(J)', '(K)', // 0x1a
+ '(L)', '(M)', '(N)', '(O)', '(P)', '(Q)', '(R)', '(S)', '(T)', '(U)', '(V)', '(W)', '(X)', '(Y)', '(Z)', 48 => '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', 80 => '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', 112 => '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', 230 => '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', ];
diff --git a/vendor/voku/stop-words/CHANGELOG.md b/vendor/voku/stop-words/CHANGELOG.md
new file mode 100644
index 000000000..12d4a270b
--- /dev/null
+++ b/vendor/voku/stop-words/CHANGELOG.md
@@ -0,0 +1,25 @@
+# Change log
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+## [Unreleased]
+
+## [2.0.1] - 2018-11-23
+### Fix
+- switch czech and catalan stopwords | thx@retep007
+
+## [2.0.0] - 2017-11-26
+### Changed
+- "php": ">=7.0"
+
+## [1.2.0] - 2017-05-22
+### Changed
+- add more languages
+
+## [1.1.0] - 2017-05-12
+### Changed
+- add more languages
+
+## [1.0.0] - 2017-05-05
+### Changed
+- init
diff --git a/vendor/voku/stop-words/LICENSE b/vendor/voku/stop-words/LICENSE
new file mode 100644
index 000000000..8fba26e3e
--- /dev/null
+++ b/vendor/voku/stop-words/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Lars Moelleken
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/vendor/voku/stop-words/README.md b/vendor/voku/stop-words/README.md
new file mode 100644
index 000000000..66a3bd377
--- /dev/null
+++ b/vendor/voku/stop-words/README.md
@@ -0,0 +1,73 @@
+[![Build Status](https://travis-ci.org/voku/stop-words.svg?branch=master)](https://travis-ci.org/voku/stop-words)
+[![Coverage Status](https://coveralls.io/repos/github/voku/stop-words/badge.svg?branch=master)](https://coveralls.io/github/voku/stop-words?branch=master)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/voku/stop-words/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/voku/stop-words/?branch=master)
+[![Codacy Badge](https://api.codacy.com/project/badge/Grade/dabeb6d93ead41309e4bbf80c0ec984e)](https://www.codacy.com/app/voku/stop-words?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=voku/stop-words&amp;utm_campaign=Badge_Grade)
+[![SensioLabsInsight](https://insight.sensiolabs.com/projects/316837f1-afb0-4ea5-938e-340527eeb4e6/mini.png)](https://insight.sensiolabs.com/projects/316837f1-afb0-4ea5-938e-340527eeb4e6)
+[![Latest Stable Version](https://poser.pugx.org/voku/stop-words/v/stable)](https://packagist.org/packages/voku/stop-words)
+[![Total Downloads](https://poser.pugx.org/voku/stop-words/downloads)](https://packagist.org/packages/voku/stop-words)
+[![Latest Unstable Version](https://poser.pugx.org/voku/stop-words/v/unstable)](https://packagist.org/packages/voku/stop-words)
+[![License](https://poser.pugx.org/voku/stop-words/license)](https://packagist.org/packages/voku/stop-words)
+
+# Stop-Words
+
+## Description
+
+A collection of stop words stop words in various languages for e.g. search-functions.
+
+* [Installation](#installation)
+* [Usage](#usage)
+* [History](#history)
+
+## Installation
+
+1. Install and use [composer](https://getcomposer.org/doc/00-intro.md) in your project.
+2. Require this package via composer:
+
+```sh
+composer require voku/stop-words
+```
+
+## Usage
+
+```php
+$stopWords = new StopWords();
+$stopWords->getStopWordsFromLanguage('de');
+```
+
+Available languages
+-------------------
+* Arabic (ar)
+* Bulgarian (bg)
+* Catalan (ca)
+* Croatian (hr)
+* Czech (cz)
+* Danish (da)
+* Dutch (nl)
+* English (en)
+* Esperanto (eo)
+* Estonian (et)
+* Finnish (fi)
+* French (fr)
+* Georgian (ka)
+* German (de)
+* Greek (el)
+* Hindi (hi)
+* Hungarian (hu)
+* Indonesian (id)
+* Italian (it)
+* Latvian (lv)
+* Lithuanian (lt)
+* Norwegian (no)
+* Polish (pl)
+* Portuguese (pt)
+* Romanian (ro)
+* Russian (ru)
+* Slovak (sk)
+* Spanish (es)
+* Swedish (sv)
+* Turkish (tr)
+* Ukrainian (uk)
+* Vietnamese (vi)
+
+## History
+See [CHANGELOG](CHANGELOG.md) for the full history of changes.
diff --git a/vendor/voku/stop-words/composer.json b/vendor/voku/stop-words/composer.json
new file mode 100644
index 000000000..e62caa578
--- /dev/null
+++ b/vendor/voku/stop-words/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "voku/stop-words",
+ "description": "Stop-Words via PHP",
+ "keywords": [
+ "stop-words",
+ "stop words"
+ ],
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0"
+ }
+}
diff --git a/vendor/voku/stop-words/src/voku/helper/StopWords.php b/vendor/voku/stop-words/src/voku/helper/StopWords.php
new file mode 100644
index 000000000..8450d9c42
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/StopWords.php
@@ -0,0 +1,143 @@
+<?php
+
+declare(strict_types=1);
+
+namespace voku\helper;
+
+/**
+ * Phonetic-Helper-Class
+ *
+ * @package voku\helper
+ */
+final class StopWords
+{
+ /**
+ * @var array
+ */
+ private static $availableLanguages = array(
+ 'ar',
+ 'bg',
+ 'ca',
+ 'cz',
+ 'da',
+ 'de',
+ 'el',
+ 'en',
+ 'eo',
+ 'es',
+ 'et',
+ 'fi',
+ 'fr',
+ 'hi',
+ 'hr',
+ 'hu',
+ 'id',
+ 'it',
+ 'ka',
+ 'lt',
+ 'lv',
+ 'nl',
+ 'no',
+ 'pl',
+ 'pt',
+ 'ro',
+ 'ru',
+ 'sk',
+ 'sv',
+ 'tr',
+ 'uk',
+ 'vi'
+ );
+
+ /**
+ * @var array
+ */
+ private $stopWords = array();
+
+ /**
+ * Load language-data from one language.
+ *
+ * @param string $language
+ *
+ * @throws StopWordsLanguageNotExists
+ */
+ private function loadLanguageData(string $language = 'de')
+ {
+ if (\in_array($language, self::$availableLanguages, true) === false) {
+ throw new StopWordsLanguageNotExists('language not supported: ' . $language);
+ }
+
+ $this->stopWords[$language] = $this->getData($language);
+ }
+
+ /**
+ * Get data from "/data/*.php".
+ *
+ * @param string $file
+ *
+ * @return array <p>Will return an empty array on error.</p>
+ */
+ private function getData(string $file): array
+ {
+ static $RESULT_STOP_WORDS_CACHE = array();
+
+ if (isset($RESULT_STOP_WORDS_CACHE[$file])) {
+ return $RESULT_STOP_WORDS_CACHE[$file];
+ }
+
+ $file = __DIR__ . '/stopwords/' . $file . '.php';
+ if (file_exists($file)) {
+ /** @noinspection PhpIncludeInspection */
+ $RESULT_STOP_WORDS_CACHE[$file] = require $file;
+ } else {
+ $RESULT_STOP_WORDS_CACHE[$file] = array();
+ }
+
+ return $RESULT_STOP_WORDS_CACHE[$file];
+ }
+
+ /**
+ * Get the stop-words from one language.
+ *
+ * @param string $language
+ *
+ * @return array
+ *
+ * @throws StopWordsLanguageNotExists
+ */
+ public function getStopWordsFromLanguage(string $language = 'de'): array
+ {
+ if (\in_array($language, self::$availableLanguages, true) === false) {
+ throw new StopWordsLanguageNotExists('language not supported: ' . $language);
+ }
+
+ if (!isset($this->stopWords[$language])) {
+ $this->loadLanguageData($language);
+ }
+
+ return $this->stopWords[$language];
+ }
+
+ private function loadLanguageDataAll()
+ {
+ foreach (self::$availableLanguages as $language) {
+ if (!isset($this->stopWords[$language])) {
+ $this->loadLanguageData($language);
+ }
+ }
+ }
+
+ /**
+ * Get all stop-words from all languages.
+ *
+ * @return array
+ *
+ * @throws StopWordsLanguageNotExists
+ */
+ public function getStopWordsAll(): array
+ {
+ $this->loadLanguageDataAll();
+
+ return $this->stopWords;
+ }
+}
diff --git a/vendor/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php b/vendor/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php
new file mode 100644
index 000000000..7c9a6dc5e
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/StopWordsLanguageNotExists.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace voku\helper;
+
+/**
+ * PhoneticExceptionLanguageNotExists-Helper-Class
+ *
+ * @package voku\helper
+ */
+class StopWordsLanguageNotExists extends \Exception
+{
+}
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/ar.php b/vendor/voku/stop-words/src/voku/helper/stopwords/ar.php
new file mode 100644
index 000000000..fd8cd7ff5
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/ar.php
@@ -0,0 +1,172 @@
+<?php
+
+// arabic
+
+static $data = [
+ 'فى',
+ 'في',
+ 'كل',
+ 'لم',
+ 'لن',
+ 'له',
+ 'من',
+ 'هو',
+ 'هي',
+ 'قوة',
+ 'كما',
+ 'لها',
+ 'منذ',
+ 'وقد',
+ 'ولا',
+ 'نفسه',
+ 'لقاء',
+ 'مقابل',
+ 'هناك',
+ 'وقال',
+ 'وكان',
+ 'نهاية',
+ 'وقالت',
+ 'وكانت',
+ 'للامم',
+ 'فيه',
+ 'كلم',
+ 'لكن',
+ 'وفي',
+ 'وقف',
+ 'ولم',
+ 'ومن',
+ 'وهو',
+ 'وهي',
+ 'يوم',
+ 'فيها',
+ 'منها',
+ 'مليار',
+ 'لوكالة',
+ 'يكون',
+ 'يمكن',
+ 'مليون',
+ 'حيث',
+ 'اكد',
+ 'الا',
+ 'اما',
+ 'امس',
+ 'السابق',
+ 'التى',
+ 'التي',
+ 'اكثر',
+ 'ايار',
+ 'ايضا',
+ 'ثلاثة',
+ 'الذاتي',
+ 'الاخيرة',
+ 'الثاني',
+ 'الثانية',
+ 'الذى',
+ 'الذي',
+ 'الان',
+ 'امام',
+ 'ايام',
+ 'خلال',
+ 'حوالى',
+ 'الذين',
+ 'الاول',
+ 'الاولى',
+ 'بين',
+ 'ذلك',
+ 'دون',
+ 'حول',
+ 'حين',
+ 'الف',
+ 'الى',
+ 'انه',
+ 'اول',
+ 'ضمن',
+ 'انها',
+ 'جميع',
+ 'الماضي',
+ 'الوقت',
+ 'المقبل',
+ 'اليوم',
+ 'ـ',
+ 'ف',
+ 'و',
+ 'و6',
+ 'قد',
+ 'لا',
+ 'ما',
+ 'مع',
+ 'مساء',
+ 'هذا',
+ 'واحد',
+ 'واضاف',
+ 'واضافت',
+ 'فان',
+ 'قبل',
+ 'قال',
+ 'كان',
+ 'لدى',
+ 'نحو',
+ 'هذه',
+ 'وان',
+ 'واكد',
+ 'كانت',
+ 'واوضح',
+ 'مايو',
+ 'ب',
+ 'ا',
+ 'أ',
+ '،',
+ 'عشر',
+ 'عدد',
+ 'عدة',
+ 'عشرة',
+ 'عدم',
+ 'عام',
+ 'عاما',
+ 'عن',
+ 'عند',
+ 'عندما',
+ 'على',
+ 'عليه',
+ 'عليها',
+ 'زيارة',
+ 'سنة',
+ 'سنوات',
+ 'تم',
+ 'ضد',
+ 'بعد',
+ 'بعض',
+ 'اعادة',
+ 'اعلنت',
+ 'بسبب',
+ 'حتى',
+ 'اذا',
+ 'احد',
+ 'اثر',
+ 'برس',
+ 'باسم',
+ 'غدا',
+ 'شخصا',
+ 'صباح',
+ 'اطار',
+ 'اربعة',
+ 'اخرى',
+ 'بان',
+ 'اجل',
+ 'غير',
+ 'بشكل',
+ 'حاليا',
+ 'بن',
+ 'به',
+ 'ثم',
+ 'اف',
+ 'ان',
+ 'او',
+ 'اي',
+ 'بها',
+ 'صفر',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/bg.php b/vendor/voku/stop-words/src/voku/helper/stopwords/bg.php
new file mode 100644
index 000000000..9bdb95353
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/bg.php
@@ -0,0 +1,269 @@
+<?php
+
+// bulgarian
+
+static $data = [
+ 'а',
+ 'автентичен',
+ 'аз',
+ 'ако',
+ 'ала',
+ 'бе',
+ 'без',
+ 'беше',
+ 'би',
+ 'бивш',
+ 'бивша',
+ 'бившо',
+ 'бил',
+ 'била',
+ 'били',
+ 'било',
+ 'благодаря',
+ 'близо',
+ 'бъдат',
+ 'бъде',
+ 'бяха',
+ 'в',
+ 'вас',
+ 'ваш',
+ 'ваша',
+ 'вероятно',
+ 'вече',
+ 'взема',
+ 'ви',
+ 'вие',
+ 'винаги',
+ 'внимава',
+ 'време',
+ 'все',
+ 'всеки',
+ 'всички',
+ 'всичко',
+ 'всяка',
+ 'във',
+ 'въпреки',
+ 'върху',
+ 'г',
+ 'ги',
+ 'главен',
+ 'главна',
+ 'главно',
+ 'глас',
+ 'го',
+ 'година',
+ 'години',
+ 'годишен',
+ 'д',
+ 'да',
+ 'дали',
+ 'два',
+ 'двама',
+ 'двамата',
+ 'две',
+ 'двете',
+ 'ден',
+ 'днес',
+ 'дни',
+ 'до',
+ 'добра',
+ 'добре',
+ 'добро',
+ 'добър',
+ 'докато',
+ 'докога',
+ 'дори',
+ 'досега',
+ 'доста',
+ 'друг',
+ 'друга',
+ 'други',
+ 'е',
+ 'евтин',
+ 'едва',
+ 'един',
+ 'една',
+ 'еднаква',
+ 'еднакви',
+ 'еднакъв',
+ 'едно',
+ 'екип',
+ 'ето',
+ 'живот',
+ 'за',
+ 'забавям',
+ 'зад',
+ 'заедно',
+ 'заради',
+ 'засега',
+ 'заспал',
+ 'затова',
+ 'защо',
+ 'защото',
+ 'и',
+ 'из',
+ 'или',
+ 'им',
+ 'има',
+ 'имат',
+ 'иска',
+ 'й',
+ 'каза',
+ 'как',
+ 'каква',
+ 'какво',
+ 'както',
+ 'какъв',
+ 'като',
+ 'кога',
+ 'когато',
+ 'което',
+ 'които',
+ 'кой',
+ 'който',
+ 'колко',
+ 'която',
+ 'къде',
+ 'където',
+ 'към',
+ 'лесен',
+ 'лесно',
+ 'ли',
+ 'лош',
+ 'м',
+ 'май',
+ 'малко',
+ 'ме',
+ 'между',
+ 'мек',
+ 'мен',
+ 'месец',
+ 'ми',
+ 'много',
+ 'мнозина',
+ 'мога',
+ 'могат',
+ 'може',
+ 'мокър',
+ 'моля',
+ 'момента',
+ 'му',
+ 'н',
+ 'на',
+ 'над',
+ 'назад',
+ 'най',
+ 'направи',
+ 'напред',
+ 'например',
+ 'нас',
+ 'не',
+ 'него',
+ 'нещо',
+ 'нея',
+ 'ни',
+ 'ние',
+ 'никой',
+ 'нито',
+ 'нищо',
+ 'но',
+ 'нов',
+ 'нова',
+ 'нови',
+ 'новина',
+ 'някои',
+ 'някой',
+ 'няколко',
+ 'няма',
+ 'обаче',
+ 'около',
+ 'освен',
+ 'особено',
+ 'от',
+ 'отгоре',
+ 'отново',
+ 'още',
+ 'пак',
+ 'по',
+ 'повече',
+ 'повечето',
+ 'под',
+ 'поне',
+ 'поради',
+ 'после',
+ 'почти',
+ 'прави',
+ 'пред',
+ 'преди',
+ 'през',
+ 'при',
+ 'пък',
+ 'първата',
+ 'първи',
+ 'първо',
+ 'пъти',
+ 'равен',
+ 'равна',
+ 'с',
+ 'са',
+ 'сам',
+ 'само',
+ 'се',
+ 'сега',
+ 'си',
+ 'син',
+ 'скоро',
+ 'след',
+ 'следващ',
+ 'сме',
+ 'смях',
+ 'според',
+ 'сред',
+ 'срещу',
+ 'сте',
+ 'съм',
+ 'със',
+ 'също',
+ 'т',
+ 'тази',
+ 'така',
+ 'такива',
+ 'такъв',
+ 'там',
+ 'твой',
+ 'те',
+ 'тези',
+ 'ти',
+ 'т.н.',
+ 'то',
+ 'това',
+ 'тогава',
+ 'този',
+ 'той',
+ 'толкова',
+ 'точно',
+ 'три',
+ 'трябва',
+ 'тук',
+ 'тъй',
+ 'тя',
+ 'тях',
+ 'у',
+ 'утре',
+ 'харесва',
+ 'хиляди',
+ 'ч',
+ 'часа',
+ 'че',
+ 'често',
+ 'чрез',
+ 'ще',
+ 'щом',
+ 'юмрук',
+ 'я',
+ 'як',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/ca.php b/vendor/voku/stop-words/src/voku/helper/stopwords/ca.php
new file mode 100644
index 000000000..8c461ec49
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/ca.php
@@ -0,0 +1,104 @@
+<?php
+
+// catalan
+
+static $data = [
+ 'og',
+ 'i',
+ 'jeg',
+ 'det',
+ 'at',
+ 'en',
+ 'den',
+ 'til',
+ 'er',
+ 'som',
+ 'på',
+ 'de',
+ 'med',
+ 'han',
+ 'af',
+ 'for',
+ 'ikke',
+ 'der',
+ 'var',
+ 'mig',
+ 'sig',
+ 'men',
+ 'et',
+ 'har',
+ 'om',
+ 'vi',
+ 'min',
+ 'havde',
+ 'ham',
+ 'hun',
+ 'nu',
+ 'over',
+ 'da',
+ 'fra',
+ 'du',
+ 'ud',
+ 'sin',
+ 'dem',
+ 'os',
+ 'op',
+ 'man',
+ 'hans',
+ 'hvor',
+ 'eller',
+ 'hvad',
+ 'skal',
+ 'selv',
+ 'her',
+ 'alle',
+ 'vil',
+ 'blev',
+ 'kunne',
+ 'ind',
+ 'når',
+ 'være',
+ 'dog',
+ 'noget',
+ 'ville',
+ 'jo',
+ 'deres',
+ 'efter',
+ 'ned',
+ 'skulle',
+ 'denne',
+ 'end',
+ 'dette',
+ 'mit',
+ 'også',
+ 'under',
+ 'have',
+ 'dig',
+ 'anden',
+ 'hende',
+ 'mine',
+ 'alt',
+ 'meget',
+ 'sit',
+ 'sine',
+ 'vor',
+ 'mod',
+ 'disse',
+ 'hvis',
+ 'din',
+ 'nogle',
+ 'hos',
+ 'blive',
+ 'mange',
+ 'ad',
+ 'bliver',
+ 'hendes',
+ 'været',
+ 'thi',
+ 'jer',
+ 'sådan',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/cz.php b/vendor/voku/stop-words/src/voku/helper/stopwords/cz.php
new file mode 100644
index 000000000..932de81b6
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/cz.php
@@ -0,0 +1,266 @@
+<?php
+
+// czech
+
+static $data = [
+ 'ačkoli',
+ 'ahoj',
+ 'ale',
+ 'anebo',
+ 'ano',
+ 'asi',
+ 'aspoň',
+ 'během',
+ 'bez',
+ 'beze',
+ 'blízko',
+ 'bohužel',
+ 'brzo',
+ 'bude',
+ 'budeme',
+ 'budeš',
+ 'budete',
+ 'budou',
+ 'budu',
+ 'byl',
+ 'byla',
+ 'byli',
+ 'bylo',
+ 'byly',
+ 'bys',
+ 'čau',
+ 'chce',
+ 'chceme',
+ 'chceš',
+ 'chcete',
+ 'chci',
+ 'chtějí',
+ 'chtít',
+ 'chut\'',
+ 'chuti',
+ 'co',
+ 'čtrnáct',
+ 'čtyři',
+ 'dál',
+ 'dále',
+ 'daleko',
+ 'děkovat',
+ 'děkujeme',
+ 'děkuji',
+ 'den',
+ 'deset',
+ 'devatenáct',
+ 'devět',
+ 'do',
+ 'dobrý',
+ 'docela',
+ 'dva',
+ 'dvacet',
+ 'dvanáct',
+ 'dvě',
+ 'hodně',
+ 'já',
+ 'jak',
+ 'jde',
+ 'je',
+ 'jeden',
+ 'jedenáct',
+ 'jedna',
+ 'jedno',
+ 'jednou',
+ 'jedou',
+ 'jeho',
+ 'její',
+ 'jejich',
+ 'jemu',
+ 'jen',
+ 'jenom',
+ 'ještě',
+ 'jestli',
+ 'jestliže',
+ 'jí',
+ 'jich',
+ 'jím',
+ 'jimi',
+ 'jinak',
+ 'jsem',
+ 'jsi',
+ 'jsme',
+ 'jsou',
+ 'jste',
+ 'kam',
+ 'kde',
+ 'kdo',
+ 'kdy',
+ 'když',
+ 'ke',
+ 'kolik',
+ 'kromě',
+ 'která',
+ 'které',
+ 'kteří',
+ 'který',
+ 'kvůli',
+ 'má',
+ 'mají',
+ 'málo',
+ 'mám',
+ 'máme',
+ 'máš',
+ 'máte',
+ 'mé',
+ 'mě',
+ 'mezi',
+ 'mí',
+ 'mít',
+ 'mně',
+ 'mnou',
+ 'moc',
+ 'mohl',
+ 'mohou',
+ 'moje',
+ 'moji',
+ 'možná',
+ 'můj',
+ 'musí',
+ 'může',
+ 'my',
+ 'na',
+ 'nad',
+ 'nade',
+ 'nám',
+ 'námi',
+ 'naproti',
+ 'nás',
+ 'náš',
+ 'naše',
+ 'naši',
+ 'ne',
+ 'ně',
+ 'nebo',
+ 'nebyl',
+ 'nebyla',
+ 'nebyli',
+ 'nebyly',
+ 'něco',
+ 'nedělá',
+ 'nedělají',
+ 'nedělám',
+ 'neděláme',
+ 'neděláš',
+ 'neděláte',
+ 'nějak',
+ 'nejsi',
+ 'někde',
+ 'někdo',
+ 'nemají',
+ 'nemáme',
+ 'nemáte',
+ 'neměl',
+ 'němu',
+ 'není',
+ 'nestačí',
+ 'nevadí',
+ 'než',
+ 'nic',
+ 'nich',
+ 'ním',
+ 'nimi',
+ 'nula',
+ 'od',
+ 'ode',
+ 'on',
+ 'ona',
+ 'oni',
+ 'ono',
+ 'ony',
+ 'osm',
+ 'osmnáct',
+ 'pak',
+ 'patnáct',
+ 'pět',
+ 'po',
+ 'pořád',
+ 'potom',
+ 'pozdě',
+ 'před',
+ 'přes',
+ 'přese',
+ 'pro',
+ 'proč',
+ 'prosím',
+ 'prostě',
+ 'proti',
+ 'protože',
+ 'rovně',
+ 'se',
+ 'sedm',
+ 'sedmnáct',
+ 'šest',
+ 'šestnáct',
+ 'skoro',
+ 'smějí',
+ 'smí',
+ 'snad',
+ 'spolu',
+ 'sta',
+ 'sté',
+ 'sto',
+ 'ta',
+ 'tady',
+ 'tak',
+ 'takhle',
+ 'taky',
+ 'tam',
+ 'tamhle',
+ 'tamhleto',
+ 'tamto',
+ 'tě',
+ 'tebe',
+ 'tebou',
+ 'ted\'',
+ 'tedy',
+ 'ten',
+ 'ti',
+ 'tisíc',
+ 'tisíce',
+ 'to',
+ 'tobě',
+ 'tohle',
+ 'toto',
+ 'třeba',
+ 'tři',
+ 'třináct',
+ 'trošku',
+ 'tvá',
+ 'tvé',
+ 'tvoje',
+ 'tvůj',
+ 'ty',
+ 'určitě',
+ 'už',
+ 'vám',
+ 'vámi',
+ 'vás',
+ 'váš',
+ 'vaše',
+ 'vaši',
+ 've',
+ 'večer',
+ 'vedle',
+ 'vlastně',
+ 'všechno',
+ 'všichni',
+ 'vůbec',
+ 'vy',
+ 'vždy',
+ 'za',
+ 'zač',
+ 'zatímco',
+ 'ze',
+ 'že',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/da.php b/vendor/voku/stop-words/src/voku/helper/stopwords/da.php
new file mode 100644
index 000000000..14614b63a
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/da.php
@@ -0,0 +1,180 @@
+<?php
+
+// danish
+
+static $data = [
+ 'ad',
+ 'af',
+ 'aldrig',
+ 'alle',
+ 'alt',
+ 'anden',
+ 'andet',
+ 'andre',
+ 'at',
+ 'bare',
+ 'begge',
+ 'blev',
+ 'blive',
+ 'bliver',
+ 'da',
+ 'de',
+ 'dem',
+ 'den',
+ 'denne',
+ 'der',
+ 'deres',
+ 'det',
+ 'dette',
+ 'dig',
+ 'din',
+ 'dine',
+ 'disse',
+ 'dit',
+ 'dog',
+ 'du',
+ 'efter',
+ 'ej',
+ 'eller',
+ 'en',
+ 'end',
+ 'ene',
+ 'eneste',
+ 'enhver',
+ 'er',
+ 'et',
+ 'far',
+ 'fem',
+ 'fik',
+ 'fire',
+ 'flere',
+ 'fleste',
+ 'for',
+ 'fordi',
+ 'forrige',
+ 'fra',
+ 'få',
+ 'får',
+ 'før',
+ 'god',
+ 'godt',
+ 'ham',
+ 'han',
+ 'hans',
+ 'har',
+ 'havde',
+ 'have',
+ 'hej',
+ 'helt',
+ 'hende',
+ 'hendes',
+ 'her',
+ 'hos',
+ 'hun',
+ 'hvad',
+ 'hvem',
+ 'hver',
+ 'hvilken',
+ 'hvis',
+ 'hvor',
+ 'hvordan',
+ 'hvorfor',
+ 'hvornår',
+ 'i',
+ 'ikke',
+ 'ind',
+ 'ingen',
+ 'intet',
+ 'ja',
+ 'jeg',
+ 'jer',
+ 'jeres',
+ 'jo',
+ 'kan',
+ 'kom',
+ 'komme',
+ 'kommer',
+ 'kun',
+ 'kunne',
+ 'lad',
+ 'lav',
+ 'lidt',
+ 'lige',
+ 'lille',
+ 'man',
+ 'mand',
+ 'mange',
+ 'med',
+ 'meget',
+ 'men',
+ 'mens',
+ 'mere',
+ 'mig',
+ 'min',
+ 'mine',
+ 'mit',
+ 'mod',
+ 'må',
+ 'ned',
+ 'nej',
+ 'ni',
+ 'nogen',
+ 'noget',
+ 'nogle',
+ 'nu',
+ 'ny',
+ 'nyt',
+ 'når',
+ 'nær',
+ 'næste',
+ 'næsten',
+ 'og',
+ 'også',
+ 'okay',
+ 'om',
+ 'op',
+ 'os',
+ 'otte',
+ 'over',
+ 'på',
+ 'se',
+ 'seks',
+ 'selv',
+ 'ser',
+ 'ses',
+ 'sig',
+ 'sige',
+ 'sin',
+ 'sine',
+ 'sit',
+ 'skal',
+ 'skulle',
+ 'som',
+ 'stor',
+ 'store',
+ 'syv',
+ 'så',
+ 'sådan',
+ 'tag',
+ 'tage',
+ 'thi',
+ 'ti',
+ 'til',
+ 'to',
+ 'tre',
+ 'ud',
+ 'under',
+ 'var',
+ 'ved',
+ 'vi',
+ 'vil',
+ 'ville',
+ 'vor',
+ 'vores',
+ 'være',
+ 'været',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/de.php b/vendor/voku/stop-words/src/voku/helper/stopwords/de.php
new file mode 100644
index 000000000..06ffb94ad
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/de.php
@@ -0,0 +1,1033 @@
+<?php
+
+// german
+
+static $data = [
+ 'ab',
+ 'bei',
+ 'da',
+ 'deshalb',
+ 'ein',
+ 'für',
+ 'haben',
+ 'hier',
+ 'ich',
+ 'ja',
+ 'kann',
+ 'machen',
+ 'muesste',
+ 'nach',
+ 'oder',
+ 'seid',
+ 'sonst',
+ 'und',
+ 'vom',
+ 'wann',
+ 'wenn',
+ 'wie',
+ 'zu',
+ 'bin',
+ 'eines',
+ 'hat',
+ 'manche',
+ 'solches',
+ 'an',
+ 'anderm',
+ 'bis',
+ 'das',
+ 'deinem',
+ 'demselben',
+ 'dir',
+ 'doch',
+ 'einig',
+ 'er',
+ 'eurer',
+ 'hatte',
+ 'ihnen',
+ 'ihre',
+ 'ins',
+ 'jenen',
+ 'keinen',
+ 'manchem',
+ 'meinen',
+ 'nichts',
+ 'seine',
+ 'soll',
+ 'unserm',
+ 'welche',
+ 'werden',
+ 'wollte',
+ 'während',
+ 'alle',
+ 'allem',
+ 'allen',
+ 'aller',
+ 'alles',
+ 'als',
+ 'also',
+ 'am',
+ 'ander',
+ 'andere',
+ 'anderem',
+ 'anderen',
+ 'anderer',
+ 'anderes',
+ 'andern',
+ 'anderr',
+ 'anders',
+ 'auch',
+ 'auf',
+ 'aus',
+ 'bist',
+ 'bsp.',
+ 'daher',
+ 'damit',
+ 'dann',
+ 'dasselbe',
+ 'dazu',
+ 'daß',
+ 'dein',
+ 'deine',
+ 'deinen',
+ 'deiner',
+ 'deines',
+ 'dem',
+ 'den',
+ 'denn',
+ 'denselben',
+ 'der',
+ 'derer',
+ 'derselbe',
+ 'derselben',
+ 'des',
+ 'desselben',
+ 'dessen',
+ 'dich',
+ 'die',
+ 'dies',
+ 'diese',
+ 'dieselbe',
+ 'dieselben',
+ 'diesem',
+ 'diesen',
+ 'dieser',
+ 'dieses',
+ 'dort',
+ 'du',
+ 'durch',
+ 'eine',
+ 'einem',
+ 'einen',
+ 'einer',
+ 'einige',
+ 'einigem',
+ 'einigen',
+ 'einiger',
+ 'einiges',
+ 'einmal',
+ 'es',
+ 'etwas',
+ 'euch',
+ 'euer',
+ 'eure',
+ 'eurem',
+ 'euren',
+ 'eures',
+ 'ganz',
+ 'ganze',
+ 'ganzen',
+ 'ganzer',
+ 'ganzes',
+ 'gegen',
+ 'gemacht',
+ 'gesagt',
+ 'gesehen',
+ 'gewesen',
+ 'gewollt',
+ 'hab',
+ 'habe',
+ 'hatten',
+ 'hin',
+ 'hinter',
+ 'ihm',
+ 'ihn',
+ 'ihr',
+ 'ihrem',
+ 'ihren',
+ 'ihrer',
+ 'ihres',
+ 'im',
+ 'in',
+ 'indem',
+ 'ist',
+ 'jede',
+ 'jedem',
+ 'jeden',
+ 'jeder',
+ 'jedes',
+ 'jene',
+ 'jenem',
+ 'jener',
+ 'jenes',
+ 'jetzt',
+ 'kein',
+ 'keine',
+ 'keinem',
+ 'keiner',
+ 'keines',
+ 'konnte',
+ 'können',
+ 'könnte',
+ 'mache',
+ 'machst',
+ 'macht',
+ 'machte',
+ 'machten',
+ 'man',
+ 'manchen',
+ 'mancher',
+ 'manches',
+ 'mein',
+ 'meine',
+ 'meinem',
+ 'meiner',
+ 'meines',
+ 'mich',
+ 'mir',
+ 'mit',
+ 'muss',
+ 'musste',
+ 'müßt',
+ 'nicht',
+ 'noch',
+ 'nun',
+ 'nur',
+ 'ob',
+ 'ohne',
+ 'sage',
+ 'sagen',
+ 'sagt',
+ 'sagte',
+ 'sagten',
+ 'sagtest',
+ 'sehe',
+ 'sehen',
+ 'sehr',
+ 'seht',
+ 'sein',
+ 'seinem',
+ 'seinen',
+ 'seiner',
+ 'seines',
+ 'selbst',
+ 'sich',
+ 'sicher',
+ 'sie',
+ 'sind',
+ 'so',
+ 'solche',
+ 'solchem',
+ 'solchen',
+ 'solcher',
+ 'sollte',
+ 'sondern',
+ 'um',
+ 'uns',
+ 'unse',
+ 'unsen',
+ 'unser',
+ 'unses',
+ 'unter',
+ 'viel',
+ 'von',
+ 'vor',
+ 'war',
+ 'waren',
+ 'warst',
+ 'was',
+ 'weg',
+ 'weil',
+ 'weiter',
+ 'welchem',
+ 'welchen',
+ 'welcher',
+ 'welches',
+ 'werde',
+ 'wieder',
+ 'will',
+ 'wir',
+ 'wird',
+ 'wirst',
+ 'wo',
+ 'wolle',
+ 'wollen',
+ 'wollt',
+ 'wollten',
+ 'wolltest',
+ 'wolltet',
+ 'würde',
+ 'würden',
+ 'z.B.',
+ 'zum',
+ 'zur',
+ 'zwar',
+ 'zwischen',
+ 'über',
+ 'aber',
+ 'abgerufen',
+ 'abgerufene',
+ 'abgerufener',
+ 'abgerufenes',
+ 'acht',
+ 'acute',
+ 'allein',
+ 'allerdings',
+ 'allerlei',
+ 'allg',
+ 'allgemein',
+ 'allmählich',
+ 'allzu',
+ 'alsbald',
+ 'amp',
+ 'and',
+ 'andererseits',
+ 'andernfalls',
+ 'anerkannt',
+ 'anerkannte',
+ 'anerkannter',
+ 'anerkanntes',
+ 'anfangen',
+ 'anfing',
+ 'angefangen',
+ 'angesetze',
+ 'angesetzt',
+ 'angesetzten',
+ 'angesetzter',
+ 'ansetzen',
+ 'anstatt',
+ 'arbeiten',
+ 'aufgehört',
+ 'aufgrund',
+ 'aufhören',
+ 'aufhörte',
+ 'aufzusuchen',
+ 'ausdrücken',
+ 'ausdrückt',
+ 'ausdrückte',
+ 'ausgenommen',
+ 'ausser',
+ 'ausserdem',
+ 'author',
+ 'autor',
+ 'außen',
+ 'außer',
+ 'außerdem',
+ 'außerhalb',
+ 'background',
+ 'bald',
+ 'bearbeite',
+ 'bearbeiten',
+ 'bearbeitete',
+ 'bearbeiteten',
+ 'bedarf',
+ 'bedurfte',
+ 'bedürfen',
+ 'been',
+ 'befragen',
+ 'befragte',
+ 'befragten',
+ 'befragter',
+ 'begann',
+ 'beginnen',
+ 'begonnen',
+ 'behalten',
+ 'behielt',
+ 'beide',
+ 'beiden',
+ 'beiderlei',
+ 'beides',
+ 'beim',
+ 'beinahe',
+ 'beitragen',
+ 'beitrugen',
+ 'bekannt',
+ 'bekannte',
+ 'bekannter',
+ 'bekennen',
+ 'benutzt',
+ 'bereits',
+ 'berichten',
+ 'berichtet',
+ 'berichtete',
+ 'berichteten',
+ 'besonders',
+ 'besser',
+ 'bestehen',
+ 'besteht',
+ 'beträchtlich',
+ 'bevor',
+ 'bezüglich',
+ 'bietet',
+ 'bisher',
+ 'bislang',
+ 'biz',
+ 'bleiben',
+ 'blieb',
+ 'bloss',
+ 'bloß',
+ 'border',
+ 'brachte',
+ 'brachten',
+ 'brauchen',
+ 'braucht',
+ 'bringen',
+ 'bräuchte',
+ 'bzw',
+ 'böden',
+ 'ca',
+ 'ca.',
+ 'collapsed',
+ 'com',
+ 'comment',
+ 'content',
+ 'da?',
+ 'dabei',
+ 'dadurch',
+ 'dafür',
+ 'dagegen',
+ 'dahin',
+ 'damals',
+ 'danach',
+ 'daneben',
+ 'dank',
+ 'danke',
+ 'danken',
+ 'dannen',
+ 'daran',
+ 'darauf',
+ 'daraus',
+ 'darf',
+ 'darfst',
+ 'darin',
+ 'darum',
+ 'darunter',
+ 'darüber',
+ 'darüberhinaus',
+ 'dass',
+ 'davon',
+ 'davor',
+ 'demnach',
+ 'denen',
+ 'dennoch',
+ 'derart',
+ 'derartig',
+ 'derem',
+ 'deren',
+ 'derjenige',
+ 'derjenigen',
+ 'derzeit',
+ 'desto',
+ 'deswegen',
+ 'diejenige',
+ 'diesseits',
+ 'dinge',
+ 'direkt',
+ 'direkte',
+ 'direkten',
+ 'direkter',
+ 'doc',
+ 'doppelt',
+ 'dorther',
+ 'dorthin',
+ 'drauf',
+ 'drei',
+ 'dreißig',
+ 'drin',
+ 'dritte',
+ 'drunter',
+ 'drüber',
+ 'dunklen',
+ 'durchaus',
+ 'durfte',
+ 'durften',
+ 'dürfen',
+ 'dürfte',
+ 'eben',
+ 'ebenfalls',
+ 'ebenso',
+ 'ehe',
+ 'eher',
+ 'eigenen',
+ 'eigenes',
+ 'eigentlich',
+ 'einbaün',
+ 'einerseits',
+ 'einfach',
+ 'einführen',
+ 'einführte',
+ 'einführten',
+ 'eingesetzt',
+ 'einigermaßen',
+ 'eins',
+ 'einseitig',
+ 'einseitige',
+ 'einseitigen',
+ 'einseitiger',
+ 'einst',
+ 'einstmals',
+ 'einzig',
+ 'elf',
+ 'ende',
+ 'entsprechend',
+ 'entweder',
+ 'ergänze',
+ 'ergänzen',
+ 'ergänzte',
+ 'ergänzten',
+ 'erhalten',
+ 'erhielt',
+ 'erhielten',
+ 'erhält',
+ 'erneut',
+ 'erst',
+ 'erste',
+ 'ersten',
+ 'erster',
+ 'eröffne',
+ 'eröffnen',
+ 'eröffnet',
+ 'eröffnete',
+ 'eröffnetes',
+ 'etc',
+ 'etliche',
+ 'etwa',
+ 'fall',
+ 'falls',
+ 'fand',
+ 'fast',
+ 'ferner',
+ 'finden',
+ 'findest',
+ 'findet',
+ 'folgende',
+ 'folgenden',
+ 'folgender',
+ 'folgendes',
+ 'folglich',
+ 'for',
+ 'fordern',
+ 'fordert',
+ 'forderte',
+ 'forderten',
+ 'fortsetzen',
+ 'fortsetzt',
+ 'fortsetzte',
+ 'fortsetzten',
+ 'fragte',
+ 'frau',
+ 'frei',
+ 'freie',
+ 'freier',
+ 'freies',
+ 'fuer',
+ 'fünf',
+ 'gab',
+ 'ganzem',
+ 'gar',
+ 'gbr',
+ 'geb',
+ 'geben',
+ 'geblieben',
+ 'gebracht',
+ 'gedurft',
+ 'geehrt',
+ 'geehrte',
+ 'geehrten',
+ 'geehrter',
+ 'gefallen',
+ 'gefiel',
+ 'gefälligst',
+ 'gefällt',
+ 'gegeben',
+ 'gehabt',
+ 'gehen',
+ 'geht',
+ 'gekommen',
+ 'gekonnt',
+ 'gemocht',
+ 'gemäss',
+ 'genommen',
+ 'genug',
+ 'gern',
+ 'gestern',
+ 'gestrige',
+ 'getan',
+ 'geteilt',
+ 'geteilte',
+ 'getragen',
+ 'gewissermaßen',
+ 'geworden',
+ 'ggf',
+ 'gib',
+ 'gibt',
+ 'gleich',
+ 'gleichwohl',
+ 'gleichzeitig',
+ 'glücklicherweise',
+ 'gmbh',
+ 'gratulieren',
+ 'gratuliert',
+ 'gratulierte',
+ 'gute',
+ 'guten',
+ 'gängig',
+ 'gängige',
+ 'gängigen',
+ 'gängiger',
+ 'gängiges',
+ 'gänzlich',
+ 'haette',
+ 'halb',
+ 'hallo',
+ 'hast',
+ 'hattest',
+ 'hattet',
+ 'heraus',
+ 'herein',
+ 'heute',
+ 'heutige',
+ 'hiermit',
+ 'hiesige',
+ 'hinein',
+ 'hinten',
+ 'hinterher',
+ 'hoch',
+ 'html',
+ 'http',
+ 'hundert',
+ 'hätt',
+ 'hätte',
+ 'hätten',
+ 'höchstens',
+ 'igitt',
+ 'image',
+ 'immer',
+ 'immerhin',
+ 'important',
+ 'indessen',
+ 'info',
+ 'infolge',
+ 'innen',
+ 'innerhalb',
+ 'insofern',
+ 'inzwischen',
+ 'irgend',
+ 'irgendeine',
+ 'irgendwas',
+ 'irgendwen',
+ 'irgendwer',
+ 'irgendwie',
+ 'irgendwo',
+ 'je',
+ 'jed',
+ 'jedenfalls',
+ 'jederlei',
+ 'jedoch',
+ 'jemand',
+ 'jenseits',
+ 'jährig',
+ 'jährige',
+ 'jährigen',
+ 'jähriges',
+ 'kam',
+ 'kannst',
+ 'kaum',
+ 'kei nes',
+ 'keinerlei',
+ 'keineswegs',
+ 'klar',
+ 'klare',
+ 'klaren',
+ 'klares',
+ 'klein',
+ 'kleinen',
+ 'kleiner',
+ 'kleines',
+ 'koennen',
+ 'koennt',
+ 'koennte',
+ 'koennten',
+ 'komme',
+ 'kommen',
+ 'kommt',
+ 'konkret',
+ 'konkrete',
+ 'konkreten',
+ 'konkreter',
+ 'konkretes',
+ 'konnten',
+ 'könn',
+ 'könnt',
+ 'könnten',
+ 'künftig',
+ 'lag',
+ 'lagen',
+ 'langsam',
+ 'lassen',
+ 'laut',
+ 'lediglich',
+ 'leer',
+ 'legen',
+ 'legte',
+ 'legten',
+ 'leicht',
+ 'leider',
+ 'lesen',
+ 'letze',
+ 'letzten',
+ 'letztendlich',
+ 'letztens',
+ 'letztes',
+ 'letztlich',
+ 'lichten',
+ 'liegt',
+ 'liest',
+ 'links',
+ 'längst',
+ 'längstens',
+ 'mag',
+ 'magst',
+ 'mal',
+ 'mancherorts',
+ 'manchmal',
+ 'mann',
+ 'margin',
+ 'med',
+ 'mehr',
+ 'mehrere',
+ 'meist',
+ 'meiste',
+ 'meisten',
+ 'meta',
+ 'mindestens',
+ 'mithin',
+ 'mochte',
+ 'morgen',
+ 'morgige',
+ 'muessen',
+ 'muesst',
+ 'musst',
+ 'mussten',
+ 'muß',
+ 'mußt',
+ 'möchte',
+ 'möchten',
+ 'möchtest',
+ 'mögen',
+ 'möglich',
+ 'mögliche',
+ 'möglichen',
+ 'möglicher',
+ 'möglicherweise',
+ 'müssen',
+ 'müsste',
+ 'müssten',
+ 'müßte',
+ 'nachdem',
+ 'nacher',
+ 'nachhinein',
+ 'nahm',
+ 'natürlich',
+ 'ncht',
+ 'neben',
+ 'nebenan',
+ 'nehmen',
+ 'nein',
+ 'neu',
+ 'neue',
+ 'neuem',
+ 'neuen',
+ 'neuer',
+ 'neues',
+ 'neun',
+ 'nie',
+ 'niemals',
+ 'niemand',
+ 'nimm',
+ 'nimmer',
+ 'nimmt',
+ 'nirgends',
+ 'nirgendwo',
+ 'nter',
+ 'nutzen',
+ 'nutzt',
+ 'nutzung',
+ 'nächste',
+ 'nämlich',
+ 'nötigenfalls',
+ 'nützt',
+ 'oben',
+ 'oberhalb',
+ 'obgleich',
+ 'obschon',
+ 'obwohl',
+ 'oft',
+ 'online',
+ 'org',
+ 'padding',
+ 'per',
+ 'pfui',
+ 'plötzlich',
+ 'pro',
+ 'reagiere',
+ 'reagieren',
+ 'reagiert',
+ 'reagierte',
+ 'rechts',
+ 'regelmäßig',
+ 'rief',
+ 'rund',
+ 'sang',
+ 'sangen',
+ 'schlechter',
+ 'schließlich',
+ 'schnell',
+ 'schon',
+ 'schreibe',
+ 'schreiben',
+ 'schreibens',
+ 'schreiber',
+ 'schwierig',
+ 'schätzen',
+ 'schätzt',
+ 'schätzte',
+ 'schätzten',
+ 'sechs',
+ 'sect',
+ 'sehrwohl',
+ 'sei',
+ 'seit',
+ 'seitdem',
+ 'seite',
+ 'seiten',
+ 'seither',
+ 'selber',
+ 'senke',
+ 'senken',
+ 'senkt',
+ 'senkte',
+ 'senkten',
+ 'setzen',
+ 'setzt',
+ 'setzte',
+ 'setzten',
+ 'sicherlich',
+ 'sieben',
+ 'siebte',
+ 'siehe',
+ 'sieht',
+ 'singen',
+ 'singt',
+ 'sobald',
+ 'sodaß',
+ 'soeben',
+ 'sofern',
+ 'sofort',
+ 'sog',
+ 'sogar',
+ 'solange',
+ 'solc hen',
+ 'solch',
+ 'sollen',
+ 'sollst',
+ 'sollt',
+ 'sollten',
+ 'solltest',
+ 'somit',
+ 'sonstwo',
+ 'sooft',
+ 'soviel',
+ 'soweit',
+ 'sowie',
+ 'sowohl',
+ 'spielen',
+ 'später',
+ 'startet',
+ 'startete',
+ 'starteten',
+ 'statt',
+ 'stattdessen',
+ 'steht',
+ 'steige',
+ 'steigen',
+ 'steigt',
+ 'stets',
+ 'stieg',
+ 'stiegen',
+ 'such',
+ 'suchen',
+ 'sämtliche',
+ 'tages',
+ 'tat',
+ 'tatsächlich',
+ 'tatsächlichen',
+ 'tatsächlicher',
+ 'tatsächliches',
+ 'tausend',
+ 'teile',
+ 'teilen',
+ 'teilte',
+ 'teilten',
+ 'titel',
+ 'total',
+ 'trage',
+ 'tragen',
+ 'trotzdem',
+ 'trug',
+ 'trägt',
+ 'tun',
+ 'tust',
+ 'tut',
+ 'txt',
+ 'tät',
+ 'ueber',
+ 'umso',
+ 'unbedingt',
+ 'ungefähr',
+ 'unmöglich',
+ 'unmögliche',
+ 'unmöglichen',
+ 'unmöglicher',
+ 'unnötig',
+ 'unsem',
+ 'unser',
+ 'unsere',
+ 'unserem',
+ 'unseren',
+ 'unserer',
+ 'unseres',
+ 'unten',
+ 'unterbrach',
+ 'unterbrechen',
+ 'unterhalb',
+ 'unwichtig',
+ 'usw',
+ 'var',
+ 'vergangen',
+ 'vergangene',
+ 'vergangener',
+ 'vergangenes',
+ 'vermag',
+ 'vermutlich',
+ 'vermögen',
+ 'verrate',
+ 'verraten',
+ 'verriet',
+ 'verrieten',
+ 'version',
+ 'versorge',
+ 'versorgen',
+ 'versorgt',
+ 'versorgte',
+ 'versorgten',
+ 'versorgtes',
+ 'veröffentlichen',
+ 'veröffentlicher',
+ 'veröffentlicht',
+ 'veröffentlichte',
+ 'veröffentlichten',
+ 'veröffentlichtes',
+ 'viele',
+ 'vielen',
+ 'vieler',
+ 'vieles',
+ 'vielleicht',
+ 'vielmals',
+ 'vier',
+ 'vollständig',
+ 'voran',
+ 'vorbei',
+ 'vorgestern',
+ 'vorher',
+ 'vorne',
+ 'vorüber',
+ 'völlig',
+ 'während',
+ 'wachen',
+ 'waere',
+ 'warum',
+ 'weder',
+ 'wegen',
+ 'weitere',
+ 'weiterem',
+ 'weiteren',
+ 'weiterer',
+ 'weiteres',
+ 'weiterhin',
+ 'weiß',
+ 'wem',
+ 'wen',
+ 'wenig',
+ 'wenige',
+ 'weniger',
+ 'wenigstens',
+ 'wenngleich',
+ 'wer',
+ 'werdet',
+ 'weshalb',
+ 'wessen',
+ 'wichtig',
+ 'wieso',
+ 'wieviel',
+ 'wiewohl',
+ 'willst',
+ 'wirklich',
+ 'wodurch',
+ 'wogegen',
+ 'woher',
+ 'wohin',
+ 'wohingegen',
+ 'wohl',
+ 'wohlweislich',
+ 'womit',
+ 'woraufhin',
+ 'woraus',
+ 'worin',
+ 'wurde',
+ 'wurden',
+ 'währenddessen',
+ 'wär',
+ 'wäre',
+ 'wären',
+ 'zahlreich',
+ 'zehn',
+ 'zeitweise',
+ 'ziehen',
+ 'zieht',
+ 'zog',
+ 'zogen',
+ 'zudem',
+ 'zuerst',
+ 'zufolge',
+ 'zugleich',
+ 'zuletzt',
+ 'zumal',
+ 'zurück',
+ 'zusammen',
+ 'zuviel',
+ 'zwanzig',
+ 'zwei',
+ 'zwölf',
+ 'ähnlich',
+ 'übel',
+ 'überall',
+ 'überallhin',
+ 'überdies',
+ 'übermorgen',
+ 'übrig',
+ 'übrigens',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/el.php b/vendor/voku/stop-words/src/voku/helper/stopwords/el.php
new file mode 100644
index 000000000..5752a6e78
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/el.php
@@ -0,0 +1,275 @@
+<?php
+
+// greek
+
+static $data = [
+ 'αλλα',
+ 'αν',
+ 'αντι',
+ 'απο',
+ 'αυτα',
+ 'αυτεσ',
+ 'αυτη',
+ 'αυτο',
+ 'αυτοι',
+ 'αυτοσ',
+ 'αυτουσ',
+ 'αυτων',
+ 'αἱ',
+ 'αἳ',
+ 'αἵ',
+ 'αὐτόσ',
+ 'αὐτὸς',
+ 'αὖ',
+ 'γάρ',
+ 'γα',
+ 'γα^',
+ 'γε',
+ 'για',
+ 'γοῦν',
+ 'γὰρ',
+ 'δ\'',
+ 'δέ',
+ 'δή',
+ 'δαί',
+ 'δαίσ',
+ 'δαὶ',
+ 'δαὶς',
+ 'δε',
+ 'δεν',
+ 'δι\'',
+ 'διά',
+ 'διὰ',
+ 'δὲ',
+ 'δὴ',
+ 'δ’',
+ 'εαν',
+ 'ειμαι',
+ 'ειμαστε',
+ 'ειναι',
+ 'εισαι',
+ 'ειστε',
+ 'εκεινα',
+ 'εκεινεσ',
+ 'εκεινη',
+ 'εκεινο',
+ 'εκεινοι',
+ 'εκεινοσ',
+ 'εκεινουσ',
+ 'εκεινων',
+ 'ενω',
+ 'επ',
+ 'επι',
+ 'εἰ',
+ 'εἰμί',
+ 'εἰμὶ',
+ 'εἰς',
+ 'εἰσ',
+ 'εἴ',
+ 'εἴμι',
+ 'εἴτε',
+ 'η',
+ 'θα',
+ 'ισωσ',
+ 'κ',
+ 'καί',
+ 'καίτοι',
+ 'καθ',
+ 'και',
+ 'κατ',
+ 'κατά',
+ 'κατα',
+ 'κατὰ',
+ 'καὶ',
+ 'κι',
+ 'κἀν',
+ 'κἂν',
+ 'μέν',
+ 'μή',
+ 'μήτε',
+ 'μα',
+ 'με',
+ 'μεθ',
+ 'μετ',
+ 'μετά',
+ 'μετα',
+ 'μετὰ',
+ 'μη',
+ 'μην',
+ 'μἐν',
+ 'μὲν',
+ 'μὴ',
+ 'μὴν',
+ 'να',
+ 'ο',
+ 'οι',
+ 'ομωσ',
+ 'οπωσ',
+ 'οσο',
+ 'οτι',
+ 'οἱ',
+ 'οἳ',
+ 'οἷς',
+ 'οὐ',
+ 'οὐδ',
+ 'οὐδέ',
+ 'οὐδείσ',
+ 'οὐδεὶς',
+ 'οὐδὲ',
+ 'οὐδὲν',
+ 'οὐκ',
+ 'οὐχ',
+ 'οὐχὶ',
+ 'οὓς',
+ 'οὔτε',
+ 'οὕτω',
+ 'οὕτως',
+ 'οὕτωσ',
+ 'οὖν',
+ 'οὗ',
+ 'οὗτος',
+ 'οὗτοσ',
+ 'παρ',
+ 'παρά',
+ 'παρα',
+ 'παρὰ',
+ 'περί',
+ 'περὶ',
+ 'ποια',
+ 'ποιεσ',
+ 'ποιο',
+ 'ποιοι',
+ 'ποιοσ',
+ 'ποιουσ',
+ 'ποιων',
+ 'ποτε',
+ 'που',
+ 'ποῦ',
+ 'προ',
+ 'προσ',
+ 'πρόσ',
+ 'πρὸ',
+ 'πρὸς',
+ 'πως',
+ 'πωσ',
+ 'σε',
+ 'στη',
+ 'στην',
+ 'στο',
+ 'στον',
+ 'σόσ',
+ 'σύ',
+ 'σύν',
+ 'σὸς',
+ 'σὺ',
+ 'σὺν',
+ 'τά',
+ 'τήν',
+ 'τί',
+ 'τίς',
+ 'τίσ',
+ 'τα',
+ 'ταῖς',
+ 'τε',
+ 'την',
+ 'τησ',
+ 'τι',
+ 'τινα',
+ 'τις',
+ 'τισ',
+ 'το',
+ 'τοί',
+ 'τοι',
+ 'τοιοῦτος',
+ 'τοιοῦτοσ',
+ 'τον',
+ 'τοτε',
+ 'του',
+ 'τούσ',
+ 'τοὺς',
+ 'τοῖς',
+ 'τοῦ',
+ 'των',
+ 'τό',
+ 'τόν',
+ 'τότε',
+ 'τὰ',
+ 'τὰς',
+ 'τὴν',
+ 'τὸ',
+ 'τὸν',
+ 'τῆς',
+ 'τῆσ',
+ 'τῇ',
+ 'τῶν',
+ 'τῷ',
+ 'ωσ',
+ 'ἀλλ\'',
+ 'ἀλλά',
+ 'ἀλλὰ',
+ 'ἀλλ’',
+ 'ἀπ',
+ 'ἀπό',
+ 'ἀπὸ',
+ 'ἀφ',
+ 'ἂν',
+ 'ἃ',
+ 'ἄλλος',
+ 'ἄλλοσ',
+ 'ἄν',
+ 'ἄρα',
+ 'ἅμα',
+ 'ἐάν',
+ 'ἐγώ',
+ 'ἐγὼ',
+ 'ἐκ',
+ 'ἐμόσ',
+ 'ἐμὸς',
+ 'ἐν',
+ 'ἐξ',
+ 'ἐπί',
+ 'ἐπεὶ',
+ 'ἐπὶ',
+ 'ἐστι',
+ 'ἐφ',
+ 'ἐὰν',
+ 'ἑαυτοῦ',
+ 'ἔτι',
+ 'ἡ',
+ 'ἢ',
+ 'ἣ',
+ 'ἤ',
+ 'ἥ',
+ 'ἧς',
+ 'ἵνα',
+ 'ὁ',
+ 'ὃ',
+ 'ὃν',
+ 'ὃς',
+ 'ὅ',
+ 'ὅδε',
+ 'ὅθεν',
+ 'ὅπερ',
+ 'ὅς',
+ 'ὅσ',
+ 'ὅστις',
+ 'ὅστισ',
+ 'ὅτε',
+ 'ὅτι',
+ 'ὑμόσ',
+ 'ὑπ',
+ 'ὑπέρ',
+ 'ὑπό',
+ 'ὑπὲρ',
+ 'ὑπὸ',
+ 'ὡς',
+ 'ὡσ',
+ 'ὥς',
+ 'ὥστε',
+ 'ὦ',
+ 'ᾧ',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/en.php b/vendor/voku/stop-words/src/voku/helper/stopwords/en.php
new file mode 100644
index 000000000..b906ad3ef
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/en.php
@@ -0,0 +1,329 @@
+<?php
+
+// english
+
+static $data = [
+ 'a',
+ 'about',
+ 'above',
+ 'above',
+ 'across',
+ 'after',
+ 'afterwards',
+ 'again',
+ 'against',
+ 'all',
+ 'almost',
+ 'alone',
+ 'along',
+ 'already',
+ 'also',
+ 'although',
+ 'always',
+ 'am',
+ 'among',
+ 'amongst',
+ 'amoungst',
+ 'amount',
+ 'an',
+ 'and',
+ 'another',
+ 'any',
+ 'anyhow',
+ 'anyone',
+ 'anything',
+ 'anyway',
+ 'anywhere',
+ 'are',
+ 'around',
+ 'as',
+ 'at',
+ 'back',
+ 'be',
+ 'became',
+ 'because',
+ 'become',
+ 'becomes',
+ 'becoming',
+ 'been',
+ 'before',
+ 'beforehand',
+ 'behind',
+ 'being',
+ 'below',
+ 'beside',
+ 'besides',
+ 'between',
+ 'beyond',
+ 'bill',
+ 'both',
+ 'bottom',
+ 'but',
+ 'by',
+ 'call',
+ 'can',
+ 'cannot',
+ 'cant',
+ 'co',
+ 'con',
+ 'could',
+ 'couldnt',
+ 'cry',
+ 'de',
+ 'describe',
+ 'detail',
+ 'do',
+ 'done',
+ 'down',
+ 'due',
+ 'during',
+ 'each',
+ 'eg',
+ 'eight',
+ 'either',
+ 'eleven',
+ 'else',
+ 'elsewhere',
+ 'empty',
+ 'enough',
+ 'etc',
+ 'even',
+ 'ever',
+ 'every',
+ 'everyone',
+ 'everything',
+ 'everywhere',
+ 'except',
+ 'few',
+ 'fifteen',
+ 'fify',
+ 'fill',
+ 'find',
+ 'fire',
+ 'first',
+ 'five',
+ 'for',
+ 'former',
+ 'formerly',
+ 'forty',
+ 'found',
+ 'four',
+ 'from',
+ 'front',
+ 'full',
+ 'further',
+ 'get',
+ 'give',
+ 'go',
+ 'had',
+ 'has',
+ 'hasnt',
+ 'have',
+ 'he',
+ 'hence',
+ 'her',
+ 'here',
+ 'hereafter',
+ 'hereby',
+ 'herein',
+ 'hereupon',
+ 'hers',
+ 'herself',
+ 'him',
+ 'himself',
+ 'his',
+ 'how',
+ 'however',
+ 'hundred',
+ 'ie',
+ 'if',
+ 'in',
+ 'inc',
+ 'indeed',
+ 'interest',
+ 'into',
+ 'is',
+ 'it',
+ 'its',
+ 'itself',
+ 'keep',
+ 'last',
+ 'latter',
+ 'latterly',
+ 'least',
+ 'less',
+ 'ltd',
+ 'made',
+ 'many',
+ 'may',
+ 'me',
+ 'meanwhile',
+ 'might',
+ 'mill',
+ 'mine',
+ 'more',
+ 'moreover',
+ 'most',
+ 'mostly',
+ 'move',
+ 'much',
+ 'must',
+ 'my',
+ 'myself',
+ 'name',
+ 'namely',
+ 'neither',
+ 'never',
+ 'nevertheless',
+ 'next',
+ 'nine',
+ 'no',
+ 'nobody',
+ 'none',
+ 'noone',
+ 'nor',
+ 'not',
+ 'nothing',
+ 'now',
+ 'nowhere',
+ 'of',
+ 'off',
+ 'often',
+ 'on',
+ 'once',
+ 'one',
+ 'only',
+ 'onto',
+ 'or',
+ 'other',
+ 'others',
+ 'otherwise',
+ 'our',
+ 'ours',
+ 'ourselves',
+ 'out',
+ 'over',
+ 'own',
+ 'part',
+ 'per',
+ 'perhaps',
+ 'please',
+ 'put',
+ 'rather',
+ 're',
+ 'same',
+ 'see',
+ 'seem',
+ 'seemed',
+ 'seeming',
+ 'seems',
+ 'serious',
+ 'several',
+ 'she',
+ 'should',
+ 'show',
+ 'side',
+ 'since',
+ 'sincere',
+ 'six',
+ 'sixty',
+ 'so',
+ 'some',
+ 'somehow',
+ 'someone',
+ 'something',
+ 'sometime',
+ 'sometimes',
+ 'somewhere',
+ 'still',
+ 'such',
+ 'system',
+ 'take',
+ 'ten',
+ 'than',
+ 'that',
+ 'the',
+ 'their',
+ 'them',
+ 'themselves',
+ 'then',
+ 'thence',
+ 'there',
+ 'thereafter',
+ 'thereby',
+ 'therefore',
+ 'therein',
+ 'thereupon',
+ 'these',
+ 'they',
+ 'thickv',
+ 'thin',
+ 'third',
+ 'this',
+ 'those',
+ 'though',
+ 'three',
+ 'through',
+ 'throughout',
+ 'thru',
+ 'thus',
+ 'to',
+ 'together',
+ 'too',
+ 'top',
+ 'toward',
+ 'towards',
+ 'twelve',
+ 'twenty',
+ 'two',
+ 'un',
+ 'under',
+ 'until',
+ 'up',
+ 'upon',
+ 'us',
+ 'very',
+ 'via',
+ 'was',
+ 'we',
+ 'well',
+ 'were',
+ 'what',
+ 'whatever',
+ 'when',
+ 'whence',
+ 'whenever',
+ 'where',
+ 'whereafter',
+ 'whereas',
+ 'whereby',
+ 'wherein',
+ 'whereupon',
+ 'wherever',
+ 'whether',
+ 'which',
+ 'while',
+ 'whither',
+ 'who',
+ 'whoever',
+ 'whole',
+ 'whom',
+ 'whose',
+ 'why',
+ 'will',
+ 'with',
+ 'within',
+ 'without',
+ 'would',
+ 'yet',
+ 'you',
+ 'your',
+ 'yours',
+ 'yourself',
+ 'yourselves',
+ 'the',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/eo.php b/vendor/voku/stop-words/src/voku/helper/stopwords/eo.php
new file mode 100644
index 000000000..fcca06fe1
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/eo.php
@@ -0,0 +1,183 @@
+<?php
+
+// esperanto
+
+static $data = [
+ 'adiaŭ',
+ 'ajn',
+ 'al',
+ 'ankoraŭ',
+ 'antaŭ',
+ 'aŭ',
+ 'bonan',
+ 'bonvole',
+ 'bonvolu',
+ 'bv',
+ 'ci',
+ 'cia',
+ 'cian',
+ 'cin',
+ 'd-ro',
+ 'da',
+ 'de',
+ 'dek',
+ 'deka',
+ 'do',
+ 'doktor\'',
+ 'doktoro',
+ 'du',
+ 'dua',
+ 'dum',
+ 'eble',
+ 'ekz',
+ 'ekzemple',
+ 'en',
+ 'estas',
+ 'estis',
+ 'estos',
+ 'estu',
+ 'estus',
+ 'eĉ',
+ 'f-no',
+ 'feliĉan',
+ 'for',
+ 'fraŭlino',
+ 'ha',
+ 'havas',
+ 'havis',
+ 'havos',
+ 'havu',
+ 'havus',
+ 'he',
+ 'ho',
+ 'hu',
+ 'ili',
+ 'ilia',
+ 'ilian',
+ 'ilin',
+ 'inter',
+ 'io',
+ 'ion',
+ 'iu',
+ 'iujn',
+ 'iun',
+ 'ja',
+ 'jam',
+ 'je',
+ 'jes',
+ 'k',
+ 'kaj',
+ 'ke',
+ 'kio',
+ 'kion',
+ 'kiu',
+ 'kiujn',
+ 'kiun',
+ 'kvankam',
+ 'kvar',
+ 'kvara',
+ 'kvazaŭ',
+ 'kvin',
+ 'kvina',
+ 'la',
+ 'li',
+ 'lia',
+ 'lian',
+ 'lin',
+ 'malantaŭ',
+ 'male',
+ 'malgraŭ',
+ 'mem',
+ 'mi',
+ 'mia',
+ 'mian',
+ 'min',
+ 'minus',
+ 'naŭ',
+ 'naŭa',
+ 'ne',
+ 'nek',
+ 'nenio',
+ 'nenion',
+ 'neniu',
+ 'neniun',
+ 'nepre',
+ 'ni',
+ 'nia',
+ 'nian',
+ 'nin',
+ 'nu',
+ 'nun',
+ 'nur',
+ 'ok',
+ 'oka',
+ 'oni',
+ 'onia',
+ 'onian',
+ 'onin',
+ 'plej',
+ 'pli',
+ 'plu',
+ 'plus',
+ 'por',
+ 'post',
+ 'preter',
+ 's-no',
+ 's-ro',
+ 'se',
+ 'sed',
+ 'sep',
+ 'sepa',
+ 'ses',
+ 'sesa',
+ 'si',
+ 'sia',
+ 'sian',
+ 'sin',
+ 'sinjor\'',
+ 'sinjorino',
+ 'sinjoro',
+ 'sub',
+ 'super',
+ 'supren',
+ 'sur',
+ 'tamen',
+ 'tio',
+ 'tion',
+ 'tiu',
+ 'tiujn',
+ 'tiun',
+ 'tra',
+ 'tri',
+ 'tria',
+ 'tuj',
+ 'tute',
+ 'unu',
+ 'unua',
+ 've',
+ 'verŝajne',
+ 'vi',
+ 'via',
+ 'vian',
+ 'vin',
+ 'ĉi',
+ 'ĉio',
+ 'ĉion',
+ 'ĉiu',
+ 'ĉiujn',
+ 'ĉiun',
+ 'ĉu',
+ 'ĝi',
+ 'ĝia',
+ 'ĝian',
+ 'ĝin',
+ 'ĝis',
+ 'ĵus',
+ 'ŝi',
+ 'ŝia',
+ 'ŝin',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/es.php b/vendor/voku/stop-words/src/voku/helper/stopwords/es.php
new file mode 100644
index 000000000..5d90d0bad
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/es.php
@@ -0,0 +1,323 @@
+<?php
+
+// spanish
+
+static $data = [
+ 'de',
+ 'la',
+ 'que',
+ 'el',
+ 'en',
+ 'y',
+ 'a',
+ 'los',
+ 'del',
+ 'se',
+ 'las',
+ 'por',
+ 'un',
+ 'para',
+ 'con',
+ 'no',
+ 'una',
+ 'su',
+ 'al',
+ 'lo',
+ 'como',
+ 'más',
+ 'pero',
+ 'sus',
+ 'le',
+ 'ya',
+ 'o',
+ 'este',
+ 'sí',
+ 'porque',
+ 'esta',
+ 'entre',
+ 'cuando',
+ 'muy',
+ 'sin',
+ 'sobre',
+ 'también',
+ 'me',
+ 'hasta',
+ 'hay',
+ 'donde',
+ 'quien',
+ 'desde',
+ 'todo',
+ 'nos',
+ 'durante',
+ 'todos',
+ 'uno',
+ 'les',
+ 'ni',
+ 'contra',
+ 'otros',
+ 'ese',
+ 'eso',
+ 'ante',
+ 'ellos',
+ 'e',
+ 'esto',
+ 'mí',
+ 'antes',
+ 'algunos',
+ 'qué',
+ 'unos',
+ 'yo',
+ 'otro',
+ 'otras',
+ 'otra',
+ 'él',
+ 'tanto',
+ 'esa',
+ 'estos',
+ 'mucho',
+ 'quienes',
+ 'nada',
+ 'muchos',
+ 'cual',
+ 'poco',
+ 'ella',
+ 'estar',
+ 'estas',
+ 'algunas',
+ 'algo',
+ 'nosotros',
+ 'mi',
+ 'mis',
+ 'tú',
+ 'te',
+ 'ti',
+ 'tu',
+ 'tus',
+ 'ellas',
+ 'nosotras',
+ 'vosostros',
+ 'vosostras',
+ 'os',
+ 'mío',
+ 'mía',
+ 'míos',
+ 'mías',
+ 'tuyo',
+ 'tuya',
+ 'tuyos',
+ 'tuyas',
+ 'suyo',
+ 'suya',
+ 'suyos',
+ 'suyas',
+ 'nuestro',
+ 'nuestra',
+ 'nuestros',
+ 'nuestras',
+ 'vuestro',
+ 'vuestra',
+ 'vuestros',
+ 'vuestras',
+ 'esos',
+ 'esas',
+ 'estoy',
+ 'estás',
+ 'está',
+ 'estamos',
+ 'estáis',
+ 'están',
+ 'esté',
+ 'estés',
+ 'estemos',
+ 'estéis',
+ 'estén',
+ 'estaré',
+ 'estarás',
+ 'estará',
+ 'estaremos',
+ 'estaréis',
+ 'estarán',
+ 'estaría',
+ 'estarías',
+ 'estaríamos',
+ 'estaríais',
+ 'estarían',
+ 'estaba',
+ 'estabas',
+ 'estábamos',
+ 'estabais',
+ 'estaban',
+ 'estuve',
+ 'estuviste',
+ 'estuvo',
+ 'estuvimos',
+ 'estuvisteis',
+ 'estuvieron',
+ 'estuviera',
+ 'estuvieras',
+ 'estuviéramos',
+ 'estuvierais',
+ 'estuvieran',
+ 'estuviese',
+ 'estuvieses',
+ 'estuviésemos',
+ 'estuvieseis',
+ 'estuviesen',
+ 'estando',
+ 'estado',
+ 'estada',
+ 'estados',
+ 'estadas',
+ 'estad',
+ 'he',
+ 'has',
+ 'ha',
+ 'hemos',
+ 'habéis',
+ 'han',
+ 'haya',
+ 'hayas',
+ 'hayamos',
+ 'hayáis',
+ 'hayan',
+ 'habré',
+ 'habrás',
+ 'habrá',
+ 'habremos',
+ 'habréis',
+ 'habrán',
+ 'habría',
+ 'habrías',
+ 'habríamos',
+ 'habríais',
+ 'habrían',
+ 'había',
+ 'habías',
+ 'habíamos',
+ 'habíais',
+ 'habían',
+ 'hube',
+ 'hubiste',
+ 'hubo',
+ 'hubimos',
+ 'hubisteis',
+ 'hubieron',
+ 'hubiera',
+ 'hubieras',
+ 'hubiéramos',
+ 'hubierais',
+ 'hubieran',
+ 'hubiese',
+ 'hubieses',
+ 'hubiésemos',
+ 'hubieseis',
+ 'hubiesen',
+ 'habiendo',
+ 'habido',
+ 'habida',
+ 'habidos',
+ 'habidas',
+ 'soy',
+ 'eres',
+ 'es',
+ 'somos',
+ 'sois',
+ 'son',
+ 'sea',
+ 'seas',
+ 'seamos',
+ 'seáis',
+ 'sean',
+ 'seré',
+ 'serás',
+ 'será',
+ 'seremos',
+ 'seréis',
+ 'serán',
+ 'sería',
+ 'serías',
+ 'seríamos',
+ 'seríais',
+ 'serían',
+ 'era',
+ 'eras',
+ 'éramos',
+ 'erais',
+ 'eran',
+ 'fui',
+ 'fuiste',
+ 'fue',
+ 'fuimos',
+ 'fuisteis',
+ 'fueron',
+ 'fuera',
+ 'fueras',
+ 'fuéramos',
+ 'fuerais',
+ 'fueran',
+ 'fuese',
+ 'fueses',
+ 'fuésemos',
+ 'fueseis',
+ 'fuesen',
+ 'sintiendo',
+ 'sentido',
+ 'sentida',
+ 'sentidos',
+ 'sentidas',
+ 'siente',
+ 'sentid',
+ 'tengo',
+ 'tienes',
+ 'tiene',
+ 'tenemos',
+ 'tenéis',
+ 'tienen',
+ 'tenga',
+ 'tengas',
+ 'tengamos',
+ 'tengáis',
+ 'tengan',
+ 'tendré',
+ 'tendrás',
+ 'tendrá',
+ 'tendremos',
+ 'tendréis',
+ 'tendrán',
+ 'tendría',
+ 'tendrías',
+ 'tendríamos',
+ 'tendríais',
+ 'tendrían',
+ 'tenía',
+ 'tenías',
+ 'teníamos',
+ 'teníais',
+ 'tenían',
+ 'tuve',
+ 'tuviste',
+ 'tuvo',
+ 'tuvimos',
+ 'tuvisteis',
+ 'tuvieron',
+ 'tuviera',
+ 'tuvieras',
+ 'tuviéramos',
+ 'tuvierais',
+ 'tuvieran',
+ 'tuviese',
+ 'tuvieses',
+ 'tuviésemos',
+ 'tuvieseis',
+ 'tuviesen',
+ 'teniendo',
+ 'tenido',
+ 'tenida',
+ 'tenidos',
+ 'tenidas',
+ 'tened',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/et.php b/vendor/voku/stop-words/src/voku/helper/stopwords/et.php
new file mode 100644
index 000000000..5ce33f5ad
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/et.php
@@ -0,0 +1,45 @@
+<?php
+
+// estonian
+
+static $data = [
+ 'aga',
+ 'ei',
+ 'et',
+ 'ja',
+ 'jah',
+ 'kas',
+ 'kui',
+ 'kõik',
+ 'ma',
+ 'me',
+ 'mida',
+ 'midagi',
+ 'mind',
+ 'minu',
+ 'mis',
+ 'mu',
+ 'mul',
+ 'mulle',
+ 'nad',
+ 'nii',
+ 'oled',
+ 'olen',
+ 'oli',
+ 'oma',
+ 'on',
+ 'pole',
+ 'sa',
+ 'seda',
+ 'see',
+ 'selle',
+ 'siin',
+ 'siis',
+ 'ta',
+ 'te',
+ 'ära',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/fi.php b/vendor/voku/stop-words/src/voku/helper/stopwords/fi.php
new file mode 100644
index 000000000..6662ccf37
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/fi.php
@@ -0,0 +1,245 @@
+<?php
+
+// finnish
+
+static $data = [
+ 'olla',
+ 'olen',
+ 'olet',
+ 'on',
+ 'olemme',
+ 'olette',
+ 'ovat',
+ 'ole',
+ 'oli',
+ 'olisi',
+ 'olisit',
+ 'olisin',
+ 'olisimme',
+ 'olisitte',
+ 'olisivat',
+ 'olit',
+ 'olin',
+ 'olimme',
+ 'olitte',
+ 'olivat',
+ 'ollut',
+ 'olleet',
+ 'en',
+ 'et',
+ 'ei',
+ 'emme',
+ 'ette',
+ 'eivät',
+ 'minä',
+ 'minun',
+ 'minut',
+ 'minua',
+ 'minussa',
+ 'minusta',
+ 'minuun',
+ 'minulla',
+ 'minulta',
+ 'minulle',
+ 'sinä',
+ 'sinun',
+ 'sinut',
+ 'sinua',
+ 'sinussa',
+ 'sinusta',
+ 'sinuun',
+ 'sinulla',
+ 'sinulta',
+ 'sinulle',
+ 'hän',
+ 'hänen',
+ 'hänet',
+ 'häntä',
+ 'hänessä',
+ 'hänestä',
+ 'häneen',
+ 'hänellä',
+ 'häneltä',
+ 'hänelle',
+ 'me',
+ 'meidän',
+ 'meidät',
+ 'meitä',
+ 'meissä',
+ 'meistä',
+ 'meihin',
+ 'meillä',
+ 'meiltä',
+ 'meille',
+ 'te',
+ 'teidän',
+ 'teidät',
+ 'teitä',
+ 'teissä',
+ 'teistä',
+ 'teihin',
+ 'teillä',
+ 'teiltä',
+ 'teille',
+ 'he',
+ 'heidän',
+ 'heidät',
+ 'heitä',
+ 'heissä',
+ 'heistä',
+ 'heihin',
+ 'heillä',
+ 'heiltä',
+ 'heille',
+ 'tämä',
+ 'tämän',
+ 'tätä',
+ 'tässä',
+ 'tästä',
+ 'tähän',
+ 'tallä',
+ 'tältä',
+ 'tälle',
+ 'tänä',
+ 'täksi',
+ 'tuo',
+ 'tuon',
+ 'tuotä',
+ 'tuossa',
+ 'tuosta',
+ 'tuohon',
+ 'tuolla',
+ 'tuolta',
+ 'tuolle',
+ 'tuona',
+ 'tuoksi',
+ 'se',
+ 'sen',
+ 'sitä',
+ 'siinä',
+ 'siitä',
+ 'siihen',
+ 'sillä',
+ 'siltä',
+ 'sille',
+ 'sinä',
+ 'siksi',
+ 'nämä',
+ 'näiden',
+ 'näitä',
+ 'näissä',
+ 'näistä',
+ 'näihin',
+ 'näillä',
+ 'näiltä',
+ 'näille',
+ 'näinä',
+ 'näiksi',
+ 'nuo',
+ 'noiden',
+ 'noita',
+ 'noissa',
+ 'noista',
+ 'noihin',
+ 'noilla',
+ 'noilta',
+ 'noille',
+ 'noina',
+ 'noiksi',
+ 'ne',
+ 'niiden',
+ 'niitä',
+ 'niissä',
+ 'niistä',
+ 'niihin',
+ 'niillä',
+ 'niiltä',
+ 'niille',
+ 'niinä',
+ 'niiksi',
+ 'kuka',
+ 'kenen',
+ 'kenet',
+ 'ketä',
+ 'kenessä',
+ 'kenestä',
+ 'keneen',
+ 'kenellä',
+ 'keneltä',
+ 'kenelle',
+ 'kenenä',
+ 'keneksi',
+ 'ketkä',
+ 'keiden',
+ 'ketkä',
+ 'keitä',
+ 'keissä',
+ 'keistä',
+ 'keihin',
+ 'keillä',
+ 'keiltä',
+ 'keille',
+ 'keinä',
+ 'keiksi',
+ 'mikä',
+ 'minkä',
+ 'minkä',
+ 'mitä',
+ 'missä',
+ 'mistä',
+ 'mihin',
+ 'millä',
+ 'miltä',
+ 'mille',
+ 'minä',
+ 'miksi',
+ 'mitkä',
+ 'joka',
+ 'jonka',
+ 'jota',
+ 'jossa',
+ 'josta',
+ 'johon',
+ 'jolla',
+ 'jolta',
+ 'jolle',
+ 'jona',
+ 'joksi',
+ 'jotka',
+ 'joiden',
+ 'joita',
+ 'joissa',
+ 'joista',
+ 'joihin',
+ 'joilla',
+ 'joilta',
+ 'joille',
+ 'joina',
+ 'joiksi',
+ 'että',
+ 'ja',
+ 'jos',
+ 'koska',
+ 'kuin',
+ 'mutta',
+ 'niin',
+ 'sekä',
+ 'sillä',
+ 'tai',
+ 'vaan',
+ 'vai',
+ 'vaikka',
+ 'kanssa',
+ 'mukaan',
+ 'noin',
+ 'poikki',
+ 'yli',
+ 'kun',
+ 'niin',
+ 'nyt',
+ 'itse',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/fr.php b/vendor/voku/stop-words/src/voku/helper/stopwords/fr.php
new file mode 100644
index 000000000..5df94e31e
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/fr.php
@@ -0,0 +1,717 @@
+<?php
+
+// french
+
+static $data = [
+ 'a',
+ 'A',
+ 'à',
+ 'afin',
+ 'ah',
+ 'ai',
+ 'aie',
+ 'aient',
+ 'aies',
+ 'ailleurs',
+ 'ainsi',
+ 'ait',
+ 'alentour',
+ 'alias',
+ 'allais',
+ 'allaient',
+ 'allait',
+ 'allons',
+ 'allez',
+ 'alors',
+ 'Ap.',
+ 'Apr.',
+ 'après',
+ 'après-demain',
+ 'arrière',
+ 'as',
+ 'assez',
+ 'attendu',
+ 'au',
+ 'aucun',
+ 'aucune',
+ 'au-dedans',
+ 'au-dehors',
+ 'au-delà',
+ 'au-dessous',
+ 'au-dessus',
+ 'au-devant',
+ 'audit',
+ 'aujourd\'',
+ 'aujourd\'hui',
+ 'auparavant',
+ 'auprès',
+ 'auquel',
+ 'aura',
+ 'aurai',
+ 'auraient',
+ 'aurais',
+ 'aurait',
+ 'auras',
+ 'aurez',
+ 'auriez',
+ 'aurions',
+ 'aurons',
+ 'auront',
+ 'aussi',
+ 'aussitôt',
+ 'autant',
+ 'autour',
+ 'autre',
+ 'autrefois',
+ 'autres',
+ 'autrui',
+ 'aux',
+ 'auxdites',
+ 'auxdits',
+ 'auxquelles',
+ 'auxquels',
+ 'avaient',
+ 'avais',
+ 'avait',
+ 'avant',
+ 'avant-hier',
+ 'avec',
+ 'avez',
+ 'aviez',
+ 'avions',
+ 'avoir',
+ 'avons',
+ 'ayant',
+ 'ayez',
+ 'ayons',
+ 'B',
+ 'bah',
+ 'banco',
+ 'bé',
+ 'beaucoup',
+ 'ben',
+ 'bien',
+ 'bientôt',
+ 'bis',
+ 'bon',
+ 'C',
+ 'c\'',
+ 'ç\'',
+ 'c.-à-d.',
+ 'Ca',
+ 'ça',
+ 'çà',
+ 'cahin-caha',
+ 'car',
+ 'ce',
+ '-ce',
+ 'céans',
+ 'ceci',
+ 'cela',
+ 'celle',
+ 'celle-ci',
+ 'celle-là',
+ 'celles',
+ 'celles-ci',
+ 'celles-là',
+ 'celui',
+ 'celui-ci',
+ 'celui-là',
+ 'cent',
+ 'cents',
+ 'cependant',
+ 'certain',
+ 'certaine',
+ 'certaines',
+ 'certains',
+ 'certes',
+ 'ces',
+ 'c\'est-à-dire',
+ 'cet',
+ 'cette',
+ 'ceux',
+ 'ceux-ci',
+ 'ceux-là',
+ 'cf.',
+ 'cg',
+ 'cgr',
+ 'chacun',
+ 'chacune',
+ 'chaque',
+ 'cher',
+ 'chez',
+ 'ci',
+ '-ci',
+ 'ci-après',
+ 'ci-dessous',
+ 'ci-dessus',
+ 'cinq',
+ 'cinquante',
+ 'cinquante-cinq',
+ 'cinquante-deux',
+ 'cinquante-et-un',
+ 'cinquante-huit',
+ 'cinquante-neuf',
+ 'cinquante-quatre',
+ 'cinquante-sept',
+ 'cinquante-six',
+ 'cinquante-trois',
+ 'cl',
+ 'cm',
+ 'cm²',
+ 'combien',
+ 'comme',
+ 'comment',
+ 'contrario',
+ 'contre',
+ 'crescendo',
+ 'D',
+ 'd\'',
+ 'd\'abord',
+ 'd\'accord',
+ 'd\'affilée',
+ 'd\'ailleurs',
+ 'dans',
+ 'd\'après',
+ 'd\'arrache-pied',
+ 'davantage',
+ 'de',
+ 'debout',
+ 'dedans',
+ 'dehors',
+ 'déjà',
+ 'delà',
+ 'demain',
+ 'd\'emblée',
+ 'depuis',
+ 'derechef',
+ 'derrière',
+ 'des',
+ 'dès',
+ 'desdites',
+ 'desdits',
+ 'désormais',
+ 'desquelles',
+ 'desquels',
+ 'dessous',
+ 'dessus',
+ 'deux',
+ 'devant',
+ 'devers',
+ 'dg',
+ 'die',
+ 'différentes',
+ 'différents',
+ 'dire',
+ 'dis',
+ 'disent',
+ 'dit',
+ 'dito',
+ 'divers',
+ 'diverses',
+ 'dix',
+ 'dix-huit',
+ 'dix-neuf',
+ 'dix-sept',
+ 'dl',
+ 'dm',
+ 'donc',
+ 'dont',
+ 'dorénavant',
+ 'douze',
+ 'du',
+ 'dû',
+ 'dudit',
+ 'duquel',
+ 'durant',
+ 'E',
+ 'eh',
+ 'elle',
+ '-elle',
+ 'elles',
+ '-elles',
+ 'en',
+ '\'en',
+ '-en',
+ 'encore',
+ 'enfin',
+ 'ensemble',
+ 'ensuite',
+ 'entre',
+ 'entre-temps',
+ 'envers',
+ 'environ',
+ 'es',
+ 'ès',
+ 'est',
+ 'et',
+ 'et/ou',
+ 'étaient',
+ 'étais',
+ 'était',
+ 'étant',
+ 'etc',
+ 'été',
+ 'êtes',
+ 'étiez',
+ 'étions',
+ 'être',
+ 'eu',
+ 'eue',
+ 'eues',
+ 'euh',
+ 'eûmes',
+ 'eurent',
+ 'eus',
+ 'eusse',
+ 'eussent',
+ 'eusses',
+ 'eussiez',
+ 'eussions',
+ 'eut',
+ 'eût',
+ 'eûtes',
+ 'eux',
+ 'exprès',
+ 'extenso',
+ 'extremis',
+ 'F',
+ 'facto',
+ 'fallait',
+ 'faire',
+ 'fais',
+ 'faisais',
+ 'faisait',
+ 'faisaient',
+ 'faisons',
+ 'fait',
+ 'faites',
+ 'faudrait',
+ 'faut',
+ 'fi',
+ 'flac',
+ 'fors',
+ 'fort',
+ 'forte',
+ 'fortiori',
+ 'frais',
+ 'fûmes',
+ 'fur',
+ 'furent',
+ 'fus',
+ 'fusse',
+ 'fussent',
+ 'fusses',
+ 'fussiez',
+ 'fussions',
+ 'fut',
+ 'fût',
+ 'fûtes',
+ 'G',
+ 'gr',
+ 'grosso',
+ 'guère',
+ 'H',
+ 'ha',
+ 'han',
+ 'haut',
+ 'hé',
+ 'hein',
+ 'hem',
+ 'heu',
+ 'hg',
+ 'hier',
+ 'hl',
+ 'holà',
+ 'hop',
+ 'hormis',
+ 'hors',
+ 'hui',
+ 'huit',
+ 'hum',
+ 'I',
+ 'ibidem',
+ 'ici',
+ 'ici-bas',
+ 'idem',
+ 'il',
+ '-il',
+ 'illico',
+ 'ils',
+ '-ils',
+ 'ipso',
+ 'item',
+ 'J',
+ 'j\'',
+ 'jadis',
+ 'jamais',
+ 'je',
+ '-je',
+ 'jusqu\'',
+ 'jusqu\'à',
+ 'jusqu\'au',
+ 'jusqu\'aux',
+ 'jusque',
+ 'juste',
+ 'l\'',
+ 'la',
+ '-la',
+ 'là',
+ '-là',
+ 'là-bas',
+ 'là-dedans',
+ 'là-dehors',
+ 'là-derrière',
+ 'là-dessous',
+ 'là-dessus',
+ 'là-devant',
+ 'là-haut',
+ 'laquelle',
+ 'l\'autre',
+ 'le',
+ '-le',
+ 'lequel',
+ 'les',
+ '-les',
+ 'lès',
+ 'lesquelles',
+ 'lesquels',
+ 'leur',
+ '-leur',
+ 'leurs',
+ 'lez',
+ 'loin',
+ 'l\'on',
+ 'longtemps',
+ 'lors',
+ 'lorsqu\'',
+ 'lorsque',
+ 'lui',
+ '-lui',
+ 'l\'un',
+ 'l\'une',
+ 'M',
+ 'm\'',
+ 'ma',
+ 'maint',
+ 'mainte',
+ 'maintenant',
+ 'maintes',
+ 'maints',
+ 'mais',
+ 'mal',
+ 'malgré',
+ 'me',
+ 'même',
+ 'mêmes',
+ 'mes',
+ 'mg',
+ 'mgr',
+ 'mieux',
+ 'mil',
+ 'mille',
+ 'milliards',
+ 'millions',
+ 'minima',
+ 'modo',
+ 'moi',
+ '-moi',
+ 'moins',
+ 'mon',
+ 'moult',
+ 'moyennant',
+ 'N',
+ 'n\'',
+ 'naguère',
+ 'ne',
+ 'néanmoins',
+ 'neuf',
+ 'ni',
+ 'non',
+ 'nonante',
+ 'nonobstant',
+ 'nos',
+ 'notre',
+ 'nous',
+ '-nous',
+ 'nul',
+ 'nulle',
+ 'O',
+ 'ô',
+ 'octante',
+ 'oh',
+ 'on',
+ '-on',
+ 'ont',
+ 'onze',
+ 'or',
+ 'ou',
+ 'où',
+ 'ouais',
+ 'oui',
+ 'outre',
+ 'P',
+ 'par',
+ 'parbleu',
+ 'parce',
+ 'par-ci',
+ 'par-delà',
+ 'par-derrière',
+ 'par-dessous',
+ 'par-dessus',
+ 'par-devant',
+ 'parfois',
+ 'par-là',
+ 'parmi',
+ 'partout',
+ 'pas',
+ 'passé',
+ 'passim',
+ 'pendant',
+ 'personne',
+ 'petto',
+ 'peu',
+ 'peut',
+ 'peuvent',
+ 'peux',
+ 'peut-être',
+ 'pis',
+ 'plus',
+ 'plusieurs',
+ 'plutôt',
+ 'point',
+ 'posteriori',
+ 'pour',
+ 'pourquoi',
+ 'pourtant',
+ 'préalable',
+ 'près',
+ 'presqu\'',
+ 'presque',
+ 'primo',
+ 'priori',
+ 'prou',
+ 'pu',
+ 'puis',
+ 'puisqu\'',
+ 'puisque',
+ 'Q',
+ 'qu\'',
+ 'qua',
+ 'quand',
+ 'quarante',
+ 'quarante-cinq',
+ 'quarante-deux',
+ 'quarante-et-un',
+ 'quarante-huit',
+ 'quarante-neuf',
+ 'quarante-quatre',
+ 'quarante-sept',
+ 'quarante-six',
+ 'quarante-trois',
+ 'quasi',
+ 'quatorze',
+ 'quatre',
+ 'quatre-vingt',
+ 'quatre-vingt-cinq',
+ 'quatre-vingt-deux',
+ 'quatre-vingt-dix',
+ 'quatre-vingt-dix-huit',
+ 'quatre-vingt-dix-neuf',
+ 'quatre-vingt-dix-sept',
+ 'quatre-vingt-douze',
+ 'quatre-vingt-huit',
+ 'quatre-vingt-neuf',
+ 'quatre-vingt-onze',
+ 'quatre-vingt-quatorze',
+ 'quatre-vingt-quatre',
+ 'quatre-vingt-quinze',
+ 'quatre-vingts',
+ 'quatre-vingt-seize',
+ 'quatre-vingt-sept',
+ 'quatre-vingt-six',
+ 'quatre-vingt-treize',
+ 'quatre-vingt-trois',
+ 'quatre-vingt-un',
+ 'quatre-vingt-une',
+ 'que',
+ 'quel',
+ 'quelle',
+ 'quelles',
+ 'quelqu\'',
+ 'quelque',
+ 'quelquefois',
+ 'quelques',
+ 'quelques-unes',
+ 'quelques-uns',
+ 'quelqu\'un',
+ 'quelqu\'une',
+ 'quels',
+ 'qui',
+ 'quiconque',
+ 'quinze',
+ 'quoi',
+ 'quoiqu\'',
+ 'quoique',
+ 'R',
+ 'revoici',
+ 'revoilà',
+ 'rien',
+ 'S',
+ 's\'',
+ 'sa',
+ 'sans',
+ 'sauf',
+ 'se',
+ 'secundo',
+ 'seize',
+ 'selon',
+ 'sensu',
+ 'sept',
+ 'septante',
+ 'sera',
+ 'serai',
+ 'seraient',
+ 'serais',
+ 'serait',
+ 'seras',
+ 'serez',
+ 'seriez',
+ 'serions',
+ 'serons',
+ 'seront',
+ 'ses',
+ 'si',
+ 'sic',
+ 'sine',
+ 'sinon',
+ 'sitôt',
+ 'situ',
+ 'six',
+ 'soi',
+ 'soient',
+ 'sois',
+ 'soit',
+ 'soixante',
+ 'soixante-cinq',
+ 'soixante-deux',
+ 'soixante-dix',
+ 'soixante-dix-huit',
+ 'soixante-dix-neuf',
+ 'soixante-dix-sept',
+ 'soixante-douze',
+ 'soixante-et-onze',
+ 'soixante-et-un',
+ 'soixante-et-une',
+ 'soixante-huit',
+ 'soixante-neuf',
+ 'soixante-quatorze',
+ 'soixante-quatre',
+ 'soixante-quinze',
+ 'soixante-seize',
+ 'soixante-sept',
+ 'soixante-six',
+ 'soixante-treize',
+ 'soixante-trois',
+ 'sommes',
+ 'son',
+ 'sont',
+ 'soudain',
+ 'sous',
+ 'souvent',
+ 'soyez',
+ 'soyons',
+ 'stricto',
+ 'suis',
+ 'sur',
+ 'sur-le-champ',
+ 'surtout',
+ 'sus',
+ 'T',
+ '-t',
+ 't\'',
+ 'ta',
+ 'tacatac',
+ 'tant',
+ 'tantôt',
+ 'tard',
+ 'te',
+ 'tel',
+ 'telle',
+ 'telles',
+ 'tels',
+ 'ter',
+ 'tes',
+ 'toi',
+ '-toi',
+ 'ton',
+ 'tôt',
+ 'toujours',
+ 'tous',
+ 'tout',
+ 'toute',
+ 'toutefois',
+ 'toutes',
+ 'treize',
+ 'trente',
+ 'trente-cinq',
+ 'trente-deux',
+ 'trente-et-un',
+ 'trente-huit',
+ 'trente-neuf',
+ 'trente-quatre',
+ 'trente-sept',
+ 'trente-six',
+ 'trente-trois',
+ 'très',
+ 'trois',
+ 'trop',
+ 'tu',
+ '-tu',
+ 'U',
+ 'un',
+ 'une',
+ 'unes',
+ 'uns',
+ 'USD',
+ 'V',
+ 'va',
+ 'vais',
+ 'vas',
+ 'vers',
+ 'veut',
+ 'veux',
+ 'via',
+ 'vice-versa',
+ 'vingt',
+ 'vingt-cinq',
+ 'vingt-deux',
+ 'vingt-huit',
+ 'vingt-neuf',
+ 'vingt-quatre',
+ 'vingt-sept',
+ 'vingt-six',
+ 'vingt-trois',
+ 'vis-à-vis',
+ 'vite',
+ 'vitro',
+ 'vivo',
+ 'voici',
+ 'voilà',
+ 'voire',
+ 'volontiers',
+ 'vos',
+ 'votre',
+ 'vous',
+ '-vous',
+ 'W',
+ 'X',
+ 'y',
+ '-y',
+ 'Z',
+ 'zéro',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/hi.php b/vendor/voku/stop-words/src/voku/helper/stopwords/hi.php
new file mode 100644
index 000000000..8dbade8b1
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/hi.php
@@ -0,0 +1,235 @@
+<?php
+
+// hindi
+
+static $data = [
+ 'अंदर',
+ 'अत',
+ 'अदि',
+ 'अप',
+ 'अपना',
+ 'अपनि',
+ 'अपनी',
+ 'अपने',
+ 'अभि',
+ 'अभी',
+ 'आदि',
+ 'आप',
+ 'इंहिं',
+ 'इंहें',
+ 'इंहों',
+ 'इतयादि',
+ 'इत्यादि',
+ 'इन',
+ 'इनका',
+ 'इन्हीं',
+ 'इन्हें',
+ 'इन्हों',
+ 'इस',
+ 'इसका',
+ 'इसकि',
+ 'इसकी',
+ 'इसके',
+ 'इसमें',
+ 'इसि',
+ 'इसी',
+ 'इसे',
+ 'उंहिं',
+ 'उंहें',
+ 'उंहों',
+ 'उन',
+ 'उनका',
+ 'उनकि',
+ 'उनकी',
+ 'उनके',
+ 'उनको',
+ 'उन्हीं',
+ 'उन्हें',
+ 'उन्हों',
+ 'उस',
+ 'उसके',
+ 'उसि',
+ 'उसी',
+ 'उसे',
+ 'एक',
+ 'एवं',
+ 'एस',
+ 'एसे',
+ 'ऐसे',
+ 'ओर',
+ 'और',
+ 'कइ',
+ 'कई',
+ 'कर',
+ 'करता',
+ 'करते',
+ 'करना',
+ 'करने',
+ 'करें',
+ 'कहते',
+ 'कहा',
+ 'का',
+ 'काफि',
+ 'काफ़ी',
+ 'कि',
+ 'किंहें',
+ 'किंहों',
+ 'कितना',
+ 'किन्हें',
+ 'किन्हों',
+ 'किया',
+ 'किर',
+ 'किस',
+ 'किसि',
+ 'किसी',
+ 'किसे',
+ 'की',
+ 'कुछ',
+ 'कुल',
+ 'के',
+ 'को',
+ 'कोइ',
+ 'कोई',
+ 'कोन',
+ 'कोनसा',
+ 'कौन',
+ 'कौनसा',
+ 'गया',
+ 'घर',
+ 'जब',
+ 'जहाँ',
+ 'जहां',
+ 'जा',
+ 'जिंहें',
+ 'जिंहों',
+ 'जितना',
+ 'जिधर',
+ 'जिन',
+ 'जिन्हें',
+ 'जिन्हों',
+ 'जिस',
+ 'जिसे',
+ 'जीधर',
+ 'जेसा',
+ 'जेसे',
+ 'जैसा',
+ 'जैसे',
+ 'जो',
+ 'तक',
+ 'तब',
+ 'तरह',
+ 'तिंहें',
+ 'तिंहों',
+ 'तिन',
+ 'तिन्हें',
+ 'तिन्हों',
+ 'तिस',
+ 'तिसे',
+ 'तो',
+ 'था',
+ 'थि',
+ 'थी',
+ 'थे',
+ 'दबारा',
+ 'दवारा',
+ 'दिया',
+ 'दुसरा',
+ 'दुसरे',
+ 'दूसरे',
+ 'दो',
+ 'द्वारा',
+ 'न',
+ 'नहिं',
+ 'नहीं',
+ 'ना',
+ 'निचे',
+ 'निहायत',
+ 'नीचे',
+ 'ने',
+ 'पर',
+ 'पहले',
+ 'पुरा',
+ 'पूरा',
+ 'पे',
+ 'फिर',
+ 'बनि',
+ 'बनी',
+ 'बहि',
+ 'बही',
+ 'बहुत',
+ 'बाद',
+ 'बाला',
+ 'बिलकुल',
+ 'भि',
+ 'भितर',
+ 'भी',
+ 'भीतर',
+ 'मगर',
+ 'मानो',
+ 'मे',
+ 'में',
+ 'यदि',
+ 'यह',
+ 'यहाँ',
+ 'यहां',
+ 'यहि',
+ 'यही',
+ 'या',
+ 'यिह',
+ 'ये',
+ 'रखें',
+ 'रवासा',
+ 'रहा',
+ 'रहे',
+ 'ऱ्वासा',
+ 'लिए',
+ 'लिये',
+ 'लेकिन',
+ 'व',
+ 'वगेरह',
+ 'वरग',
+ 'वर्ग',
+ 'वह',
+ 'वहाँ',
+ 'वहां',
+ 'वहिं',
+ 'वहीं',
+ 'वाले',
+ 'वुह',
+ 'वे',
+ 'वग़ैरह',
+ 'संग',
+ 'सकता',
+ 'सकते',
+ 'सबसे',
+ 'सभि',
+ 'सभी',
+ 'साथ',
+ 'साबुत',
+ 'साभ',
+ 'सारा',
+ 'से',
+ 'सो',
+ 'हि',
+ 'ही',
+ 'हुअ',
+ 'हुआ',
+ 'हुइ',
+ 'हुई',
+ 'हुए',
+ 'हे',
+ 'हें',
+ 'है',
+ 'हैं',
+ 'हो',
+ 'होता',
+ 'होति',
+ 'होती',
+ 'होते',
+ 'होना',
+ 'होने',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/hr.php b/vendor/voku/stop-words/src/voku/helper/stopwords/hr.php
new file mode 100644
index 000000000..98758bb0f
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/hr.php
@@ -0,0 +1,189 @@
+<?php
+
+// croatian
+
+static $data = [
+ 'a',
+ 'ako',
+ 'ali',
+ 'bi',
+ 'bih',
+ 'bila',
+ 'bili',
+ 'bilo',
+ 'bio',
+ 'bismo',
+ 'biste',
+ 'biti',
+ 'bumo',
+ 'da',
+ 'do',
+ 'duž',
+ 'ga',
+ 'hoće',
+ 'hoćemo',
+ 'hoćete',
+ 'hoćeš',
+ 'hoću',
+ 'i',
+ 'iako',
+ 'ih',
+ 'ili',
+ 'iz',
+ 'ja',
+ 'je',
+ 'jedna',
+ 'jedne',
+ 'jedno',
+ 'jer',
+ 'jesam',
+ 'jesi',
+ 'jesmo',
+ 'jest',
+ 'jeste',
+ 'jesu',
+ 'jim',
+ 'joj',
+ 'još',
+ 'ju',
+ 'kada',
+ 'kako',
+ 'kao',
+ 'koja',
+ 'koje',
+ 'koji',
+ 'kojima',
+ 'koju',
+ 'kroz',
+ 'li',
+ 'me',
+ 'mene',
+ 'meni',
+ 'mi',
+ 'mimo',
+ 'moj',
+ 'moja',
+ 'moje',
+ 'mu',
+ 'na',
+ 'nad',
+ 'nakon',
+ 'nam',
+ 'nama',
+ 'nas',
+ 'naš',
+ 'naša',
+ 'naše',
+ 'našeg',
+ 'ne',
+ 'nego',
+ 'neka',
+ 'neki',
+ 'nekog',
+ 'neku',
+ 'nema',
+ 'netko',
+ 'neće',
+ 'nećemo',
+ 'nećete',
+ 'nećeš',
+ 'neću',
+ 'nešto',
+ 'ni',
+ 'nije',
+ 'nikoga',
+ 'nikoje',
+ 'nikoju',
+ 'nisam',
+ 'nisi',
+ 'nismo',
+ 'niste',
+ 'nisu',
+ 'njega',
+ 'njegov',
+ 'njegova',
+ 'njegovo',
+ 'njemu',
+ 'njezin',
+ 'njezina',
+ 'njezino',
+ 'njih',
+ 'njihov',
+ 'njihova',
+ 'njihovo',
+ 'njim',
+ 'njima',
+ 'njoj',
+ 'nju',
+ 'no',
+ 'o',
+ 'od',
+ 'odmah',
+ 'on',
+ 'ona',
+ 'oni',
+ 'ono',
+ 'ova',
+ 'pa',
+ 'pak',
+ 'po',
+ 'pod',
+ 'pored',
+ 'prije',
+ 's',
+ 'sa',
+ 'sam',
+ 'samo',
+ 'se',
+ 'sebe',
+ 'sebi',
+ 'si',
+ 'smo',
+ 'ste',
+ 'su',
+ 'sve',
+ 'svi',
+ 'svog',
+ 'svoj',
+ 'svoja',
+ 'svoje',
+ 'svom',
+ 'ta',
+ 'tada',
+ 'taj',
+ 'tako',
+ 'te',
+ 'tebe',
+ 'tebi',
+ 'ti',
+ 'to',
+ 'toj',
+ 'tome',
+ 'tu',
+ 'tvoj',
+ 'tvoja',
+ 'tvoje',
+ 'u',
+ 'uz',
+ 'vam',
+ 'vama',
+ 'vas',
+ 'vaš',
+ 'vaša',
+ 'vaše',
+ 'već',
+ 'vi',
+ 'vrlo',
+ 'za',
+ 'zar',
+ 'će',
+ 'ćemo',
+ 'ćete',
+ 'ćeš',
+ 'ću',
+ 'što',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/hu.php b/vendor/voku/stop-words/src/voku/helper/stopwords/hu.php
new file mode 100644
index 000000000..596d8c7d2
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/hu.php
@@ -0,0 +1,209 @@
+<?php
+
+// hungarian
+
+static $data = [
+ 'a',
+ 'ahogy',
+ 'ahol',
+ 'aki',
+ 'akik',
+ 'akkor',
+ 'alatt',
+ 'által',
+ 'általában',
+ 'amely',
+ 'amelyek',
+ 'amelyekben',
+ 'amelyeket',
+ 'amelyet',
+ 'amelynek',
+ 'ami',
+ 'amit',
+ 'amolyan',
+ 'amíg',
+ 'amikor',
+ 'át',
+ 'abban',
+ 'ahhoz',
+ 'annak',
+ 'arra',
+ 'arról',
+ 'az',
+ 'azok',
+ 'azon',
+ 'azt',
+ 'azzal',
+ 'azért',
+ 'aztán',
+ 'azután',
+ 'azonban',
+ 'bár',
+ 'be',
+ 'belül',
+ 'benne',
+ 'cikk',
+ 'cikkek',
+ 'cikkeket',
+ 'csak',
+ 'de',
+ 'e',
+ 'eddig',
+ 'egész',
+ 'egy',
+ 'egyes',
+ 'egyetlen',
+ 'egyéb',
+ 'egyik',
+ 'egyre',
+ 'ekkor',
+ 'el',
+ 'elég',
+ 'ellen',
+ 'elõ',
+ 'elõször',
+ 'elõtt',
+ 'elsõ',
+ 'én',
+ 'éppen',
+ 'ebben',
+ 'ehhez',
+ 'emilyen',
+ 'ennek',
+ 'erre',
+ 'ez',
+ 'ezt',
+ 'ezek',
+ 'ezen',
+ 'ezzel',
+ 'ezért',
+ 'és',
+ 'fel',
+ 'felé',
+ 'hanem',
+ 'hiszen',
+ 'hogy',
+ 'hogyan',
+ 'igen',
+ 'így',
+ 'illetve',
+ 'ill.',
+ 'ill',
+ 'ilyen',
+ 'ilyenkor',
+ 'ison',
+ 'ismét',
+ 'itt',
+ 'jó',
+ 'jól',
+ 'jobban',
+ 'kell',
+ 'kellett',
+ 'keresztül',
+ 'keressünk',
+ 'ki',
+ 'kívül',
+ 'között',
+ 'közül',
+ 'legalább',
+ 'lehet',
+ 'lehetett',
+ 'legyen',
+ 'lenne',
+ 'lenni',
+ 'lesz',
+ 'lett',
+ 'maga',
+ 'magát',
+ 'majd',
+ 'majd',
+ 'már',
+ 'más',
+ 'másik',
+ 'meg',
+ 'még',
+ 'mellett',
+ 'mert',
+ 'mely',
+ 'melyek',
+ 'mi',
+ 'mit',
+ 'míg',
+ 'miért',
+ 'milyen',
+ 'mikor',
+ 'minden',
+ 'mindent',
+ 'mindenki',
+ 'mindig',
+ 'mint',
+ 'mintha',
+ 'mivel',
+ 'most',
+ 'nagy',
+ 'nagyobb',
+ 'nagyon',
+ 'ne',
+ 'néha',
+ 'nekem',
+ 'neki',
+ 'nem',
+ 'néhány',
+ 'nélkül',
+ 'nincs',
+ 'olyan',
+ 'ott',
+ 'össze',
+ 'õ',
+ 'õk',
+ 'õket',
+ 'pedig',
+ 'persze',
+ 'rá',
+ 's',
+ 'saját',
+ 'sem',
+ 'semmi',
+ 'sok',
+ 'sokat',
+ 'sokkal',
+ 'számára',
+ 'szemben',
+ 'szerint',
+ 'szinte',
+ 'talán',
+ 'tehát',
+ 'teljes',
+ 'tovább',
+ 'továbbá',
+ 'több',
+ 'úgy',
+ 'ugyanis',
+ 'új',
+ 'újabb',
+ 'újra',
+ 'után',
+ 'utána',
+ 'utolsó',
+ 'vagy',
+ 'vagyis',
+ 'valaki',
+ 'valami',
+ 'valamint',
+ 'való',
+ 'vagyok',
+ 'van',
+ 'vannak',
+ 'volt',
+ 'voltam',
+ 'voltak',
+ 'voltunk',
+ 'vissza',
+ 'vele',
+ 'viszont',
+ 'volna',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/id.php b/vendor/voku/stop-words/src/voku/helper/stopwords/id.php
new file mode 100644
index 000000000..6e4ef1781
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/id.php
@@ -0,0 +1,367 @@
+<?php
+
+// indonesian
+
+static $data = [
+ 'ada',
+ 'adanya',
+ 'adalah',
+ 'adapun',
+ 'agak',
+ 'agaknya',
+ 'agar',
+ 'akan',
+ 'akankah',
+ 'akhirnya',
+ 'aku',
+ 'akulah',
+ 'amat',
+ 'amatlah',
+ 'anda',
+ 'andalah',
+ 'antar',
+ 'diantaranya',
+ 'antara',
+ 'antaranya',
+ 'diantara',
+ 'apa',
+ 'apaan',
+ 'mengapa',
+ 'apabila',
+ 'apakah',
+ 'apalagi',
+ 'apatah',
+ 'atau',
+ 'ataukah',
+ 'ataupun',
+ 'bagai',
+ 'bagaikan',
+ 'sebagai',
+ 'sebagainya',
+ 'bagaimana',
+ 'bagaimanapun',
+ 'sebagaimana',
+ 'bagaimanakah',
+ 'bagi',
+ 'bahkan',
+ 'bahwa',
+ 'bahwasanya',
+ 'sebaliknya',
+ 'banyak',
+ 'sebanyak',
+ 'beberapa',
+ 'seberapa',
+ 'begini',
+ 'beginian',
+ 'beginikah',
+ 'beginilah',
+ 'sebegini',
+ 'begitu',
+ 'begitukah',
+ 'begitulah',
+ 'begitupun',
+ 'sebegitu',
+ 'belum',
+ 'belumlah',
+ 'sebelum',
+ 'sebelumnya',
+ 'sebenarnya',
+ 'berapa',
+ 'berapakah',
+ 'berapalah',
+ 'berapapun',
+ 'betulkah',
+ 'sebetulnya',
+ 'biasa',
+ 'biasanya',
+ 'bila',
+ 'bilakah',
+ 'bisa',
+ 'bisakah',
+ 'sebisanya',
+ 'boleh',
+ 'bolehkah',
+ 'bolehlah',
+ 'buat',
+ 'bukan',
+ 'bukankah',
+ 'bukanlah',
+ 'bukannya',
+ 'cuma',
+ 'percuma',
+ 'dahulu',
+ 'dalam',
+ 'dan',
+ 'dapat',
+ 'dari',
+ 'daripada',
+ 'dekat',
+ 'demi',
+ 'demikian',
+ 'demikianlah',
+ 'sedemikian',
+ 'dengan',
+ 'depan',
+ 'di',
+ 'dia',
+ 'dialah',
+ 'dini',
+ 'diri',
+ 'dirinya',
+ 'terdiri',
+ 'dong',
+ 'dulu',
+ 'enggak',
+ 'enggaknya',
+ 'entah',
+ 'entahlah',
+ 'terhadap',
+ 'terhadapnya',
+ 'hal',
+ 'hampir',
+ 'hanya',
+ 'hanyalah',
+ 'harus',
+ 'haruslah',
+ 'harusnya',
+ 'seharusnya',
+ 'hendak',
+ 'hendaklah',
+ 'hendaknya',
+ 'hingga',
+ 'sehingga',
+ 'ia',
+ 'ialah',
+ 'ibarat',
+ 'ingin',
+ 'inginkah',
+ 'inginkan',
+ 'ini',
+ 'inikah',
+ 'inilah',
+ 'itu',
+ 'itukah',
+ 'itulah',
+ 'jangan',
+ 'jangankan',
+ 'janganlah',
+ 'jika',
+ 'jikalau',
+ 'juga',
+ 'justru',
+ 'kala',
+ 'kalau',
+ 'kalaulah',
+ 'kalaupun',
+ 'kalian',
+ 'kami',
+ 'kamilah',
+ 'kamu',
+ 'kamulah',
+ 'kan',
+ 'kapan',
+ 'kapankah',
+ 'kapanpun',
+ 'dikarenakan',
+ 'karena',
+ 'karenanya',
+ 'ke',
+ 'kecil',
+ 'kemudian',
+ 'kenapa',
+ 'kepada',
+ 'kepadanya',
+ 'ketika',
+ 'seketika',
+ 'khususnya',
+ 'kini',
+ 'kinilah',
+ 'kiranya',
+ 'sekiranya',
+ 'kita',
+ 'kitalah',
+ 'kok',
+ 'lagi',
+ 'lagian',
+ 'selagi',
+ 'lah',
+ 'lain',
+ 'lainnya',
+ 'melainkan',
+ 'selaku',
+ 'lalu',
+ 'melalui',
+ 'terlalu',
+ 'lama',
+ 'lamanya',
+ 'selama',
+ 'selama',
+ 'selamanya',
+ 'lebih',
+ 'terlebih',
+ 'bermacam',
+ 'macam',
+ 'semacam',
+ 'maka',
+ 'makanya',
+ 'makin',
+ 'malah',
+ 'malahan',
+ 'mampu',
+ 'mampukah',
+ 'mana',
+ 'manakala',
+ 'manalagi',
+ 'masih',
+ 'masihkah',
+ 'semasih',
+ 'masing',
+ 'mau',
+ 'maupun',
+ 'semaunya',
+ 'memang',
+ 'mereka',
+ 'merekalah',
+ 'meski',
+ 'meskipun',
+ 'semula',
+ 'mungkin',
+ 'mungkinkah',
+ 'nah',
+ 'namun',
+ 'nanti',
+ 'nantinya',
+ 'nyaris',
+ 'oleh',
+ 'olehnya',
+ 'seorang',
+ 'seseorang',
+ 'pada',
+ 'padanya',
+ 'padahal',
+ 'paling',
+ 'sepanjang',
+ 'pantas',
+ 'sepantasnya',
+ 'sepantasnyalah',
+ 'para',
+ 'pasti',
+ 'pastilah',
+ 'per',
+ 'pernah',
+ 'pula',
+ 'pun',
+ 'merupakan',
+ 'rupanya',
+ 'serupa',
+ 'saat',
+ 'saatnya',
+ 'sesaat',
+ 'saja',
+ 'sajalah',
+ 'saling',
+ 'bersama',
+ 'sama',
+ 'sesama',
+ 'sambil',
+ 'sampai',
+ 'sana',
+ 'sangat',
+ 'sangatlah',
+ 'saya',
+ 'sayalah',
+ 'se',
+ 'sebab',
+ 'sebabnya',
+ 'sebuah',
+ 'tersebut',
+ 'tersebutlah',
+ 'sedang',
+ 'sedangkan',
+ 'sedikit',
+ 'sedikitnya',
+ 'segala',
+ 'segalanya',
+ 'segera',
+ 'sesegera',
+ 'sejak',
+ 'sejenak',
+ 'sekali',
+ 'sekalian',
+ 'sekalipun',
+ 'sesekali',
+ 'sekaligus',
+ 'sekarang',
+ 'sekarang',
+ 'sekitar',
+ 'sekitarnya',
+ 'sela',
+ 'selain',
+ 'selalu',
+ 'seluruh',
+ 'seluruhnya',
+ 'semakin',
+ 'sementara',
+ 'sempat',
+ 'semua',
+ 'semuanya',
+ 'sendiri',
+ 'sendirinya',
+ 'seolah',
+ 'seperti',
+ 'sepertinya',
+ 'sering',
+ 'seringnya',
+ 'serta',
+ 'siapa',
+ 'siapakah',
+ 'siapapun',
+ 'disini',
+ 'disinilah',
+ 'sini',
+ 'sinilah',
+ 'sesuatu',
+ 'sesuatunya',
+ 'suatu',
+ 'sesudah',
+ 'sesudahnya',
+ 'sudah',
+ 'sudahkah',
+ 'sudahlah',
+ 'supaya',
+ 'tadi',
+ 'tadinya',
+ 'tak',
+ 'tanpa',
+ 'setelah',
+ 'telah',
+ 'tentang',
+ 'tentu',
+ 'tentulah',
+ 'tentunya',
+ 'tertentu',
+ 'seterusnya',
+ 'tapi',
+ 'tetapi',
+ 'setiap',
+ 'tiap',
+ 'setidaknya',
+ 'tidak',
+ 'tidakkah',
+ 'tidaklah',
+ 'toh',
+ 'waduh',
+ 'wah',
+ 'wahai',
+ 'sewaktu',
+ 'walau',
+ 'walaupun',
+ 'wong',
+ 'yaitu',
+ 'yakni',
+ 'yang',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/it.php b/vendor/voku/stop-words/src/voku/helper/stopwords/it.php
new file mode 100644
index 000000000..1f7781ae6
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/it.php
@@ -0,0 +1,290 @@
+<?php
+
+// italian
+
+static $data = [
+ 'ad',
+ 'al',
+ 'allo',
+ 'ai',
+ 'agli',
+ 'all',
+ 'agl',
+ 'alla',
+ 'alle',
+ 'con',
+ 'col',
+ 'coi',
+ 'da',
+ 'dal',
+ 'dallo',
+ 'dai',
+ 'dagli',
+ 'dall',
+ 'dagl',
+ 'dalla',
+ 'dalle',
+ 'di',
+ 'del',
+ 'dello',
+ 'dei',
+ 'degli',
+ 'dell',
+ 'degl',
+ 'della',
+ 'delle',
+ 'in',
+ 'nel',
+ 'nello',
+ 'nei',
+ 'negli',
+ 'nell',
+ 'negl',
+ 'nella',
+ 'nelle',
+ 'su',
+ 'sul',
+ 'sullo',
+ 'sui',
+ 'sugli',
+ 'sull',
+ 'sugl',
+ 'sulla',
+ 'sulle',
+ 'per',
+ 'tra',
+ 'contro',
+ 'io',
+ 'tu',
+ 'lui',
+ 'lei',
+ 'noi',
+ 'voi',
+ 'loro',
+ 'mio',
+ 'mia',
+ 'miei',
+ 'mie',
+ 'tuo',
+ 'tua',
+ 'tuoi',
+ 'tue',
+ 'suo',
+ 'sua',
+ 'suoi',
+ 'sue',
+ 'nostro',
+ 'nostra',
+ 'nostri',
+ 'nostre',
+ 'vostro',
+ 'vostra',
+ 'vostri',
+ 'vostre',
+ 'mi',
+ 'ti',
+ 'ci',
+ 'vi',
+ 'lo',
+ 'la',
+ 'li',
+ 'le',
+ 'gli',
+ 'ne',
+ 'il',
+ 'un',
+ 'uno',
+ 'una',
+ 'ma',
+ 'ed',
+ 'se',
+ 'perché',
+ 'anche',
+ 'come',
+ 'dov',
+ 'dove',
+ 'che',
+ 'chi',
+ 'cui',
+ 'non',
+ 'più',
+ 'quale',
+ 'quanto',
+ 'quanti',
+ 'quanta',
+ 'quante',
+ 'quello',
+ 'quelli',
+ 'quella',
+ 'quelle',
+ 'questo',
+ 'questi',
+ 'questa',
+ 'queste',
+ 'si',
+ 'tutto',
+ 'tutti',
+ 'a',
+ 'c',
+ 'e',
+ 'i',
+ 'l',
+ 'o',
+ 'ho',
+ 'hai',
+ 'ha',
+ 'abbiamo',
+ 'avete',
+ 'hanno',
+ 'abbia',
+ 'abbiate',
+ 'abbiano',
+ 'avrò',
+ 'avrai',
+ 'avrà',
+ 'avremo',
+ 'avrete',
+ 'avranno',
+ 'avrei',
+ 'avresti',
+ 'avrebbe',
+ 'avremmo',
+ 'avreste',
+ 'avrebbero',
+ 'avevo',
+ 'avevi',
+ 'aveva',
+ 'avevamo',
+ 'avevate',
+ 'avevano',
+ 'ebbi',
+ 'avesti',
+ 'ebbe',
+ 'avemmo',
+ 'aveste',
+ 'ebbero',
+ 'avessi',
+ 'avesse',
+ 'avessimo',
+ 'avessero',
+ 'avendo',
+ 'avuto',
+ 'avuta',
+ 'avuti',
+ 'avute',
+ 'sono',
+ 'sei',
+ 'è',
+ 'siamo',
+ 'siete',
+ 'sia',
+ 'siate',
+ 'siano',
+ 'sarò',
+ 'sarai',
+ 'sarà',
+ 'saremo',
+ 'sarete',
+ 'saranno',
+ 'sarei',
+ 'saresti',
+ 'sarebbe',
+ 'saremmo',
+ 'sareste',
+ 'sarebbero',
+ 'ero',
+ 'eri',
+ 'era',
+ 'eravamo',
+ 'eravate',
+ 'erano',
+ 'fui',
+ 'fosti',
+ 'fu',
+ 'fummo',
+ 'foste',
+ 'furono',
+ 'fossi',
+ 'fosse',
+ 'fossimo',
+ 'fossero',
+ 'essendo',
+ 'faccio',
+ 'fai',
+ 'facciamo',
+ 'fanno',
+ 'faccia',
+ 'facciate',
+ 'facciano',
+ 'farò',
+ 'farai',
+ 'farà',
+ 'faremo',
+ 'farete',
+ 'faranno',
+ 'farei',
+ 'faresti',
+ 'farebbe',
+ 'faremmo',
+ 'fareste',
+ 'farebbero',
+ 'facevo',
+ 'facevi',
+ 'faceva',
+ 'facevamo',
+ 'facevate',
+ 'facevano',
+ 'feci',
+ 'facesti',
+ 'fece',
+ 'facemmo',
+ 'faceste',
+ 'fecero',
+ 'facessi',
+ 'facesse',
+ 'facessimo',
+ 'facessero',
+ 'facendo',
+ 'sto',
+ 'stai',
+ 'sta',
+ 'stiamo',
+ 'stanno',
+ 'stia',
+ 'stiate',
+ 'stiano',
+ 'starò',
+ 'starai',
+ 'starà',
+ 'staremo',
+ 'starete',
+ 'staranno',
+ 'starei',
+ 'staresti',
+ 'starebbe',
+ 'staremmo',
+ 'stareste',
+ 'starebbero',
+ 'stavo',
+ 'stavi',
+ 'stava',
+ 'stavamo',
+ 'stavate',
+ 'stavano',
+ 'stetti',
+ 'stesti',
+ 'stette',
+ 'stemmo',
+ 'steste',
+ 'stettero',
+ 'stessi',
+ 'stesse',
+ 'stessimo',
+ 'stessero',
+ 'stando',
+];
+
+$result =& $data;
+unset($data);
+return $result;
+
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/ka.php b/vendor/voku/stop-words/src/voku/helper/stopwords/ka.php
new file mode 100644
index 000000000..39d4ec97d
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/ka.php
@@ -0,0 +1,383 @@
+<?php
+
+// georgian
+
+static $data = [
+ 'ა.შ.',
+ 'აგერ',
+ 'აგრეთვე',
+ 'ალბათ',
+ 'ამაზე',
+ 'ამას',
+ 'ამასთან',
+ 'ამასთანავე',
+ 'ამგვარად',
+ 'ამდენად',
+ 'ამით',
+ 'ამის',
+ 'ამისთვის',
+ 'ამიტომ',
+ 'ამიტომაც',
+ 'ამჟამად',
+ 'ამჯერად',
+ 'ან',
+ 'ანუ',
+ 'არ',
+ 'არა',
+ 'არადა',
+ 'არათუ',
+ 'არამარტო',
+ 'არამედ',
+ 'არამხოლოდ',
+ 'არანაკლებ',
+ 'არასოდეს',
+ 'არაუადრეს',
+ 'არაუგვიანეს',
+ 'არაუმეტეს',
+ 'არსად',
+ 'არსაიდან',
+ 'არც',
+ 'არცერთ',
+ 'ასევე',
+ 'ასეც',
+ 'აქამდე',
+ 'აღარ',
+ 'აღარც',
+ 'ბოლოს',
+ 'ბოლოსკენ',
+ 'გამო',
+ 'გამუდმებით',
+ 'განსაკუთრებით',
+ 'გარდა',
+ 'გარეშე',
+ 'და',
+ 'დასასრულს',
+ 'დასაწყისში',
+ 'დროულად',
+ 'ე.ი.',
+ 'ე.წ.',
+ 'ეგებ',
+ 'ერთადერთი',
+ 'ერთადერთმა',
+ 'ერთ-ერთი',
+ 'ერთხელ',
+ 'ესოდე',
+ 'ვერ',
+ 'ვითომ',
+ 'ვინაიდან',
+ 'ვინძლო',
+ 'ვისაც',
+ 'ზემოაღნიშნულმა',
+ 'ზოგჯერ',
+ 'თავად',
+ 'თავადაც',
+ 'თავადვე',
+ 'თავდაპირველად',
+ 'თავიდანვე',
+ 'თავის მხრივ',
+ 'თან',
+ 'თანაც',
+ 'თანახმადაც',
+ 'თანდათან',
+ 'თვით',
+ 'თვითონ',
+ 'თვითონაც',
+ 'თვითონვე',
+ 'თითოეულმა',
+ 'თითქოს',
+ 'თუ',
+ 'თუკი',
+ 'თუმცა',
+ 'თუმცაღა',
+ 'თუნდაც',
+ 'იმავდროულად',
+ 'იმავე',
+ 'იმან',
+ 'იმას',
+ 'იმდენად',
+ 'იმთავითვე',
+ 'იმით',
+ 'იმის',
+ 'იმისთვის',
+ 'იმიტომ',
+ 'ისევე',
+ 'ისეთი',
+ 'ისეც',
+ 'იშვიათად',
+ 'კერძოდ',
+ 'კვლავ',
+ 'კი',
+ 'კიდევ',
+ 'მაგალითად',
+ 'მაგან',
+ 'მაგას',
+ 'მაგით',
+ 'მაგის',
+ 'მაგრამ',
+ 'მათი',
+ 'მაინც',
+ 'მანამ',
+ 'მანამდე',
+ 'მართალია',
+ 'მარტო',
+ 'მაშასადამე',
+ 'მაშინ',
+ 'მაშინვე',
+ 'მერე',
+ 'მეტად',
+ 'მთელი',
+ 'მიერ',
+ 'მით',
+ 'მიმართ',
+ 'მისივე',
+ 'მსგავსი',
+ 'მხოლოდ',
+ 'ნაწილობრივ',
+ 'ნეტავ',
+ 'ნეტავი',
+ 'ნუ',
+ 'ნურასოდეს',
+ 'ნურც',
+ 'ნუღარ',
+ 'ნუღარც',
+ 'ოდენ',
+ 'ოდესღაც',
+ 'ოღონდ',
+ 'პირველი',
+ 'პირიქით',
+ 'პრინციპში',
+ 'რადგან',
+ 'რადგანაც',
+ 'რათა',
+ 'რაკი',
+ 'რამდენად',
+ 'რამდენადაც',
+ 'რამეთუ',
+ 'რამენაირად',
+ 'რამეფრად',
+ 'რანაირადაც',
+ 'რასაკვირველია',
+ 'რასაც',
+ 'რაღაც',
+ 'რაც',
+ 'რითაც',
+ 'რისთვისაც',
+ 'როგორადაც',
+ 'როგორიც',
+ 'როგორიცაა',
+ 'როგორღაც',
+ 'როგორც',
+ 'როდესაც',
+ 'როდესღაც',
+ 'რომ',
+ 'რომელიმე',
+ 'რომელიც',
+ 'რომელსაც',
+ 'რომლებიც',
+ 'რომლითაც',
+ 'რომლის',
+ 'როცა',
+ 'საბოლოოდ',
+ 'სადაც',
+ 'სადღაც',
+ 'საერთოდ',
+ 'სათანადოდ',
+ 'საიდანაც',
+ 'სამომავლოდ',
+ 'სანამ',
+ 'სანამდე',
+ 'სრულად',
+ 'სულ',
+ 'სწორედ',
+ 'სხვადასხვა',
+ 'სხვები',
+ 'უკვე',
+ 'უნდა',
+ 'უსათუოდ',
+ 'უფრო',
+ 'უცებ',
+ 'უცნაურად',
+ 'ფაქტობრივად',
+ 'ყველა',
+ 'ყოველგვარი',
+ 'ყოველთვის',
+ 'ყოველი',
+ 'ყოველივე',
+ 'შედარებით',
+ 'შედეგად',
+ 'შემდგომ',
+ 'შემდგომში',
+ 'შემდეგ',
+ 'შესახებ',
+ 'შორის',
+ 'ჩვეულებრივ',
+ 'წინააღმდეგ',
+ 'წინაშე',
+ 'ხან',
+ 'ხოლმე',
+ 'ხოლო',
+ 'ხშირად',
+ 'ჯერაც',
+ 'ჯერჯერობით',
+ 'ამის გარდა',
+ 'ამის გარეშე',
+ 'ამის მიუხედავად',
+ 'ამასთან ერთად',
+ 'ამის მიხედვით',
+ 'ამის ნაცვლად',
+ 'ამის პასუხად',
+ 'ამასთან შედარებით',
+ 'ამბობს, რომ',
+ 'ამ დროს',
+ 'ამ თემაზე',
+ 'ამ მიზნით',
+ 'ამის საპირისპიროდ',
+ 'ამის გამო',
+ 'ამ მხრივ',
+ 'ამის უარსაყოფად',
+ 'ამის შედეგად',
+ 'ამ შემთხვევაში',
+ 'ამავე დროს',
+ 'ამას გარდა',
+ 'ამასთან დაკავშირებით',
+ 'ამის შემდეგ',
+ 'ამის შესაბამისად',
+ 'ამის შესახებ',
+ 'ამისგან განსხვავებით',
+ 'არა მარტო',
+ 'არა მხოლოდ',
+ 'არა უადრეს',
+ 'არა უგვიანეს',
+ 'არც ერთი',
+ 'არც კი',
+ 'არც მეორე',
+ 'ასე ვთქვათ',
+ 'ასე მაგალითად',
+ 'ასე რომ',
+ 'ასე შემდეგ',
+ 'ასევე განიხილავს',
+ 'აქედან გამომდინარე',
+ 'აქედან დასკვნა',
+ 'აღნიშნა რომ',
+ 'აღნიშნულთან დაკავშირებით',
+ 'აცხადებს რომ',
+ 'ბოლო ერთი',
+ 'ბოლო პერიოდში',
+ 'ბოლო წლებში',
+ 'გამოთქვა იმედი',
+ 'განაცხადა, რომ',
+ 'განმარტა, რომ',
+ 'გარდა ამისა',
+ 'გარშემო არსებული',
+ 'და სხვ.',
+ 'და სხვა',
+ 'დაადასტურა, რომ',
+ 'ეგრეთ წოდებული',
+ 'ეგრეთ წოდებულმა',
+ 'ერთი თვალსაზრისით',
+ 'ერთი მხრივ',
+ 'ერთის მხრივ',
+ 'ეს კი',
+ 'ესე იგი',
+ 'ვიდრე არ',
+ 'თავიდან ბოლომდე',
+ 'თუ რამდენად',
+ 'თუ როგორ',
+ 'იგივეა რაც',
+ 'იმ შემთხვევაში',
+ 'იმაზე მეტი',
+ 'იმაზე, რომ',
+ 'იმას, რომ',
+ 'იმასთან დაკავშირებით',
+ 'იმდენად რამდენადაც',
+ 'იმედი გამოთქვა',
+ 'იმის გამო',
+ 'იმის თაობაზე',
+ 'იმის საწინააღმდეგოდ',
+ 'იმისათვის, რომ',
+ 'იმისთვის, რათა',
+ 'იმისთვის, რომ',
+ 'იმიტომ, რომ',
+ 'ის, რომელიც',
+ 'ისე როგორც',
+ 'ისე, რომ',
+ 'ისევე როგორც',
+ 'ისეთი როგორიც',
+ 'იქიდან გამომდინარე',
+ 'კიდევ ერთხელ',
+ 'მაგრამ თუ',
+ 'მათ შორის',
+ 'მათი ვარაუდით',
+ 'მანამ, სანამ',
+ 'მას შემდეგ',
+ 'მაშინ, როცა',
+ 'მაშინაც კი',
+ 'მეორე მხრივ',
+ 'მეორეც ერთი',
+ 'მერე მეორე',
+ 'მით უფრო',
+ 'მიიჩნევს, რომ',
+ 'მისი განმარტებით',
+ 'მისი თქმით',
+ 'მისივე თქმით',
+ 'მიუხედავად ამისა',
+ 'ნურც კი',
+ 'პირველ რიგში',
+ 'რა დროსაც',
+ 'რა მიზეზითაც',
+ 'რაც შეეხება',
+ 'რაც შეიძლება',
+ 'რის გამოც',
+ 'რის საფუძველზედაც',
+ 'რის საფუძველზეც',
+ 'რის შედეგადაც',
+ 'რის შემდეგაც',
+ 'როგორც კი',
+ 'რომ არა',
+ 'რომ თუ',
+ 'რომელთა გამოც',
+ 'რომლის თანახმად',
+ 'რომლის თანახმადაც',
+ 'რომლის მიხედვითაც',
+ 'რომლის შესახებ',
+ 'საკითხთან დაკავშირებით',
+ 'სულ მცირე',
+ 'სულ ცოტა',
+ 'სხვა კუთხით',
+ 'სხვა მხრივ',
+ 'სხვა რამ',
+ 'სხვათა შორის',
+ 'უფრო მეტიც',
+ 'ყოველივე ეს',
+ 'შემდეგ უკვე',
+ 'ჩვენი განცხადებით',
+ 'ჯერ ერთი',
+ 'ჯერ კიდევ',
+ 'ამ ბოლო დროს',
+ 'ამა თუ იმ',
+ 'ასე თუ ისე',
+ 'აქედან ჩანს, რომ',
+ 'ბოლოს და ბოლოს',
+ 'გამომდინარე იქიდან, რომ',
+ 'და ასე შემდეგ',
+ 'ვინაიდან და რადგანაც',
+ 'თუ რის საფუძველზე',
+ 'იმის გათვალისწინებით, რომ',
+ 'იმის გამო, რომ',
+ 'იმის ნაცვლად, რომ',
+ 'ისევ და ისევ',
+ 'იქვე აღნიშნა, რომ',
+ 'იქიდან გამომდინარე, რომ',
+ 'კიდევ და კიდევ',
+ 'მაინც და მაინც',
+ 'მას შემდეგ, რაც',
+ 'მიუხედავად იმისა, თუ',
+ 'მიუხედავად იმისა, რომ',
+ 'როგორც უკვე ითქვა',
+ 'როდის და რატომ',
+ 'უფრო და უფრო',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/lt.php b/vendor/voku/stop-words/src/voku/helper/stopwords/lt.php
new file mode 100644
index 000000000..3b707ce61
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/lt.php
@@ -0,0 +1,484 @@
+<?php
+
+// lithuanian
+
+static $data = [
+ 'abi',
+ 'abidvi',
+ 'abiejose',
+ 'abiejuose',
+ 'abiejø',
+ 'abiem',
+ 'abigaliai',
+ 'abipus',
+ 'abu',
+ 'abudu',
+ 'ai',
+ 'ana',
+ 'anaiptol',
+ 'anaisiais',
+ 'anajai',
+ 'anajam',
+ 'anajame',
+ 'anapus',
+ 'anas',
+ 'anasai',
+ 'anasis',
+ 'anei',
+ 'aniedvi',
+ 'anieji',
+ 'aniesiems',
+ 'anoji',
+ 'anojo',
+ 'anojoje',
+ 'anokia',
+ 'anoks',
+ 'anosiomis',
+ 'anosioms',
+ 'anosios',
+ 'anosiose',
+ 'anot',
+ 'ant',
+ 'antai',
+ 'anuodu',
+ 'anuoju',
+ 'anuosiuose',
+ 'anuosius',
+ 'anàja',
+ 'anàjà',
+ 'anàjá',
+ 'anàsias',
+ 'anøjø',
+ 'apie',
+ 'aplink',
+ 'ar',
+ 'arba',
+ 'argi',
+ 'arti',
+ 'aukðèiau',
+ 'að',
+ 'be',
+ 'bei',
+ 'beje',
+ 'bemaþ',
+ 'bent',
+ 'bet',
+ 'betgi',
+ 'beveik',
+ 'dar',
+ 'dargi',
+ 'daugmaþ',
+ 'deja',
+ 'dëka',
+ 'dël',
+ 'dëlei',
+ 'dëlto',
+ 'ech',
+ 'et',
+ 'gal',
+ 'galbût',
+ 'galgi',
+ 'gan',
+ 'gana',
+ 'gi',
+ 'greta',
+ 'idant',
+ 'iki',
+ 'ir',
+ 'irgi',
+ 'it',
+ 'itin',
+ 'ið',
+ 'iðilgai',
+ 'iðvis',
+ 'jaisiais',
+ 'jajai',
+ 'jajam',
+ 'jajame',
+ 'jei',
+ 'jeigu',
+ 'ji',
+ 'jiedu',
+ 'jiedvi',
+ 'jieji',
+ 'jiesiems',
+ 'jinai',
+ 'jis',
+ 'jisai',
+ 'jog',
+ 'joji',
+ 'jojo',
+ 'jojoje',
+ 'jokia',
+ 'joks',
+ 'josiomis',
+ 'josioms',
+ 'josios',
+ 'josiose',
+ 'judu',
+ 'judvi',
+ 'juk',
+ 'jumis',
+ 'jums',
+ 'jumyse',
+ 'juodu',
+ 'juoju',
+ 'juosiuose',
+ 'juosius',
+ 'jus',
+ 'jàja',
+ 'jàjà',
+ 'jàsias',
+ 'jájá',
+ 'jøjø',
+ 'jûs',
+ 'jûsiðkis',
+ 'jûsiðkë',
+ 'jûsø',
+ 'kad',
+ 'kada',
+ 'kadangi',
+ 'kai',
+ 'kaip',
+ 'kaipgi',
+ 'kas',
+ 'katra',
+ 'katras',
+ 'katriedvi',
+ 'katruodu',
+ 'kaþin',
+ 'kaþkas',
+ 'kaþkatra',
+ 'kaþkatras',
+ 'kaþkokia',
+ 'kaþkoks',
+ 'kaþkuri',
+ 'kaþkuris',
+ 'kiaurai',
+ 'kiek',
+ 'kiekvienas',
+ 'kieno',
+ 'kita',
+ 'kitas',
+ 'kitokia',
+ 'kitoks',
+ 'kodël',
+ 'kokia',
+ 'koks',
+ 'kol',
+ 'kolei',
+ 'kone',
+ 'kuomet',
+ 'kur',
+ 'kurgi',
+ 'kuri',
+ 'kuriedvi',
+ 'kuris',
+ 'kuriuodu',
+ 'lai',
+ 'lig',
+ 'ligi',
+ 'link',
+ 'lyg',
+ 'man',
+ 'manaisiais',
+ 'manajai',
+ 'manajam',
+ 'manajame',
+ 'manas',
+ 'manasai',
+ 'manasis',
+ 'mane',
+ 'manieji',
+ 'maniesiems',
+ 'manim',
+ 'manimi',
+ 'maniðkis',
+ 'maniðkë',
+ 'mano',
+ 'manoji',
+ 'manojo',
+ 'manojoje',
+ 'manosiomis',
+ 'manosioms',
+ 'manosios',
+ 'manosiose',
+ 'manuoju',
+ 'manuosiuose',
+ 'manuosius',
+ 'manyje',
+ 'manàja',
+ 'manàjà',
+ 'manàjá',
+ 'manàsias',
+ 'manæs',
+ 'manøjø',
+ 'mat',
+ 'maþdaug',
+ 'maþne',
+ 'mes',
+ 'mudu',
+ 'mudvi',
+ 'mumis',
+ 'mums',
+ 'mumyse',
+ 'mus',
+ 'mûsiðkis',
+ 'mûsiðkë',
+ 'mûsø',
+ 'na',
+ 'nagi',
+ 'ne',
+ 'nebe',
+ 'nebent',
+ 'negi',
+ 'negu',
+ 'nei',
+ 'nejau',
+ 'nejaugi',
+ 'nekaip',
+ 'nelyginant',
+ 'nes',
+ 'net',
+ 'netgi',
+ 'netoli',
+ 'neva',
+ 'nors',
+ 'nuo',
+ 'në',
+ 'o',
+ 'ogi',
+ 'oi',
+ 'paeiliui',
+ 'pagal',
+ 'pakeliui',
+ 'palaipsniui',
+ 'palei',
+ 'pas',
+ 'pasak',
+ 'paskos',
+ 'paskui',
+ 'paskum',
+ 'pat',
+ 'pati',
+ 'patiems',
+ 'paties',
+ 'pats',
+ 'patys',
+ 'patá',
+ 'paèiais',
+ 'paèiam',
+ 'paèiame',
+ 'paèiu',
+ 'paèiuose',
+ 'paèius',
+ 'paèiø',
+ 'per',
+ 'pernelyg',
+ 'pirm',
+ 'pirma',
+ 'pirmiau',
+ 'po',
+ 'prie',
+ 'prieð',
+ 'prieðais',
+ 'pro',
+ 'pusiau',
+ 'rasi',
+ 'rodos',
+ 'sau',
+ 'savaisiais',
+ 'savajai',
+ 'savajam',
+ 'savajame',
+ 'savas',
+ 'savasai',
+ 'savasis',
+ 'save',
+ 'savieji',
+ 'saviesiems',
+ 'savimi',
+ 'saviðkis',
+ 'saviðkë',
+ 'savo',
+ 'savoji',
+ 'savojo',
+ 'savojoje',
+ 'savosiomis',
+ 'savosioms',
+ 'savosios',
+ 'savosiose',
+ 'savuoju',
+ 'savuosiuose',
+ 'savuosius',
+ 'savyje',
+ 'savàja',
+ 'savàjà',
+ 'savàjá',
+ 'savàsias',
+ 'savæs',
+ 'savøjø',
+ 'skersai',
+ 'skradþiai',
+ 'staèiai',
+ 'su',
+ 'sulig',
+ 'ta',
+ 'tad',
+ 'tai',
+ 'taigi',
+ 'taip',
+ 'taipogi',
+ 'taisiais',
+ 'tajai',
+ 'tajam',
+ 'tajame',
+ 'tamsta',
+ 'tarp',
+ 'tarsi',
+ 'tartum',
+ 'tarytum',
+ 'tas',
+ 'tasai',
+ 'tau',
+ 'tavaisiais',
+ 'tavajai',
+ 'tavajam',
+ 'tavajame',
+ 'tavas',
+ 'tavasai',
+ 'tavasis',
+ 'tave',
+ 'tavieji',
+ 'taviesiems',
+ 'tavimi',
+ 'taviðkis',
+ 'taviðkë',
+ 'tavo',
+ 'tavoji',
+ 'tavojo',
+ 'tavojoje',
+ 'tavosiomis',
+ 'tavosioms',
+ 'tavosios',
+ 'tavosiose',
+ 'tavuoju',
+ 'tavuosiuose',
+ 'tavuosius',
+ 'tavyje',
+ 'tavàja',
+ 'tavàjà',
+ 'tavàjá',
+ 'tavàsias',
+ 'tavæs',
+ 'tavøjø',
+ 'taèiau',
+ 'te',
+ 'tegu',
+ 'tegul',
+ 'tiedvi',
+ 'tieji',
+ 'ties',
+ 'tiesiems',
+ 'tiesiog',
+ 'tik',
+ 'tikriausiai',
+ 'tiktai',
+ 'toji',
+ 'tojo',
+ 'tojoje',
+ 'tokia',
+ 'toks',
+ 'tol',
+ 'tolei',
+ 'toliau',
+ 'tosiomis',
+ 'tosioms',
+ 'tosios',
+ 'tosiose',
+ 'tu',
+ 'tuodu',
+ 'tuoju',
+ 'tuosiuose',
+ 'tuosius',
+ 'turbût',
+ 'tàja',
+ 'tàjà',
+ 'tàjá',
+ 'tàsias',
+ 'tøjø',
+ 'tûlas',
+ 'uþ',
+ 'uþtat',
+ 'uþvis',
+ 'va',
+ 'vai',
+ 'viduj',
+ 'vidury',
+ 'vien',
+ 'vienas',
+ 'vienokia',
+ 'vienoks',
+ 'vietoj',
+ 'virð',
+ 'virðuj',
+ 'virðum',
+ 'vis',
+ 'vis dëlto',
+ 'visa',
+ 'visas',
+ 'visgi',
+ 'visokia',
+ 'visoks',
+ 'vos',
+ 'vël',
+ 'vëlgi',
+ 'ypaè',
+ 'á',
+ 'ákypai',
+ 'ástriþai',
+ 'ðalia',
+ 'ðe',
+ 'ði',
+ 'ðiaisiais',
+ 'ðiajai',
+ 'ðiajam',
+ 'ðiajame',
+ 'ðiapus',
+ 'ðiedvi',
+ 'ðieji',
+ 'ðiesiems',
+ 'ðioji',
+ 'ðiojo',
+ 'ðiojoje',
+ 'ðiokia',
+ 'ðioks',
+ 'ðiosiomis',
+ 'ðiosioms',
+ 'ðiosios',
+ 'ðiosiose',
+ 'ðis',
+ 'ðisai',
+ 'ðit',
+ 'ðita',
+ 'ðitas',
+ 'ðitiedvi',
+ 'ðitokia',
+ 'ðitoks',
+ 'ðituodu',
+ 'ðiuodu',
+ 'ðiuoju',
+ 'ðiuosiuose',
+ 'ðiuosius',
+ 'ðiàja',
+ 'ðiàjà',
+ 'ðiàsias',
+ 'ðiøjø',
+ 'ðtai',
+ 'ðájá',
+ 'þemiau',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/lv.php b/vendor/voku/stop-words/src/voku/helper/stopwords/lv.php
new file mode 100644
index 000000000..437f28ccd
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/lv.php
@@ -0,0 +1,171 @@
+<?php
+
+// latvian
+
+static $data = [
+ 'aiz',
+ 'ap',
+ 'apakš',
+ 'apakšpus',
+ 'ar',
+ 'arī',
+ 'augšpus',
+ 'bet',
+ 'bez',
+ 'bija',
+ 'biji',
+ 'biju',
+ 'bijām',
+ 'bijāt',
+ 'būs',
+ 'būsi',
+ 'būsiet',
+ 'būsim',
+ 'būt',
+ 'būšu',
+ 'caur',
+ 'diemžēl',
+ 'diezin',
+ 'droši',
+ 'dēļ',
+ 'esam',
+ 'esat',
+ 'esi',
+ 'esmu',
+ 'gan',
+ 'gar',
+ 'iekam',
+ 'iekams',
+ 'iekām',
+ 'iekāms',
+ 'iekš',
+ 'iekšpus',
+ 'ik',
+ 'ir',
+ 'it',
+ 'itin',
+ 'iz',
+ 'ja',
+ 'jau',
+ 'jeb',
+ 'jebšu',
+ 'jel',
+ 'jo',
+ 'jā',
+ 'ka',
+ 'kamēr',
+ 'kaut',
+ 'kolīdz',
+ 'kopš',
+ 'kā',
+ 'kļuva',
+ 'kļuvi',
+ 'kļuvu',
+ 'kļuvām',
+ 'kļuvāt',
+ 'kļūs',
+ 'kļūsi',
+ 'kļūsiet',
+ 'kļūsim',
+ 'kļūst',
+ 'kļūstam',
+ 'kļūstat',
+ 'kļūsti',
+ 'kļūstu',
+ 'kļūt',
+ 'kļūšu',
+ 'labad',
+ 'lai',
+ 'lejpus',
+ 'līdz',
+ 'līdzko',
+ 'ne',
+ 'nebūt',
+ 'nedz',
+ 'nekā',
+ 'nevis',
+ 'nezin',
+ 'no',
+ 'nu',
+ 'nē',
+ 'otrpus',
+ 'pa',
+ 'par',
+ 'pat',
+ 'pie',
+ 'pirms',
+ 'pret',
+ 'priekš',
+ 'pār',
+ 'pēc',
+ 'starp',
+ 'tad',
+ 'tak',
+ 'tapi',
+ 'taps',
+ 'tapsi',
+ 'tapsiet',
+ 'tapsim',
+ 'tapt',
+ 'tapāt',
+ 'tapšu',
+ 'taču',
+ 'te',
+ 'tiec',
+ 'tiek',
+ 'tiekam',
+ 'tiekat',
+ 'tieku',
+ 'tik',
+ 'tika',
+ 'tikai',
+ 'tiki',
+ 'tikko',
+ 'tiklab',
+ 'tiklīdz',
+ 'tiks',
+ 'tiksiet',
+ 'tiksim',
+ 'tikt',
+ 'tiku',
+ 'tikvien',
+ 'tikām',
+ 'tikāt',
+ 'tikšu',
+ 'tomēr',
+ 'topat',
+ 'turpretim',
+ 'turpretī',
+ 'tā',
+ 'tādēļ',
+ 'tālab',
+ 'tāpēc',
+ 'un',
+ 'uz',
+ 'vai',
+ 'var',
+ 'varat',
+ 'varēja',
+ 'varēji',
+ 'varēju',
+ 'varējām',
+ 'varējāt',
+ 'varēs',
+ 'varēsi',
+ 'varēsiet',
+ 'varēsim',
+ 'varēt',
+ 'varēšu',
+ 'vien',
+ 'virs',
+ 'virspus',
+ 'vis',
+ 'viņpus',
+ 'zem',
+ 'ārpus',
+ 'šaipus',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/nl.php b/vendor/voku/stop-words/src/voku/helper/stopwords/nl.php
new file mode 100644
index 000000000..197539180
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/nl.php
@@ -0,0 +1,111 @@
+<?php
+
+// dutch
+
+static $data = [
+ 'de',
+ 'en',
+ 'van',
+ 'ik',
+ 'te',
+ 'dat',
+ 'die',
+ 'in',
+ 'een',
+ 'hij',
+ 'het',
+ 'niet',
+ 'zijn',
+ 'is',
+ 'was',
+ 'op',
+ 'aan',
+ 'met',
+ 'als',
+ 'voor',
+ 'had',
+ 'er',
+ 'maar',
+ 'om',
+ 'hem',
+ 'dan',
+ 'zou',
+ 'of',
+ 'wat',
+ 'mijn',
+ 'men',
+ 'dit',
+ 'zo',
+ 'door',
+ 'over',
+ 'ze',
+ 'zich',
+ 'bij',
+ 'ook',
+ 'tot',
+ 'je',
+ 'mij',
+ 'uit',
+ 'der',
+ 'daar',
+ 'haar',
+ 'naar',
+ 'heb',
+ 'hoe',
+ 'heeft',
+ 'hebben',
+ 'deze',
+ 'u',
+ 'want',
+ 'nog',
+ 'zal',
+ 'me',
+ 'zij',
+ 'nu',
+ 'ge',
+ 'geen',
+ 'omdat',
+ 'iets',
+ 'worden',
+ 'toch',
+ 'al',
+ 'waren',
+ 'veel',
+ 'meer',
+ 'doen',
+ 'toen',
+ 'moet',
+ 'ben',
+ 'zonder',
+ 'kan',
+ 'hun',
+ 'dus',
+ 'alles',
+ 'onder',
+ 'ja',
+ 'eens',
+ 'hier',
+ 'wie',
+ 'werd',
+ 'altijd',
+ 'doch',
+ 'wordt',
+ 'wezen',
+ 'kunnen',
+ 'ons',
+ 'zelf',
+ 'tegen',
+ 'na',
+ 'reeds',
+ 'wil',
+ 'kon',
+ 'niets',
+ 'uw',
+ 'iemand',
+ 'geweest',
+ 'andere',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/no.php b/vendor/voku/stop-words/src/voku/helper/stopwords/no.php
new file mode 100644
index 000000000..0892d34ce
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/no.php
@@ -0,0 +1,186 @@
+<?php
+
+// norwegian
+
+static $data = [
+ 'og',
+ 'i',
+ 'jeg',
+ 'det',
+ 'at',
+ 'en',
+ 'et',
+ 'den',
+ 'til',
+ 'er',
+ 'som',
+ 'på',
+ 'de',
+ 'med',
+ 'han',
+ 'av',
+ 'ikke',
+ 'ikkje',
+ 'der',
+ 'så',
+ 'var',
+ 'meg',
+ 'seg',
+ 'men',
+ 'ett',
+ 'har',
+ 'om',
+ 'vi',
+ 'min',
+ 'mitt',
+ 'ha',
+ 'hadde',
+ 'hun',
+ 'nå',
+ 'over',
+ 'da',
+ 'ved',
+ 'fra',
+ 'du',
+ 'ut',
+ 'sin',
+ 'dem',
+ 'oss',
+ 'opp',
+ 'man',
+ 'kan',
+ 'hans',
+ 'hvor',
+ 'eller',
+ 'hva',
+ 'skal',
+ 'selv',
+ 'sjøl',
+ 'her',
+ 'alle',
+ 'vil',
+ 'bli',
+ 'ble',
+ 'blei',
+ 'blitt',
+ 'kunne',
+ 'inn',
+ 'når',
+ 'være',
+ 'kom',
+ 'noen',
+ 'noe',
+ 'ville',
+ 'dere',
+ 'som',
+ 'deres',
+ 'kun',
+ 'ja',
+ 'etter',
+ 'ned',
+ 'skulle',
+ 'denne',
+ 'for',
+ 'deg',
+ 'si',
+ 'sine',
+ 'sitt',
+ 'mot',
+ 'å',
+ 'meget',
+ 'hvorfor',
+ 'dette',
+ 'disse',
+ 'uten',
+ 'hvordan',
+ 'ingen',
+ 'din',
+ 'ditt',
+ 'blir',
+ 'samme',
+ 'hvilken',
+ 'hvilke',
+ 'sånn',
+ 'inni',
+ 'mellom',
+ 'vår',
+ 'hver',
+ 'hvem',
+ 'vors',
+ 'hvis',
+ 'både',
+ 'bare',
+ 'enn',
+ 'fordi',
+ 'før',
+ 'mange',
+ 'også',
+ 'slik',
+ 'vært',
+ 'være',
+ 'båe',
+ 'begge',
+ 'siden',
+ 'dykk',
+ 'dykkar',
+ 'dei',
+ 'deira',
+ 'deires',
+ 'deim',
+ 'di',
+ 'då',
+ 'eg',
+ 'ein',
+ 'eit',
+ 'eitt',
+ 'elles',
+ 'honom',
+ 'hjå',
+ 'ho',
+ 'hoe',
+ 'henne',
+ 'hennar',
+ 'hennes',
+ 'hoss',
+ 'hossen',
+ 'ikkje',
+ 'ingi',
+ 'inkje',
+ 'korleis',
+ 'korso',
+ 'kva',
+ 'kvar',
+ 'kvarhelst',
+ 'kven',
+ 'kvi',
+ 'kvifor',
+ 'me',
+ 'medan',
+ 'mi',
+ 'mine',
+ 'mykje',
+ 'no',
+ 'nokon',
+ 'noka',
+ 'nokor',
+ 'noko',
+ 'nokre',
+ 'si',
+ 'sia',
+ 'sidan',
+ 'so',
+ 'somt',
+ 'somme',
+ 'um',
+ 'upp',
+ 'vere',
+ 'vore',
+ 'verte',
+ 'vort',
+ 'varte',
+ 'vart',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/pl.php b/vendor/voku/stop-words/src/voku/helper/stopwords/pl.php
new file mode 100644
index 000000000..fd3577585
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/pl.php
@@ -0,0 +1,148 @@
+<?php
+
+// polish
+
+static $data = [
+ 'ach',
+ 'aj',
+ 'albo',
+ 'bardzo',
+ 'bez',
+ 'bo',
+ 'być',
+ 'ci',
+ 'cię',
+ 'ciebie',
+ 'co',
+ 'czy',
+ 'daleko',
+ 'dla',
+ 'dlaczego',
+ 'dlatego',
+ 'do',
+ 'dobrze',
+ 'dokąd',
+ 'dość',
+ 'dużo',
+ 'dwa',
+ 'dwaj',
+ 'dwie',
+ 'dwoje',
+ 'dziś',
+ 'dzisiaj',
+ 'gdyby',
+ 'gdzie',
+ 'go',
+ 'ich',
+ 'ile',
+ 'im',
+ 'inny',
+ 'ja',
+ 'ją',
+ 'jak',
+ 'jakby',
+ 'jaki',
+ 'je',
+ 'jeden',
+ 'jedna',
+ 'jedno',
+ 'jego',
+ 'jej',
+ 'jemu',
+ 'jeśli',
+ 'jest',
+ 'jestem',
+ 'jeżeli',
+ 'już',
+ 'każdy',
+ 'kiedy',
+ 'kierunku',
+ 'kto',
+ 'ku',
+ 'lub',
+ 'ma',
+ 'mają',
+ 'mam',
+ 'mi',
+ 'mną',
+ 'mnie',
+ 'moi',
+ 'mój',
+ 'moja',
+ 'moje',
+ 'może',
+ 'mu',
+ 'my',
+ 'na',
+ 'nam',
+ 'nami',
+ 'nas',
+ 'nasi',
+ 'nasz',
+ 'nasza',
+ 'nasze',
+ 'natychmiast',
+ 'nią',
+ 'nic',
+ 'nich',
+ 'nie',
+ 'niego',
+ 'niej',
+ 'niemu',
+ 'nigdy',
+ 'nim',
+ 'nimi',
+ 'niż',
+ 'obok',
+ 'od',
+ 'około',
+ 'on',
+ 'ona',
+ 'one',
+ 'oni',
+ 'ono',
+ 'owszem',
+ 'po',
+ 'pod',
+ 'ponieważ',
+ 'przed',
+ 'przedtem',
+ 'są',
+ 'sam',
+ 'sama',
+ 'się',
+ 'skąd',
+ 'tak',
+ 'taki',
+ 'tam',
+ 'ten',
+ 'to',
+ 'tobą',
+ 'tobie',
+ 'tu',
+ 'tutaj',
+ 'twoi',
+ 'twój',
+ 'twoja',
+ 'twoje',
+ 'ty',
+ 'wam',
+ 'wami',
+ 'was',
+ 'wasi',
+ 'wasz',
+ 'wasza',
+ 'wasze',
+ 'we',
+ 'więc',
+ 'wszystko',
+ 'wtedy',
+ 'wy',
+ 'żaden',
+ 'zawsze',
+ 'że',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/pt.php b/vendor/voku/stop-words/src/voku/helper/stopwords/pt.php
new file mode 100644
index 000000000..41cd3e4e5
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/pt.php
@@ -0,0 +1,214 @@
+<?php
+
+// portuguese
+
+static $data = [
+ 'de',
+ 'a',
+ 'o',
+ 'que',
+ 'e',
+ 'do',
+ 'da',
+ 'em',
+ 'um',
+ 'para',
+ 'com',
+ 'não',
+ 'uma',
+ 'os',
+ 'no',
+ 'se',
+ 'na',
+ 'por',
+ 'mais',
+ 'as',
+ 'dos',
+ 'como',
+ 'mas',
+ 'ao',
+ 'ele',
+ 'das',
+ 'à',
+ 'seu',
+ 'sua',
+ 'ou',
+ 'quando',
+ 'muito',
+ 'nos',
+ 'já',
+ 'eu',
+ 'também',
+ 'só',
+ 'pelo',
+ 'pela',
+ 'até',
+ 'isso',
+ 'ela',
+ 'entre',
+ 'depois',
+ 'sem',
+ 'mesmo',
+ 'aos',
+ 'seus',
+ 'quem',
+ 'nas',
+ 'me',
+ 'esse',
+ 'eles',
+ 'você',
+ 'essa',
+ 'num',
+ 'nem',
+ 'suas',
+ 'meu',
+ 'às',
+ 'minha',
+ 'numa',
+ 'pelos',
+ 'elas',
+ 'qual',
+ 'nós',
+ 'lhe',
+ 'deles',
+ 'essas',
+ 'esses',
+ 'pelas',
+ 'este',
+ 'dele',
+ 'tu',
+ 'te',
+ 'vocês',
+ 'vos',
+ 'lhes',
+ 'meus',
+ 'minhas',
+ 'teu',
+ 'tua',
+ 'teus',
+ 'tuas',
+ 'nosso',
+ 'nossa',
+ 'nossos',
+ 'nossas',
+ 'dela',
+ 'delas',
+ 'esta',
+ 'estes',
+ 'estas',
+ 'aquele',
+ 'aquela',
+ 'aqueles',
+ 'aquelas',
+ 'isto',
+ 'aquilo',
+ 'estou',
+ 'está',
+ 'estamos',
+ 'estão',
+ 'estive',
+ 'esteve',
+ 'estivemos',
+ 'estiveram',
+ 'estava',
+ 'estávamos',
+ 'estavam',
+ 'estivera',
+ 'estivéramos',
+ 'esteja',
+ 'estejamos',
+ 'estejam',
+ 'estivesse',
+ 'estivéssemos',
+ 'estivessem',
+ 'estiver',
+ 'estivermos',
+ 'estiverem',
+ 'hei',
+ 'há',
+ 'havemos',
+ 'hão',
+ 'houve',
+ 'houvemos',
+ 'houveram',
+ 'houvera',
+ 'houvéramos',
+ 'haja',
+ 'hajamos',
+ 'hajam',
+ 'houvesse',
+ 'houvéssemos',
+ 'houvessem',
+ 'houver',
+ 'houvermos',
+ 'houverem',
+ 'houverei',
+ 'houverá',
+ 'houveremos',
+ 'houverão',
+ 'houveria',
+ 'houveríamos',
+ 'houveriam',
+ 'sou',
+ 'somos',
+ 'são',
+ 'era',
+ 'éramos',
+ 'eram',
+ 'fui',
+ 'foi',
+ 'fomos',
+ 'foram',
+ 'fora',
+ 'fôramos',
+ 'seja',
+ 'sejamos',
+ 'sejam',
+ 'fosse',
+ 'fôssemos',
+ 'fossem',
+ 'for',
+ 'formos',
+ 'forem',
+ 'serei',
+ 'será',
+ 'seremos',
+ 'serão',
+ 'seria',
+ 'seríamos',
+ 'seriam',
+ 'tenho',
+ 'tem',
+ 'temos',
+ 'tém',
+ 'tinha',
+ 'tínhamos',
+ 'tinham',
+ 'tive',
+ 'teve',
+ 'tivemos',
+ 'tiveram',
+ 'tivera',
+ 'tivéramos',
+ 'tenha',
+ 'tenhamos',
+ 'tenham',
+ 'tivesse',
+ 'tivéssemos',
+ 'tivessem',
+ 'tiver',
+ 'tivermos',
+ 'tiverem',
+ 'terei',
+ 'terá',
+ 'teremos',
+ 'terão',
+ 'teria',
+ 'teríamos',
+ 'teriam',
+];
+
+$result =& $data;
+unset($data);
+return $result;
+
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/ro.php b/vendor/voku/stop-words/src/voku/helper/stopwords/ro.php
new file mode 100644
index 000000000..c7246d667
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/ro.php
@@ -0,0 +1,268 @@
+<?php
+
+// romanian
+
+static $data = [
+ 'vreo',
+ 'acelea',
+ 'cita',
+ 'degraba',
+ 'lor',
+ 'alta',
+ 'tot',
+ 'ai',
+ 'dat',
+ 'x',
+ 'despre',
+ 'peste',
+ 'bine',
+ 'dar',
+ 'foarte',
+ 'z',
+ 'avea',
+ 'multi',
+ 'cit',
+ 'alt',
+ 'mai',
+ 'sa',
+ 'fie',
+ 'tu',
+ 'multe',
+ 'e',
+ 'orice',
+ 'dintr',
+ 'se',
+ 'g',
+ 'intr',
+ 'niste',
+ 'multa',
+ 'insa',
+ 'il',
+ 'fost',
+ 'a',
+ 'abia',
+ 'nimic',
+ 'sub',
+ 'acel',
+ 'in',
+ 'altceva',
+ 'si',
+ 'avem',
+ 'altfel',
+ 'c',
+ 'ea',
+ 'acest',
+ 'li',
+ 'parca',
+ 'fi',
+ 'dintre',
+ 'unele',
+ 'm',
+ 'acestei',
+ 'mare',
+ 'cel',
+ 'este',
+ 'pe',
+ 'atitia',
+ 'uneori',
+ 'acela',
+ 'iti',
+ 'astazi',
+ 'acestui',
+ 'o',
+ 'imi',
+ 'ele',
+ 'ceilalti',
+ 'pai',
+ 'fata',
+ 'noua',
+ 'sa-ti',
+ 'altul',
+ 'au',
+ 'i',
+ 'prin',
+ 'conform',
+ 'aceste',
+ 'anume',
+ 'azi',
+ 'k',
+ 'unul',
+ 'ala',
+ 'unei',
+ 'fara',
+ 'ei',
+ 'la',
+ 'aceeasi',
+ 'u',
+ 'inapoi',
+ 'acestea',
+ 'acesta',
+ 'catre',
+ 'sale',
+ 'asupra',
+ 'as',
+ 'aceea',
+ 'ba',
+ 'ale',
+ 'da',
+ 'le',
+ 'apoi',
+ 'aia',
+ 'suntem',
+ 'cum',
+ 'isi',
+ 'inainte',
+ 's',
+ 'de',
+ 'cind',
+ 'cumva',
+ 'chiar',
+ 'acestia',
+ 'daca',
+ 'sunt',
+ 'care',
+ 'al',
+ 'numai',
+ 'cui',
+ 'sus',
+ 'tocmai',
+ 'prea',
+ 'cu',
+ 'mi',
+ 'eu',
+ 'doar',
+ 'niciodata',
+ 'exact',
+ 'putini',
+ 'aiurea',
+ 'tuturor',
+ 'celor',
+ 'astfel',
+ 'atunci',
+ 'citeva',
+ 'cat',
+ 'sau',
+ 'fel',
+ 'intre',
+ 'acolo',
+ 'nostri',
+ 'ma',
+ 'mult',
+ 'una',
+ 'ceea',
+ 'iar',
+ 'sintem',
+ 'ati',
+ 'din',
+ 'geaba',
+ 'sai',
+ 'caruia',
+ 'adica',
+ 'inca',
+ 'are',
+ 'aici',
+ 'ca',
+ 'ia',
+ 'nici',
+ 'd',
+ 'oricum',
+ 'asta',
+ 'carora',
+ 'face',
+ 'citiva',
+ 'voi',
+ 'unor',
+ 'f',
+ 'atat',
+ 'toata',
+ 'alaturi',
+ 'cea',
+ 'nu',
+ 'totusi',
+ 'ce',
+ 'altii',
+ 'acum',
+ 'sint',
+ 'capat',
+ 'mod',
+ 'deasupra',
+ 'cam',
+ 'vom',
+ 'b',
+ 'toate',
+ 'careia',
+ 'aceasta',
+ 'atit',
+ 'nimeni',
+ 'ii',
+ 'ci',
+ 'unde',
+ 'ul',
+ 'plus',
+ 'era',
+ 'sa-mi',
+ 'l',
+ 'spre',
+ 'dupa',
+ 'nou',
+ 'cele',
+ 'acea',
+ 'un',
+ 'incit',
+ 'n',
+ 'cei',
+ 'or',
+ 'va',
+ 'deci',
+ 'acelasi',
+ 'atatea',
+ 'h',
+ 'vor',
+ 'decit',
+ 'noi',
+ 'cineva',
+ 'desi',
+ 'ceva',
+ 'j',
+ 'ului',
+ 'atitea',
+ 'avut',
+ 'ar',
+ 'pina',
+ 't',
+ 'atata',
+ 'unui',
+ 'el',
+ 'citi',
+ 'asa',
+ 'totul',
+ 'pentru',
+ 'atita',
+ 'v',
+ 'alti',
+ 'asemenea',
+ 'atatia',
+ 'te',
+ 'ne',
+ 'deja',
+ 'unii',
+ 'p',
+ 'atare',
+ 'cite',
+ 'cine',
+ 'cand',
+ 'toti',
+ 'vreun',
+ 'ori',
+ 'r',
+ 'alte',
+ 'lui',
+ 'ti',
+ 'ni',
+ 'aceia',
+ 'am',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/ru.php b/vendor/voku/stop-words/src/voku/helper/stopwords/ru.php
new file mode 100644
index 000000000..0af9776b6
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/ru.php
@@ -0,0 +1,161 @@
+<?php
+
+// russian
+
+static $data = [
+ 'и',
+ 'в',
+ 'во',
+ 'не',
+ 'что',
+ 'он',
+ 'на',
+ 'я',
+ 'с',
+ 'со',
+ 'как',
+ 'а',
+ 'то',
+ 'все',
+ 'она',
+ 'так',
+ 'его',
+ 'но',
+ 'да',
+ 'ты',
+ 'к',
+ 'у',
+ 'же',
+ 'вы',
+ 'за',
+ 'бы',
+ 'по',
+ 'только',
+ 'ее',
+ 'мне',
+ 'было',
+ 'вот',
+ 'от',
+ 'меня',
+ 'еще',
+ 'нет',
+ 'о',
+ 'из',
+ 'ему',
+ 'теперь',
+ 'когда',
+ 'даже',
+ 'ну',
+ 'вдруг',
+ 'ли',
+ 'если',
+ 'уже',
+ 'или',
+ 'ни',
+ 'быть',
+ 'был',
+ 'него',
+ 'до',
+ 'вас',
+ 'нибудь',
+ 'опять',
+ 'уж',
+ 'вам',
+ 'ведь',
+ 'там',
+ 'потом',
+ 'себя',
+ 'ничего',
+ 'ей',
+ 'может',
+ 'они',
+ 'тут',
+ 'где',
+ 'есть',
+ 'надо',
+ 'ней',
+ 'для',
+ 'мы',
+ 'тебя',
+ 'их',
+ 'чем',
+ 'была',
+ 'сам',
+ 'чтоб',
+ 'без',
+ 'будто',
+ 'чего',
+ 'раз',
+ 'тоже',
+ 'себе',
+ 'под',
+ 'будет',
+ 'ж',
+ 'тогда',
+ 'кто',
+ 'этот',
+ 'того',
+ 'потому',
+ 'этого',
+ 'какой',
+ 'совсем',
+ 'ним',
+ 'здесь',
+ 'этом',
+ 'один',
+ 'почти',
+ 'мой',
+ 'тем',
+ 'чтобы',
+ 'нее',
+ 'сейчас',
+ 'были',
+ 'куда',
+ 'зачем',
+ 'всех',
+ 'никогда',
+ 'можно',
+ 'при',
+ 'наконец',
+ 'два',
+ 'об',
+ 'другой',
+ 'хоть',
+ 'после',
+ 'над',
+ 'больше',
+ 'тот',
+ 'через',
+ 'эти',
+ 'нас',
+ 'про',
+ 'всего',
+ 'них',
+ 'какая',
+ 'много',
+ 'разве',
+ 'три',
+ 'эту',
+ 'моя',
+ 'впрочем',
+ 'хорошо',
+ 'свою',
+ 'этой',
+ 'перед',
+ 'иногда',
+ 'лучше',
+ 'чуть',
+ 'том',
+ 'нельзя',
+ 'такой',
+ 'им',
+ 'более',
+ 'всегда',
+ 'конечно',
+ 'всю',
+ 'между',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/sk.php b/vendor/voku/stop-words/src/voku/helper/stopwords/sk.php
new file mode 100644
index 000000000..0145fa0d3
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/sk.php
@@ -0,0 +1,183 @@
+<?php
+
+// slovak
+
+static $data = [
+ 'a',
+ 'aby',
+ 'aj',
+ 'ak',
+ 'ako',
+ 'ale',
+ 'alebo',
+ 'and',
+ 'ani',
+ 'áno',
+ 'asi',
+ 'až',
+ 'bez',
+ 'bude',
+ 'budem',
+ 'budeš',
+ 'budeme',
+ 'budete',
+ 'budú',
+ 'by',
+ 'bol',
+ 'bola',
+ 'boli',
+ 'bolo',
+ 'byť',
+ 'cez',
+ 'čo',
+ 'či',
+ 'ďalší',
+ 'ďalšia',
+ 'ďalšie',
+ 'dnes',
+ 'do',
+ 'ho',
+ 'ešte',
+ 'for',
+ 'i',
+ 'ja',
+ 'je',
+ 'jeho',
+ 'jej',
+ 'ich',
+ 'iba',
+ 'iné',
+ 'iný',
+ 'som',
+ 'si',
+ 'sme',
+ 'sú',
+ 'k',
+ 'kam',
+ 'každý',
+ 'každá',
+ 'každé',
+ 'každí',
+ 'kde',
+ 'keď',
+ 'kto',
+ 'ktorá',
+ 'ktoré',
+ 'ktorou',
+ 'ktorý',
+ 'ktorí',
+ 'ku',
+ 'lebo',
+ 'len',
+ 'ma',
+ 'mať',
+ 'má',
+ 'máte',
+ 'medzi',
+ 'mi',
+ 'mna',
+ 'mne',
+ 'mnou',
+ 'musieť',
+ 'môcť',
+ 'môj',
+ 'môže',
+ 'my',
+ 'na',
+ 'nad',
+ 'nám',
+ 'náš',
+ 'naši',
+ 'nie',
+ 'nech',
+ 'než',
+ 'nič',
+ 'niektorý',
+ 'nové',
+ 'nový',
+ 'nová',
+ 'nové',
+ 'noví',
+ 'o',
+ 'od',
+ 'odo',
+ 'of',
+ 'on',
+ 'ona',
+ 'ono',
+ 'oni',
+ 'ony',
+ 'po',
+ 'pod',
+ 'podľa',
+ 'pokiaľ',
+ 'potom',
+ 'práve',
+ 'pre',
+ 'prečo',
+ 'preto',
+ 'pretože',
+ 'prvý',
+ 'prvá',
+ 'prvé',
+ 'prví',
+ 'pred',
+ 'predo',
+ 'pri',
+ 'pýta',
+ 's',
+ 'sa',
+ 'so',
+ 'si',
+ 'svoje',
+ 'svoj',
+ 'svojich',
+ 'svojím',
+ 'svojími',
+ 'ta',
+ 'tak',
+ 'takže',
+ 'táto',
+ 'teda',
+ 'te',
+ 'tě',
+ 'ten',
+ 'tento',
+ 'the',
+ 'tieto',
+ 'tým',
+ 'týmto',
+ 'tiež',
+ 'to',
+ 'toto',
+ 'toho',
+ 'tohoto',
+ 'tom',
+ 'tomto',
+ 'tomuto',
+ 'toto',
+ 'tu',
+ 'tú',
+ 'túto',
+ 'tvoj',
+ 'ty',
+ 'tvojími',
+ 'už',
+ 'v',
+ 'vám',
+ 'váš',
+ 'vaše',
+ 'vo',
+ 'viac',
+ 'však',
+ 'všetok',
+ 'vy',
+ 'z',
+ 'za',
+ 'zo',
+ 'že',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/sv.php b/vendor/voku/stop-words/src/voku/helper/stopwords/sv.php
new file mode 100644
index 000000000..9b432713a
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/sv.php
@@ -0,0 +1,124 @@
+<?php
+
+// swedish
+
+static $data = [
+ 'och',
+ 'det',
+ 'att',
+ 'i',
+ 'en',
+ 'jag',
+ 'hon',
+ 'som',
+ 'han',
+ 'på',
+ 'den',
+ 'med',
+ 'var',
+ 'sig',
+ 'för',
+ 'så',
+ 'till',
+ 'är',
+ 'men',
+ 'ett',
+ 'om',
+ 'hade',
+ 'de',
+ 'av',
+ 'icke',
+ 'mig',
+ 'du',
+ 'henne',
+ 'då',
+ 'sin',
+ 'nu',
+ 'har',
+ 'inte',
+ 'hans',
+ 'honom',
+ 'skulle',
+ 'hennes',
+ 'där',
+ 'min',
+ 'man',
+ 'ej',
+ 'vid',
+ 'kunde',
+ 'något',
+ 'från',
+ 'ut',
+ 'när',
+ 'efter',
+ 'upp',
+ 'vi',
+ 'dem',
+ 'vara',
+ 'vad',
+ 'över',
+ 'än',
+ 'dig',
+ 'kan',
+ 'sina',
+ 'här',
+ 'ha',
+ 'mot',
+ 'alla',
+ 'under',
+ 'någon',
+ 'eller',
+ 'allt',
+ 'mycket',
+ 'sedan',
+ 'ju',
+ 'denna',
+ 'själv',
+ 'detta',
+ 'åt',
+ 'utan',
+ 'varit',
+ 'hur',
+ 'ingen',
+ 'mitt',
+ 'ni',
+ 'bli',
+ 'blev',
+ 'oss',
+ 'din',
+ 'dessa',
+ 'några',
+ 'deras',
+ 'blir',
+ 'mina',
+ 'samma',
+ 'vilken',
+ 'er',
+ 'sådan',
+ 'vår',
+ 'blivit',
+ 'dess',
+ 'inom',
+ 'mellan',
+ 'sådant',
+ 'varför',
+ 'varje',
+ 'vilka',
+ 'ditt',
+ 'vem',
+ 'vilket',
+ 'sitta',
+ 'sådana',
+ 'vart',
+ 'dina',
+ 'vars',
+ 'vårt',
+ 'våra',
+ 'ert',
+ 'era',
+ 'vilkas',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/tr.php b/vendor/voku/stop-words/src/voku/helper/stopwords/tr.php
new file mode 100644
index 000000000..e0c9d3750
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/tr.php
@@ -0,0 +1,63 @@
+<?php
+
+// turkish
+
+static $data = [
+ 'acaba',
+ 'ama',
+ 'aslında',
+ 'az',
+ 'bazı',
+ 'belki',
+ 'biri',
+ 'birkaç',
+ 'birşey',
+ 'biz',
+ 'bu',
+ 'çok',
+ 'çünkü',
+ 'da',
+ 'daha',
+ 'de',
+ 'defa',
+ 'diye',
+ 'eğer',
+ 'en',
+ 'gibi',
+ 'hem',
+ 'hep',
+ 'hepsi',
+ 'her',
+ 'hiç',
+ 'için',
+ 'ile',
+ 'ise',
+ 'kez',
+ 'ki',
+ 'kim',
+ 'mı',
+ 'mu',
+ 'mü',
+ 'nasıl',
+ 'ne',
+ 'neden',
+ 'nerde',
+ 'nerede',
+ 'nereye',
+ 'niçin',
+ 'niye',
+ 'o',
+ 'sanki',
+ 'şey',
+ 'siz',
+ 'şu',
+ 'tüm',
+ 've',
+ 'veya',
+ 'ya',
+ 'yani',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/uk.php b/vendor/voku/stop-words/src/voku/helper/stopwords/uk.php
new file mode 100644
index 000000000..7300e2857
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/uk.php
@@ -0,0 +1,395 @@
+<?php
+
+// ukrainian
+
+static $data = [
+ 'a',
+ 'б',
+ 'в',
+ 'г',
+ 'е',
+ 'ж',
+ 'з',
+ 'м',
+ 'т',
+ 'у',
+ 'я',
+ 'є',
+ 'і',
+ 'аж',
+ 'ви',
+ 'де',
+ 'до',
+ 'за',
+ 'зі',
+ 'ми',
+ 'на',
+ 'не',
+ 'ну',
+ 'нх',
+ 'ні',
+ 'по',
+ 'та',
+ 'ти',
+ 'то',
+ 'ту',
+ 'ті',
+ 'це',
+ 'цю',
+ 'ця',
+ 'ці',
+ 'чи',
+ 'ще',
+ 'що',
+ 'як',
+ 'їй',
+ 'їм',
+ 'їх',
+ 'її',
+ 'або',
+ 'але',
+ 'ало',
+ 'без',
+ 'був',
+ 'вам',
+ 'вас',
+ 'ваш',
+ 'вже',
+ 'все',
+ 'всю',
+ 'вся',
+ 'від',
+ 'він',
+ 'два',
+ 'дві',
+ 'для',
+ 'ким',
+ 'мож',
+ 'моя',
+ 'моє',
+ 'мої',
+ 'міг',
+ 'між',
+ 'мій',
+ 'над',
+ 'нам',
+ 'нас',
+ 'наш',
+ 'нею',
+ 'неї',
+ 'них',
+ 'ніж',
+ 'ній',
+ 'ось',
+ 'при',
+ 'про',
+ 'під',
+ 'пір',
+ 'раз',
+ 'рік',
+ 'сам',
+ 'сих',
+ 'сім',
+ 'так',
+ 'там',
+ 'теж',
+ 'тим',
+ 'тих',
+ 'той',
+ 'тою',
+ 'три',
+ 'тут',
+ 'хоч',
+ 'хто',
+ 'цей',
+ 'цим',
+ 'цих',
+ 'час',
+ 'щоб',
+ 'яка',
+ 'які',
+ 'адже',
+ 'буде',
+ 'буду',
+ 'будь',
+ 'була',
+ 'були',
+ 'було',
+ 'бути',
+ 'вами',
+ 'ваша',
+ 'ваше',
+ 'ваші',
+ 'весь',
+ 'вниз',
+ 'вона',
+ 'вони',
+ 'воно',
+ 'всею',
+ 'всім',
+ 'всіх',
+ 'втім',
+ 'геть',
+ 'далі',
+ 'двох',
+ 'день',
+ 'дуже',
+ 'зате',
+ 'його',
+ 'йому',
+ 'каже',
+ 'кого',
+ 'коли',
+ 'кому',
+ 'крім',
+ 'куди',
+ 'лише',
+ 'люди',
+ 'мало',
+ 'мати',
+ 'мене',
+ 'мені',
+ 'миру',
+ 'мною',
+ 'може',
+ 'нами',
+ 'наша',
+ 'наше',
+ 'наші',
+ 'ними',
+ 'ніби',
+ 'один',
+ 'поки',
+ 'пора',
+ 'рано',
+ 'року',
+ 'році',
+ 'сама',
+ 'саме',
+ 'саму',
+ 'самі',
+ 'свою',
+ 'своє',
+ 'свої',
+ 'себе',
+ 'собі',
+ 'став',
+ 'суть',
+ 'така',
+ 'таке',
+ 'такі',
+ 'твоя',
+ 'твоє',
+ 'твій',
+ 'тебе',
+ 'тими',
+ 'тобі',
+ 'того',
+ 'тоді',
+ 'тому',
+ 'туди',
+ 'хоча',
+ 'хіба',
+ 'цими',
+ 'цієї',
+ 'часу',
+ 'чого',
+ 'чому',
+ 'який',
+ 'яких',
+ 'якої',
+ 'якщо',
+ 'ім\'я',
+ 'інша',
+ 'інше',
+ 'інші',
+ 'буває',
+ 'будеш',
+ 'більш',
+ 'вгору',
+ 'вміти',
+ 'внизу',
+ 'вісім',
+ 'давно',
+ 'даром',
+ 'добре',
+ 'довго',
+ 'друго',
+ 'дякую',
+ 'життя',
+ 'зараз',
+ 'знову',
+ 'какая',
+ 'кожен',
+ 'кожна',
+ 'кожне',
+ 'кожні',
+ 'краще',
+ 'ледве',
+ 'майже',
+ 'менше',
+ 'могти',
+ 'можна',
+ 'назад',
+ 'немає',
+ 'нижче',
+ 'нього',
+ 'однак',
+ 'п\'ять',
+ 'перед',
+ 'поруч',
+ 'потім',
+ 'проти',
+ 'після',
+ 'років',
+ 'самим',
+ 'самих',
+ 'самій',
+ 'свого',
+ 'своєї',
+ 'своїх',
+ 'собою',
+ 'справ',
+ 'такий',
+ 'також',
+ 'тепер',
+ 'тисяч',
+ 'тобою',
+ 'треба',
+ 'трохи',
+ 'усюди',
+ 'усіма',
+ 'хочеш',
+ 'цього',
+ 'цьому',
+ 'часто',
+ 'через',
+ 'шість',
+ 'якого',
+ 'іноді',
+ 'інший',
+ 'інших',
+ 'багато',
+ 'будемо',
+ 'будете',
+ 'будуть',
+ 'більше',
+ 'всього',
+ 'всьому',
+ 'далеко',
+ 'десять',
+ 'досить',
+ 'другий',
+ 'дійсно',
+ 'завжди',
+ 'звідси',
+ 'зовсім',
+ 'кругом',
+ 'кілька',
+ 'людина',
+ 'можуть',
+ 'навіть',
+ 'навіщо',
+ 'нагорі',
+ 'небудь',
+ 'низько',
+ 'ніколи',
+ 'нікуди',
+ 'нічого',
+ 'обидва',
+ 'одного',
+ 'однієї',
+ 'п\'ятий',
+ 'перший',
+ 'просто',
+ 'раніше',
+ 'раптом',
+ 'самими',
+ 'самого',
+ 'самому',
+ 'сказав',
+ 'скрізь',
+ 'сьомий',
+ 'третій',
+ 'тільки',
+ 'хотіти',
+ 'чотири',
+ 'чудово',
+ 'шостий',
+ 'близько',
+ 'важлива',
+ 'важливе',
+ 'важливі',
+ 'вдалині',
+ 'восьмий',
+ 'говорив',
+ 'дев\'ять',
+ 'десятий',
+ 'зайнята',
+ 'зайнято',
+ 'зайняті',
+ 'занадто',
+ 'значить',
+ 'навколо',
+ 'нарешті',
+ 'нерідко',
+ 'повинно',
+ 'посеред',
+ 'початку',
+ 'пізніше',
+ 'сказала',
+ 'сказати',
+ 'скільки',
+ 'спасибі',
+ 'частіше',
+ 'важливий',
+ 'двадцять',
+ 'дев\'ятий',
+ 'зазвичай',
+ 'зайнятий',
+ 'звичайно',
+ 'здається',
+ 'найбільш',
+ 'не можна',
+ 'недалеко',
+ 'особливо',
+ 'потрібно',
+ 'спочатку',
+ 'сьогодні',
+ 'численна',
+ 'численне',
+ 'численні',
+ 'відсотків',
+ 'двадцятий',
+ 'звідусіль',
+ 'мільйонів',
+ 'нещодавно',
+ 'прекрасно',
+ 'четвертий',
+ 'численний',
+ 'будь ласка',
+ 'дванадцять',
+ 'одинадцять',
+ 'сімнадцять',
+ 'тринадцять',
+ 'безперервно',
+ 'дванадцятий',
+ 'одинадцятий',
+ 'одного разу',
+ 'п\'ятнадцять',
+ 'сімнадцятий',
+ 'тринадцятий',
+ 'шістнадцять',
+ 'вісімнадцять',
+ 'п\'ятнадцятий',
+ 'чотирнадцять',
+ 'шістнадцятий',
+ 'вісімнадцятий',
+ 'дев\'ятнадцять',
+ 'чотирнадцятий',
+ 'дев\'ятнадцятий',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/vendor/voku/stop-words/src/voku/helper/stopwords/vi.php b/vendor/voku/stop-words/src/voku/helper/stopwords/vi.php
new file mode 100644
index 000000000..4a0ea9305
--- /dev/null
+++ b/vendor/voku/stop-words/src/voku/helper/stopwords/vi.php
@@ -0,0 +1,655 @@
+<?php
+
+// vietnamese
+
+static $data = [
+ 'a ha',
+ 'a-lô',
+ 'ai',
+ 'ai ai',
+ 'ai nấy',
+ 'alô',
+ 'amen',
+ 'anh',
+ 'bao giờ',
+ 'bao lâu',
+ 'bao nhiêu',
+ 'bao nả',
+ 'bay biến',
+ 'biết',
+ 'biết bao',
+ 'biết bao nhiêu',
+ 'biết chừng nào',
+ 'biết mấy',
+ 'biết đâu',
+ 'biết đâu chừng',
+ 'biết đâu đấy',
+ 'bà',
+ 'bài',
+ 'bác',
+ 'bây bẩy',
+ 'bây chừ',
+ 'bây giờ',
+ 'bây nhiêu',
+ 'bèn',
+ 'béng',
+ 'bông',
+ 'bạn',
+ 'bản',
+ 'bất chợt',
+ 'bất cứ',
+ 'bất giác',
+ 'bất kì',
+ 'bất kể',
+ 'bất kỳ',
+ 'bất luận',
+ 'bất nhược',
+ 'bất quá',
+ 'bất thình lình',
+ 'bất tử',
+ 'bất đồ',
+ 'bấy',
+ 'bấy chầy',
+ 'bấy chừ',
+ 'bấy giờ',
+ 'bấy lâu',
+ 'bấy lâu nay',
+ 'bấy nay',
+ 'bấy nhiêu',
+ 'bập bà bập bõm',
+ 'bập bõm',
+ 'bắt đầu từ',
+ 'bằng',
+ 'bằng không',
+ 'bằng nấy',
+ 'bằng ấy',
+ 'bển',
+ 'bệt',
+ 'bị',
+ 'bỏ mẹ',
+ 'bỗng',
+ 'bỗng chốc',
+ 'bỗng dưng',
+ 'bỗng không',
+ 'bỗng nhiên',
+ 'bỗng đâu',
+ 'bộ',
+ 'bội phần',
+ 'bớ',
+ 'bởi',
+ 'bởi chưng',
+ 'bởi nhưng',
+ 'bởi thế',
+ 'bởi vì',
+ 'bởi vậy',
+ 'bức',
+ 'cao',
+ 'cha',
+ 'cha chả',
+ 'chao ôi',
+ 'chiếc',
+ 'cho',
+ 'cho nên',
+ 'cho tới',
+ 'cho tới khi',
+ 'cho đến',
+ 'cho đến khi',
+ 'choa',
+ 'chu cha',
+ 'chui cha',
+ 'chung cục',
+ 'chung qui',
+ 'chung quy',
+ 'chung quy lại',
+ 'chuyện',
+ 'chành chạnh',
+ 'chí chết',
+ 'chính',
+ 'chính là',
+ 'chính thị',
+ 'chùn chùn',
+ 'chùn chũn',
+ 'chú',
+ 'chú mày',
+ 'chú mình',
+ 'chúng mình',
+ 'chúng ta',
+ 'chúng tôi',
+ 'chăn chắn',
+ 'chăng',
+ 'chưa',
+ 'chầm chập',
+ 'chậc',
+ 'chắc',
+ 'chắc hẳn',
+ 'chẳng lẽ',
+ 'chẳng những',
+ 'chẳng nữa',
+ 'chẳng phải',
+ 'chết nỗi',
+ 'chết thật',
+ 'chết tiệt',
+ 'chỉ',
+ 'chỉn',
+ 'chốc chốc',
+ 'chớ',
+ 'chớ chi',
+ 'chợt',
+ 'chủn',
+ 'chứ',
+ 'chứ lị',
+ 'coi bộ',
+ 'coi mòi',
+ 'con',
+ 'cu cậu',
+ 'cuốn',
+ 'cuộc',
+ 'càng',
+ 'các',
+ 'cái',
+ 'cây',
+ 'còn',
+ 'có',
+ 'có chăng là',
+ 'có dễ',
+ 'có thể',
+ 'có vẻ',
+ 'cóc khô',
+ 'cô',
+ 'cô mình',
+ 'công nhiên',
+ 'cùng',
+ 'cùng cực',
+ 'cùng nhau',
+ 'cùng với',
+ 'căn',
+ 'căn cắt',
+ 'cũng',
+ 'cũng như',
+ 'cũng vậy',
+ 'cũng vậy thôi',
+ 'cơ',
+ 'cơ chừng',
+ 'cơ hồ',
+ 'cơ mà',
+ 'cơn',
+ 'cả',
+ 'cả thảy',
+ 'cả thể',
+ 'cảm ơn',
+ 'cần',
+ 'cật lực',
+ 'cật sức',
+ 'cậu',
+ 'cổ lai',
+ 'của',
+ 'cứ',
+ 'cứ việc',
+ 'cực lực',
+ 'do',
+ 'do vì',
+ 'do vậy',
+ 'do đó',
+ 'duy',
+ 'dào',
+ 'dì',
+ 'dù cho',
+ 'dù rằng',
+ 'dưới',
+ 'dạ',
+ 'dần dà',
+ 'dần dần',
+ 'dầu sao',
+ 'dẫu',
+ 'dẫu sao',
+ 'dễ sợ',
+ 'dễ thường',
+ 'dở chừng',
+ 'dữ',
+ 'em',
+ 'giữa',
+ 'gì',
+ 'hay',
+ 'hoàn toàn',
+ 'hoặc',
+ 'hơn',
+ 'hầu hết',
+ 'họ',
+ 'hỏi',
+ 'khi',
+ 'khác',
+ 'không',
+ 'luôn',
+ 'là',
+ 'làm',
+ 'lên',
+ 'lúc',
+ 'lại',
+ 'lần',
+ 'lớn',
+ 'muốn',
+ 'mà',
+ 'mình',
+ 'mỗi',
+ 'một',
+ 'một cách',
+ 'mới',
+ 'mợ',
+ 'ngay',
+ 'ngay cả',
+ 'ngay khi',
+ 'ngay lúc',
+ 'ngay lập tức',
+ 'ngay tức khắc',
+ 'ngay từ',
+ 'nghe chừng',
+ 'nghe đâu',
+ 'nghen',
+ 'nghiễm nhiên',
+ 'nghỉm',
+ 'ngoài',
+ 'ngoài ra',
+ 'ngoải',
+ 'ngày',
+ 'ngày càng',
+ 'ngày ngày',
+ 'ngày xưa',
+ 'ngày xửa',
+ 'ngôi',
+ 'ngõ hầu',
+ 'ngăn ngắt',
+ 'ngươi',
+ 'người',
+ 'ngọn',
+ 'ngọt',
+ 'ngộ nhỡ',
+ 'nh',
+ 'nhau',
+ 'nhiên hậu',
+ 'nhiều',
+ 'nhiệt liệt',
+ 'nhung nhăng',
+ 'nhà',
+ 'nhân dịp',
+ 'nhân tiện',
+ 'nhé',
+ 'nhón nhén',
+ 'như',
+ 'như chơi',
+ 'như không',
+ 'như quả',
+ 'như thể',
+ 'như tuồng',
+ 'như vậy',
+ 'nhưng',
+ 'nhưng mà',
+ 'nhược bằng',
+ 'nhất',
+ 'nhất loạt',
+ 'nhất luật',
+ 'nhất mực',
+ 'nhất nhất',
+ 'nhất quyết',
+ 'nhất sinh',
+ 'nhất thiết',
+ 'nhất tâm',
+ 'nhất tề',
+ 'nhất đán',
+ 'nhất định',
+ 'nhận',
+ 'nhỉ',
+ 'nhỡ ra',
+ 'những',
+ 'những ai',
+ 'những như',
+ 'nào',
+ 'này',
+ 'nên',
+ 'nên chi',
+ 'nó',
+ 'nóc',
+ 'nói',
+ 'năm',
+ 'nơi',
+ 'nấy',
+ 'nếu',
+ 'nếu như',
+ 'nền',
+ 'nọ',
+ 'nớ',
+ 'nức nở',
+ 'nữa',
+ 'oai oái',
+ 'oái',
+ 'pho',
+ 'phè',
+ 'phóc',
+ 'phót',
+ 'phăn phắt',
+ 'phương chi',
+ 'phải',
+ 'phải chi',
+ 'phải chăng',
+ 'phắt',
+ 'phỉ phui',
+ 'phỏng',
+ 'phỏng như',
+ 'phốc',
+ 'phụt',
+ 'phứt',
+ 'qua',
+ 'qua quít',
+ 'qua quýt',
+ 'quyết',
+ 'quyết nhiên',
+ 'quyển',
+ 'quá',
+ 'quá chừng',
+ 'quá lắm',
+ 'quá sá',
+ 'quá thể',
+ 'quá trời',
+ 'quá xá',
+ 'quá đỗi',
+ 'quá độ',
+ 'quá ư',
+ 'quý hồ',
+ 'quả',
+ 'quả là',
+ 'quả tang',
+ 'quả thật',
+ 'quả tình',
+ 'quả vậy',
+ 'quả đúng',
+ 'ra',
+ 'ra phết',
+ 'ra sao',
+ 'ra trò',
+ 'ren rén',
+ 'riu ríu',
+ 'riêng',
+ 'riệt',
+ 'rày',
+ 'ráo',
+ 'ráo trọi',
+ 'rén',
+ 'rích',
+ 'rón rén',
+ 'rút cục',
+ 'răng',
+ 'rất',
+ 'rằng',
+ 'rằng là',
+ 'rốt cuộc',
+ 'rốt cục',
+ 'rồi',
+ 'rứa',
+ 'sa sả',
+ 'sao',
+ 'sau',
+ 'sau chót',
+ 'sau cuối',
+ 'sau cùng',
+ 'sau đó',
+ 'so',
+ 'song le',
+ 'suýt',
+ 'sì',
+ 'sạch',
+ 'sất',
+ 'sắp',
+ 'sẽ',
+ 'số',
+ 'số là',
+ 'sốt sột',
+ 'sở dĩ',
+ 'sự',
+ 'tanh',
+ 'tha hồ',
+ 'than ôi',
+ 'thanh',
+ 'theo',
+ 'thi thoảng',
+ 'thoạt',
+ 'thoạt nhiên',
+ 'thoắt',
+ 'thuần',
+ 'thà',
+ 'thà là',
+ 'thà rằng',
+ 'thành ra',
+ 'thành thử',
+ 'thái quá',
+ 'tháng',
+ 'thì',
+ 'thì thôi',
+ 'thình lình',
+ 'thím',
+ 'thôi',
+ 'thúng thắng',
+ 'thương ôi',
+ 'thường',
+ 'thảo hèn',
+ 'thảo nào',
+ 'thấy',
+ 'thẩy',
+ 'thậm',
+ 'thậm chí',
+ 'thật lực',
+ 'thật ra',
+ 'thật vậy',
+ 'thế',
+ 'thế là',
+ 'thế mà',
+ 'thế nào',
+ 'thế nên',
+ 'thế ra',
+ 'thế thì',
+ 'thế à',
+ 'thếch',
+ 'thỉnh thoảng',
+ 'thỏm',
+ 'thốc',
+ 'thốc tháo',
+ 'thốt',
+ 'thốt nhiên',
+ 'thộc',
+ 'thời gian',
+ 'thục mạng',
+ 'thửa',
+ 'thực ra',
+ 'thực sự',
+ 'thực vậy',
+ 'tiếp theo',
+ 'tiếp đó',
+ 'tiện thể',
+ 'toà',
+ 'toé khói',
+ 'toẹt',
+ 'trong',
+ 'trên',
+ 'trước',
+ 'trước kia',
+ 'trước nay',
+ 'trước tiên',
+ 'trước đây',
+ 'trước đó',
+ 'trếu tráo',
+ 'trển',
+ 'trệt',
+ 'trệu trạo',
+ 'trỏng',
+ 'trời đất ơi',
+ 'trừ phi',
+ 'tuy',
+ 'tuy nhiên',
+ 'tuy rằng',
+ 'tuy thế',
+ 'tuy vậy',
+ 'tuyệt nhiên',
+ 'tuần tự',
+ 'tuốt luốt',
+ 'tuốt tuồn tuột',
+ 'tuốt tuột',
+ 'tà tà',
+ 'tênh',
+ 'tít mù',
+ 'tò te',
+ 'tôi',
+ 'tông tốc',
+ 'tù tì',
+ 'tăm tắp',
+ 'tại',
+ 'tại vì',
+ 'tấm',
+ 'tấn',
+ 'tất cả',
+ 'tất thảy',
+ 'tất tần tật',
+ 'tất tật',
+ 'tắp',
+ 'tắp lự',
+ 'tọt',
+ 'tỏ ra',
+ 'tỏ vẻ',
+ 'tốc tả',
+ 'tối ư',
+ 'tột',
+ 'tớ',
+ 'tới',
+ 'tức thì',
+ 'tức tốc',
+ 'từ',
+ 'từng',
+ 'tự vì',
+ 'tựu trung',
+ 'veo',
+ 'veo veo',
+ 'việc',
+ 'vung thiên địa',
+ 'vung tàn tán',
+ 'vung tán tàn',
+ 'và',
+ 'vào',
+ 'vâng',
+ 'vèo',
+ 'vì',
+ 'vì chưng',
+ 'vì thế',
+ 'vì vậy',
+ 'ví bằng',
+ 'ví dù',
+ 'ví phỏng',
+ 'ví thử',
+ 'vô hình trung',
+ 'vô kể',
+ 'vô luận',
+ 'vô vàn',
+ 'văng tê',
+ 'vạn nhất',
+ 'vả chăng',
+ 'vả lại',
+ 'vẫn',
+ 'vậy',
+ 'vậy là',
+ 'vậy thì',
+ 'về',
+ 'vị tất',
+ 'vốn dĩ',
+ 'với',
+ 'với lại',
+ 'vở',
+ 'vụt',
+ 'vừa',
+ 'vừa mới',
+ 'xa xả',
+ 'xiết bao',
+ 'xon xón',
+ 'xoành xoạch',
+ 'xoét',
+ 'xoẳn',
+ 'xoẹt',
+ 'xuất kì bất ý',
+ 'xuất kỳ bất ý',
+ 'xuể',
+ 'xuống',
+ 'xăm xúi',
+ 'xăm xăm',
+ 'xăm xắm',
+ 'xềnh xệch',
+ 'xệp',
+ 'à',
+ 'à ơi',
+ 'ào',
+ 'á',
+ 'á à',
+ 'ái',
+ 'ái chà',
+ 'ái dà',
+ 'áng',
+ 'âu là',
+ 'ô hay',
+ 'ô hô',
+ 'ô kê',
+ 'ô kìa',
+ 'ôi chao',
+ 'ôi thôi',
+ 'ông',
+ 'úi',
+ 'úi chà',
+ 'úi dào',
+ 'ý',
+ 'ý chừng',
+ 'ý da',
+ 'đang',
+ 'đi',
+ 'điều',
+ 'đành đạch',
+ 'đáng lí',
+ 'đáng lý',
+ 'đáng lẽ',
+ 'đánh đùng',
+ 'đáo để',
+ 'đây',
+ 'đã',
+ 'đó',
+ 'được',
+ 'đại loại',
+ 'đại nhân',
+ 'đại phàm',
+ 'đại để',
+ 'đến',
+ 'đến nỗi',
+ 'đều',
+ 'để',
+ 'ơ',
+ 'ơ hay',
+ 'ơ kìa',
+ 'ơi',
+ 'ư',
+ 'ạ',
+ 'ạ ơi',
+ 'ấy',
+ 'ầu ơ',
+ 'ắt',
+ 'ắt hẳn',
+ 'ắt là',
+ 'ối dào',
+ 'ối giời',
+ 'ối giời ơi',
+ 'ồ',
+ 'ổng',
+ 'ớ',
+ 'ờ',
+ 'ở',
+ 'ở trên',
+ 'ủa',
+ 'ứ hự',
+ 'ứ ừ',
+ 'ừ',
+ 'ử',
+];
+
+$result =& $data;
+unset($data);
+return $result;
diff --git a/view/css/conversation.css b/view/css/conversation.css
index 88081c2c6..f299ad719 100644
--- a/view/css/conversation.css
+++ b/view/css/conversation.css
@@ -115,6 +115,14 @@
position: relative;
}
+.wall-item-photo-group-actor {
+ position: absolute;
+ right: 3px;
+ top: 0px;
+ color: #fff;
+ text-shadow: 1px 1px 3px rgba(0, 0, 0, .5);
+}
+
.wall-item-photo-caret {
position: absolute;
left: 3px;
@@ -228,12 +236,14 @@ a.wall-item-name-link {
line-height: 1;
height: 2rem;
resize: none;
+ overflow: hidden;
}
.comment-edit-text.expanded {
line-height: 1.25;
height: 7rem;
resize: vertical;
+ overflow: auto;
}
.comment-tools,
diff --git a/view/css/mod_connections.css b/view/css/mod_connections.css
index 4c26193b4..6a83367b8 100644
--- a/view/css/mod_connections.css
+++ b/view/css/mod_connections.css
@@ -1,17 +1,8 @@
+#contacts-follow-form,
#contacts-search-form {
display: none;
}
-.section-subtitle-wrapper .btn-xs {
- margin-top: -2px;
-}
-
-.contact-search {
- height: 22px;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
-}
-
.directory-photo-img.archived {
opacity: 0.3;
filter:alpha(opacity=30);
@@ -39,7 +30,8 @@
}
.contact-photo-wrapper .oneway-overlay {
- margin-top: -25px;
- margin-left: 53px;
- font-size: 20px;
+ margin-top: -18px;
+ margin-left: 62px;
+ font-size: 1.2rem;
+ display: inherit; /* this is required for chromium */
}
diff --git a/view/css/mod_profile_photo.css b/view/css/mod_profile_photo.css
index 1b7e15194..3b5f7f321 100644
--- a/view/css/mod_profile_photo.css
+++ b/view/css/mod_profile_photo.css
@@ -12,9 +12,5 @@
}
#profile-photo-wrapper {
- height: 300px;
- width: 300px;
- max-width: 300px;
- max-height: 300px;
overflow: hidden;
}
diff --git a/view/css/widgets.css b/view/css/widgets.css
index b78725919..0a091272c 100644
--- a/view/css/widgets.css
+++ b/view/css/widgets.css
@@ -243,10 +243,9 @@ a.wikilist {
/* contact block */
.contact-block-div .oneway-overlay {
- font-size: 20px;
- margin-left: -25px;
- margin-top: 25px;
- opacity: 0.8;
+ font-size: .9rem;
+ margin-left: -1rem;
+ margin-top: 1.9rem;
}
#cid-filter-wrapper {
diff --git a/view/en/invite.casual.tpl b/view/en/invite.casual.tpl
index 4fd031c63..f2a3b2330 100644
--- a/view/en/invite.casual.tpl
+++ b/view/en/invite.casual.tpl
@@ -2,14 +2,14 @@
Please join my community on {{$projectname}}.
{{$linktxt}} {{$invite_where}}
-You will need to supply this invitation code:
+You will need to supply this invitation code:
{{$invite_code}}
Or:
-1. Register at any {{$projectname}} location
+1. Register at any {{$projectname}} location
(they are all inter-connected).
-2. Enter my {{$Projectname}} network address into the site searchbar.
+2. Enter my {{$projectname}} network address into the site searchbar.
{{$invite_whereami}}
or visit {{$invite_whoami}}
3. Click [Connect]
diff --git a/view/js/main.js b/view/js/main.js
index d3f4eff9a..f7709f9d1 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -178,7 +178,7 @@ $(document).ready(function() {
path = 'hq';
}
- if(notify_id != null) {
+ if(notify_id) {
$.ajax({
type: 'post',
url: 'notify',
@@ -525,11 +525,14 @@ function showHideComments(id) {
}
}
-function openClose(theID) {
- if(document.getElementById(theID).style.display == "block") {
+function openClose(theID, display) {
+ if (typeof display == typeof undefined)
+ display = 'block';
+
+ if(document.getElementById(theID).style.display == display) {
document.getElementById(theID).style.display = "none";
} else {
- document.getElementById(theID).style.display = "block";
+ document.getElementById(theID).style.display = display;
}
}
@@ -541,9 +544,11 @@ function openCloseTR(theID) {
}
}
-function closeOpen(theID) {
+function closeOpen(theID, display) {
+ if (typeof display == typeof undefined)
+ display = 'block';
if(document.getElementById(theID).style.display == "none") {
- document.getElementById(theID).style.display = "block";
+ document.getElementById(theID).style.display = display;
} else {
document.getElementById(theID).style.display = "none";
}
@@ -994,7 +999,7 @@ function liveUpdate(notify_id) {
// else data was valid - reset the recursion counter
liveRecurse = 0;
- if(typeof notify_id !== 'undefined' && notify_id !== 'undefined') {
+ if(notify_id) {
$.post(
"notify",
{
@@ -1158,8 +1163,18 @@ function dolike(ident, verb) {
if(typeof page_mode == typeof undefined)
page_mode = '';
- $.get('like/' + ident.toString() + '?verb=' + verb + '&conv_mode=' + conv_mode + '&page_mode=' + page_mode, function (data) {
+ var reload = '';
+ if(module == 'photos')
+ reload = 1;
+
+ $.get('like/' + ident.toString() + '?verb=' + verb + '&conv_mode=' + conv_mode + '&page_mode=' + page_mode + '&reload=' + reload, function (data) {
if(data.success) {
+
+ // mod photos
+ if (data.reload) {
+ window.location.href = window.location.href;
+ }
+
// this is a bit tricky since the top level thread wrapper wraps the whole thread
if($('#thread-wrapper-' + data.orig_id).hasClass('toplevel_item')) {
var wrapper = $('<div></div>').html( data.html ).find('#wall-item-outside-wrapper-' + data.id);
@@ -1381,7 +1396,14 @@ function post_comment(id) {
"item",
form_data + '&conv_mode=' + conv_mode,
function(data) {
- if(data.success) {
+ if (data.success) {
+
+ //mod photos
+ if (data.reload) {
+ window.location.href = data.reload;
+ }
+
+
localStorage.removeItem("comment_body-" + id);
$("#comment-edit-preview-" + id).hide();
$("#comment-edit-text-" + id).val('').blur().attr('placeholder', aStr.comment);
@@ -1392,7 +1414,7 @@ function post_comment(id) {
commentBusy = false;
var tarea = document.getElementById("comment-edit-text-" + id);
- if(tarea) {
+ if (tarea) {
commentClose(tarea, id);
$(document).off( "click.commentOpen");
}
diff --git a/view/js/mod_connections.js b/view/js/mod_connections.js
index db18e078d..848e9ed9f 100644
--- a/view/js/mod_connections.js
+++ b/view/js/mod_connections.js
@@ -1,5 +1,5 @@
$(document).ready(function() {
$("#contacts-search").contact_autocomplete(baseurl + '/acl', 'a', true);
$(".autotime").timeago();
-});
+});
diff --git a/view/nl/register_verify_eml.tpl b/view/nl/register_verify_eml.tpl
index e4be9551a..6cf222794 100644
--- a/view/nl/register_verify_eml.tpl
+++ b/view/nl/register_verify_eml.tpl
@@ -1,18 +1,18 @@
-{{$sitename}} heeft een nieuwe accountregistratie ontvangen die jouw goedkeuring
-nodig heeft.
+{{$sitename}} heeft een nieuwe accountregistratie ontvangen die jouw goedkeuring
+nodig heeft.
De inloggegevens zijn als volgt:
Hub: {{$siteurl}}
Inlognaam: {{$email}}
-IP-adres:
+IP-adres: {{$details}}
Om dit verzoek goed te keuren bezoek je de volgende link:
-{{$siteurl}}/regmod/allow/{{$hash}}
+{{$siteurl}}/regmod/allow/{{$hash}}
Om dit verzoek af te keuren en het account te verwijderen bezoek je:
diff --git a/view/nl/register_verify_member.tpl b/view/nl/register_verify_member.tpl
index 12afdd32d..97869909a 100644
--- a/view/nl/register_verify_member.tpl
+++ b/view/nl/register_verify_member.tpl
@@ -10,15 +10,23 @@ Log in met het wachtwoord die je tijdens het registreren hebt gekozen.
Wij dienen jouw e-mailadres te verifiëren om je volledig toegang te kunnen geven.
-Wanneer jij dit account hebt aangemaakt, bezoek dan de volgende link:
+Jouw verificatie token is
-{{$siteurl}}/regver/allow/{{$hash}}
+{{$hash}}
+{{if $timeframe}}
+Dit token is geldig van {{$timeframe.0}} UTC tot {{$timeframe.1}} UTC
-Om de registratie van dit account te annuleren en deze te verwijderen bezoek je:
+{{/if}}
+
+Wanneer jij dit account hebt aangemaakt, vul dan de verificatie token in wanneer daarom wordt gevraagd of ga naar de volgende link:
+
+{{$siteurl}}/regate/{{$mail}}
-{{$siteurl}}/regver/deny/{{$hash}}
+Om de registratie van dit account te annuleren en deze te verwijderen bezoek je:
+
+{{$siteurl}}/regate/{{$mail}}{{if $ko}}/{{$ko}}{{/if}}
Bedankt
diff --git a/view/pdl/mod_articles.pdl b/view/pdl/mod_articles.pdl
index 3e77ced4c..490917358 100644
--- a/view/pdl/mod_articles.pdl
+++ b/view/pdl/mod_articles.pdl
@@ -1,4 +1,5 @@
[region=aside]
+[widget=profile][/widget]
[widget=archive][var=articles]1[/var][/widget]
[widget=categories][var=articles]1[/var][/widget]
[widget=tasklist][/widget]
diff --git a/view/pdl/mod_cal.pdl b/view/pdl/mod_cal.pdl
index 7e15fc869..d7e5d29f3 100644
--- a/view/pdl/mod_cal.pdl
+++ b/view/pdl/mod_cal.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=fullprofile][/widget]
+[widget=profile][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_cards.pdl b/view/pdl/mod_cards.pdl
index f0403e380..fd08121fc 100644
--- a/view/pdl/mod_cards.pdl
+++ b/view/pdl/mod_cards.pdl
@@ -1,4 +1,5 @@
[region=aside]
+[widget=profile][/widget]
[widget=categories][var=cards]1[/var][/widget]
[widget=tasklist][/widget]
[widget=notes][/widget]
diff --git a/view/pdl/mod_chat.pdl b/view/pdl/mod_chat.pdl
index 808ba3d5a..8a79b4b12 100644
--- a/view/pdl/mod_chat.pdl
+++ b/view/pdl/mod_chat.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=vcard][/widget]
+[widget=profile][/widget]
[widget=chatroom_list][/widget]
[widget=bookmarkedchats][/widget]
[widget=suggestedchats][/widget]
diff --git a/view/pdl/mod_cloud.pdl b/view/pdl/mod_cloud.pdl
index 44ef1e4fc..7f40e7ea0 100644
--- a/view/pdl/mod_cloud.pdl
+++ b/view/pdl/mod_cloud.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=vcard][/widget]
+[widget=profile][/widget]
[widget=categories][var=files]1[/var][/widget]
[/region]
[region=right_aside]
diff --git a/view/pdl/mod_connections.pdl b/view/pdl/mod_connections.pdl
index b777cada5..3c3dfd313 100644
--- a/view/pdl/mod_connections.pdl
+++ b/view/pdl/mod_connections.pdl
@@ -1,7 +1,4 @@
[region=aside]
-[widget=follow][/widget]
-[widget=collections][var=mode][connections[/arg][/widget]
-[widget=suggestions][/widget]
[widget=findpeople][/widget]
[/region]
[region=right_aside]
diff --git a/view/pdl/mod_connedit.pdl b/view/pdl/mod_connedit.pdl
index 4bdadb5e8..a5461df50 100644
--- a/view/pdl/mod_connedit.pdl
+++ b/view/pdl/mod_connedit.pdl
@@ -1,8 +1,5 @@
[region=aside]
[widget=vcard][/widget]
-[widget=collections][var=mode]abook[/var][/widget]
-[widget=suggestions][/widget]
-[widget=findpeople][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_directory.pdl b/view/pdl/mod_directory.pdl
index 2e408c29f..3840691b4 100644
--- a/view/pdl/mod_directory.pdl
+++ b/view/pdl/mod_directory.pdl
@@ -2,7 +2,6 @@
[widget=findpeople][/widget]
[widget=dirsort][/widget]
[widget=dirtags][/widget]
-[widget=suggestions][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_group.pdl b/view/pdl/mod_group.pdl
index 34eb7ddd1..749ede18c 100644
--- a/view/pdl/mod_group.pdl
+++ b/view/pdl/mod_group.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=collections][var=mode]groups[/var][/widget]
+[widget=privacygroups][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_import_items.pdl b/view/pdl/mod_import_items.pdl
new file mode 100644
index 000000000..e657fa88b
--- /dev/null
+++ b/view/pdl/mod_import_items.pdl
@@ -0,0 +1,3 @@
+[region=right_aside]
+[widget=notifications][/widget]
+[/region]
diff --git a/view/pdl/mod_network.pdl b/view/pdl/mod_network.pdl
index cac3fc27e..231f08e74 100644
--- a/view/pdl/mod_network.pdl
+++ b/view/pdl/mod_network.pdl
@@ -2,7 +2,6 @@
[widget=activity_order][/widget]
[widget=activity_filter][/widget]
[widget=savedsearch][/widget]
-[widget=suggestions][/widget]
[/region]
[region=content]
diff --git a/view/pdl/mod_message.pdl b/view/pdl/mod_permcats.pdl
index 3f1dd594f..bc6c89920 100644
--- a/view/pdl/mod_message.pdl
+++ b/view/pdl/mod_permcats.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=mailmenu][/widget]
+[widget=permcats][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_photos.pdl b/view/pdl/mod_photos.pdl
index 6a3d30b1c..bdcc087f3 100644
--- a/view/pdl/mod_photos.pdl
+++ b/view/pdl/mod_photos.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=vcard][/widget]
+[widget=profile][/widget]
[widget=photo_albums][/widget]
[/region]
[region=right_aside]
diff --git a/view/pdl/mod_profperm.pdl b/view/pdl/mod_profperm.pdl
index 7e15fc869..d7e5d29f3 100644
--- a/view/pdl/mod_profperm.pdl
+++ b/view/pdl/mod_profperm.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=fullprofile][/widget]
+[widget=profile][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_mail.pdl b/view/pdl/mod_tokens.pdl
index d572b7244..97bdc3ab4 100644
--- a/view/pdl/mod_mail.pdl
+++ b/view/pdl/mod_tokens.pdl
@@ -1,6 +1,5 @@
[region=aside]
-[widget=mailmenu][/widget]
-[widget=conversations][/widget]
+[widget=tokens][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_viewconnections.pdl b/view/pdl/mod_viewconnections.pdl
index 7e15fc869..d7e5d29f3 100644
--- a/view/pdl/mod_viewconnections.pdl
+++ b/view/pdl/mod_viewconnections.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=fullprofile][/widget]
+[widget=profile][/widget]
[/region]
[region=right_aside]
[widget=notifications][/widget]
diff --git a/view/pdl/mod_wiki.pdl b/view/pdl/mod_wiki.pdl
index be86be7e3..db8faa0d9 100644
--- a/view/pdl/mod_wiki.pdl
+++ b/view/pdl/mod_wiki.pdl
@@ -1,5 +1,5 @@
[region=aside]
-[widget=vcard][/widget]
+[widget=profile][/widget]
[widget=wiki_pages][/widget]
[/region]
[region=right_aside]
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index 346e46c6b..cea9b8ae5 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -24,15 +24,15 @@ body {
aside#region_1 {
border-right: 1px solid transparent;
- width: $left_aside_widthpx;
- min-width: $left_aside_widthpx;
- max-width: $left_aside_widthpx;
+ width: $left_aside_widthrem;
+ min-width: $left_aside_widthrem;
+ max-width: $left_aside_widthrem;
}
aside#region_3 {
- width: $right_aside_widthpx;
- min-width: $left_aside_widthpx;
- max-width: $right_aside_widthpx;
+ width: $right_aside_widthrem;
+ min-width: $left_aside_widthrem;
+ max-width: $right_aside_widthrem;
}
aside#left_aside_wrapper,
@@ -43,13 +43,13 @@ aside#right_aside_wrapper {
main {
margin-left: auto;
margin-right: auto;
- max-width: $main_widthpx;
+ max-width: $main_widthrem;
}
#overlay {
position: fixed;
top: 0;
- left: $left_aside_widthpx;
+ left: $left_aside_widthrem;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, .3);
@@ -397,55 +397,26 @@ footer {
.fn {
font-weight: bold;
font-size: 1rem;
- color: #444444;
}
-.vcard {
- margin-bottom: 10px;
- padding: 0px 10px 10px 10px;
+.vcard-card {
background-color: rgba(254,254,254,0.5);
- border: 1px solid rgba(254,254,254,0.5);
- border-radius: $radius;
- word-wrap: break-word;
}
-.vcard dl,
-.vcard .title {
- margin-top: 10px;
- margin-bottom: 0px;
-}
-
-.connect-btn-wrapper {
- margin-bottom: 10px;
-
+.vcard {
+ word-wrap: break-word;
}
.profile-edit-side-link {
- padding: 3px 0px;
opacity: 0;
- filter:alpha(opacity=30);
- float: right;
+ filter:alpha(opacity=0);
}
-.vcard:hover .profile-edit-side-link {
+.card:hover .profile-edit-side-link {
opacity: 1;
filter:alpha(opacity=100);
}
-#profile-photo-wrapper img {
- width: 100%;
- height: 100%;
- max-width: 300px;
- max-height: 300px;
-}
-
-#profile-photo-wrapper {
- width: 251px;
- height: 251px;
- margin-bottom: 10px;
- border-radius: $radius;
-}
-
#hide-friends-yes-label,
#hide-friends-no-label {
margin-left: 125px;
@@ -571,8 +542,8 @@ footer {
}
.contact-block-img {
- width:47px;
- height:47px;
+ width: 2.95rem;
+ height: 2.95rem;
margin-bottom: 3px;
}
@@ -1191,7 +1162,6 @@ img.mail-conv-sender-photo {
.widget {
background-color: rgba(254,254,254,.5);
- border: 1px solid rgba(254,254,254,.5);
border-radius: $radius;
}
@@ -1247,24 +1217,24 @@ img.mail-conv-sender-photo {
}
.menu-img-3 {
- width: 3.3em;
- height: 3.3em;
+ width: 2.7rem;
+ height: 2.7rem;
margin-right: 5px;
border-radius: $radius;
float: left;
}
.menu-img-2 {
- height: 2.2em;
- width: 2.2em;
+ height: 1.8rem;
+ width: 1.8rem;
margin-right: 5px;
border-radius: $radius;
float: left;
}
.menu-img-1 {
- height: 1.28571429em;
- width: 1.28571429em;
+ height: 1.1rem;
+ width: 1.1rem;
border-radius: $radius;
}
@@ -1530,8 +1500,8 @@ blockquote {
}
main {
- left: -$left_aside_widthpx;
- width: calc( 100% + $left_aside_widthpx );
+ left: -$left_aside_widthrem;
+ width: calc( 100% + $left_aside_widthrem );
}
main.region_1-on {
@@ -1700,7 +1670,7 @@ dl.bb-dl > dd > li {
.onoffswitch.checkbox > div > input:checked + label .onoffswitch-switch {
right: 0px;
- background-color: #0275d8;
+ background-color: $link_colour;
}
@@ -1808,7 +1778,7 @@ dl.bb-dl > dd > li {
.oneway-overlay {
position: absolute;
- text-shadow: -2px 0 1px #fff, 0 2px 1px#fff, 2px 0 1px #fff, 0 -2px 1px #fff;
+ text-shadow: -1px 0 1px #fff, 0 1px 1px#fff, 1px 0 1px #fff, 0 -1px 1px #fff;
}
.cover-photo-review {
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index 0a779529d..0de475fe5 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -32,7 +32,7 @@ class RedbasicConfig {
}
function get() {
- if(! local_channel()) {
+ if(! local_channel()) {
return;
}
@@ -59,7 +59,7 @@ class RedbasicConfig {
}
function post() {
- if(!local_channel()) {
+ if(!local_channel()) {
return;
}
@@ -89,7 +89,7 @@ class RedbasicConfig {
if(get_pconfig(local_channel(), 'redbasic', 'advanced_theming'))
$expert = 1;
-
+
$o .= replace_macros(get_markup_template('theme_settings.tpl'), array(
'$submit' => t('Submit'),
'$baseurl' => z_root(),
@@ -98,19 +98,19 @@ class RedbasicConfig {
'$title' => t("Theme settings"),
'$narrow_navbar' => array('redbasic_narrow_navbar',t('Narrow navbar'),$arr['narrow_navbar'], '', array(t('No'),t('Yes'))),
'$nav_bg' => array('redbasic_nav_bg', t('Navigation bar background color'), $arr['nav_bg']),
- '$nav_icon_colour' => array('redbasic_nav_icon_colour', t('Navigation bar icon color '), $arr['nav_icon_colour']),
+ '$nav_icon_colour' => array('redbasic_nav_icon_colour', t('Navigation bar icon color '), $arr['nav_icon_colour']),
'$nav_active_icon_colour' => array('redbasic_nav_active_icon_colour', t('Navigation bar active icon color '), $arr['nav_active_icon_colour']),
'$link_colour' => array('redbasic_link_colour', t('Link color'), $arr['link_colour'], '', $link_colours),
'$banner_colour' => array('redbasic_banner_colour', t('Set font-color for banner'), $arr['banner_colour']),
'$bgcolour' => array('redbasic_background_colour', t('Set the background color'), $arr['bgcolour']),
- '$background_image' => array('redbasic_background_image', t('Set the background image'), $arr['background_image']),
+ '$background_image' => array('redbasic_background_image', t('Set the background image'), $arr['background_image']),
'$item_colour' => array('redbasic_item_colour', t('Set the background color of items'), $arr['item_colour']),
'$comment_item_colour' => array('redbasic_comment_item_colour', t('Set the background color of comments'), $arr['comment_item_colour']),
'$font_size' => array('redbasic_font_size', t('Set font-size for the entire application'), $arr['font_size'], t('Examples: 1rem, 100%, 16px')),
'$font_colour' => array('redbasic_font_colour', t('Set font-color for posts and comments'), $arr['font_colour']),
'$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius'], t('Example: 4px')),
'$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
- '$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in pixel'),$arr['converse_width'], t('Leave empty for default width')),
+ '$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in rem'),$arr['converse_width'], t('Leave empty for default width')),
'$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']),
'$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']),
'$advanced_theming' => ['redbasic_advanced_theming', t('Show advanced settings'), $arr['advanced_theming'], '', [t('No'), t('Yes')]]
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 3ea94f9aa..9cb835ec6 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -75,7 +75,7 @@ if ((!$schema) || ($schema == '---')) {
if (! $nav_bg)
$nav_bg = '#343a40';
if (! $nav_icon_colour)
- $nav_icon_colour = 'rgba(255, 255, 255, 0.5)';
+ $nav_icon_colour = 'rgba(255, 255, 255, 0.55)';
if (! $nav_active_icon_colour)
$nav_active_icon_colour = 'rgba(255, 255, 255, 0.75)';
if (! $link_colour)
@@ -101,7 +101,7 @@ if (! $radius)
if (! $shadow)
$shadow = '0';
if (! $converse_width)
- $converse_width = '790';
+ $converse_width = '52'; //unit: rem
if(! $top_photo)
$top_photo = '2.3rem';
if(! $reply_photo)
@@ -120,13 +120,13 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
$x .= $schemecss;
}
- $left_aside_width = 288;
- $right_aside_width = 288;
+ $left_aside_width = 21; //unit: rem
+ $right_aside_width = 21; //unit: rem
$main_width = $left_aside_width + $right_aside_width + intval($converse_width);
// prevent main_width smaller than 768px
- $main_width = (($main_width < 768) ? 768 : $main_width);
+ $main_width = (($main_width < 30) ? 30 : $main_width);
$options = array (
'$nav_bg' => $nav_bg,
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index 3c07e1582..783bd9d4e 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -3,12 +3,14 @@
/**
* * Name: Redbasic
* * Description: Hubzilla standard theme
- * * Version: 2.1
- * * MinVersion: 5.9
- * * MaxVersion: 7.0
+ * * Version: 2.2
+ * * MinVersion: 6.5.13
+ * * MaxVersion: 8.0
* * Author: Fabrixxm
* * Maintainer: Mike Macgirvin
* * Maintainer: Mario Vavti
+ * * Theme_Color: #343a40
+ * * Background_Color: rgb(254,254,254)
*/
function redbasic_init(&$a) {
diff --git a/view/theme/redbasic/schema/Focus-Boxy.css b/view/theme/redbasic/schema/Focus-Boxy.css
index b9b259796..90fd51b02 100644
--- a/view/theme/redbasic/schema/Focus-Boxy.css
+++ b/view/theme/redbasic/schema/Focus-Boxy.css
@@ -3,13 +3,31 @@
}
.wall-item-content-wrapper.comment {
- border-bottom: 1px solid #dee2e6;
+ border-bottom: 1px solid rgba(0,0,0,.125);
}
.widget {
- border: 1px solid #dee2e6;
+ border: 1px solid rgba(0,0,0,.125);
}
#note-text {
border: 1px solid transparent;
}
+
+.vcard-card {
+ border: 1px solid rgba(0,0,0,.125);
+ border-bottom: 0;
+}
+
+.vcard-card .card {
+ border-top: 0;
+ border-right: 0;
+ border-left: 0;
+}
+
+.vcard-card .vcard {
+ border: 1px solid rgba(0,0,0,.125);
+ border-top: 0;
+ border-right: 0;
+ border-left: 0;
+}
diff --git a/view/theme/redbasic/schema/dark.php b/view/theme/redbasic/schema/dark.php
index af4b122f1..18e92ac93 100644
--- a/view/theme/redbasic/schema/dark.php
+++ b/view/theme/redbasic/schema/dark.php
@@ -1,5 +1,5 @@
<?php
-
+
if (! $nav_bg)
$nav_bg = "#000";
if (! $nav_gradient_top)
@@ -35,7 +35,7 @@
if (! $font_colour)
$font_colour = "#ccc";
if (! $converse_width)
- $converse_width = "1024";
-
+ $converse_width = '52'; //unit: rem;
+
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 686b40a54..28631ed68 100644
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -24,6 +24,7 @@
{{if $abook_prev || $abook_next}}
<div class="btn-group">
<a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_prev}} disabled{{/if}}" ><i class="fa fa-backward"></i></a>
+ {{if $sections}}
<div class="btn-group" >
<button class="btn btn-outline-secondary btn-sm{{if $is_pending}} disabled{{/if}}" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-bars"></i></button>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="dLabel">
@@ -32,6 +33,7 @@
{{/foreach}}
</div>
</div>
+ {{/if}}
<a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_next}} disabled{{/if}}" ><i class="fa fa-forward"></i></a>
</div>
{{/if}}
@@ -40,6 +42,65 @@
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
+ <form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" >
+
+ <input type="hidden" name="contact_id" value="{{$contact_id}}">
+ <input type="hidden" name="section" value="{{$section}}">
+
+ <div class="section-content-wrapper">
+ <a href="permcats/{{$permcat_value}}" class="float-end"><i class="fa fa-external-link"></i>&nbsp;{{$permcat_new}}</a>
+ {{include file="field_select.tpl" field=$permcat}}
+ <button type="button" class="btn btn-outline-secondary float-end" data-bs-toggle="modal" data-bs-target="#perms_modal">Permissions</button>
+ <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
+ <div class="modal" id="perms_modal" tabindex="-1" aria-labelledby="perms_modal_label" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <div class="modal-title h3" id="perms_modal_label">Permissions Overview</div>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+
+ <table class="table table-hover table-sm">
+ <thead>
+ <tr>
+ <th scope="col">Permission</th>
+ <th scope="col">{{$them}}</th>
+ <th scope="col">{{$me}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{foreach $perms as $perm}}
+ <tr>
+ <td>{{$perm.1}}</td>
+ <td>
+ {{if $perm.2}}
+ <i class="fa fa-check text-success"></i>
+ {{else}}
+ <i class="fa fa-times text-danger"></i>
+ {{/if}}
+ </td>
+ <td>
+ {{if $perm.3}}
+ <i class="fa fa-check text-success"></i>
+ {{else}}
+ <i class="fa fa-times text-danger"></i>
+ {{/if}}
+ </td>
+ </tr>
+ {{/foreach}}
+
+ </tbody>
+ </table>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
{{if $notself}}
{{foreach $tools as $tool}}
{{if $tool.info}}
@@ -73,33 +134,9 @@
</div>
{{/if}}
- <form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" >
-
- <input type="hidden" name="contact_id" value="{{$contact_id}}">
- <input type="hidden" name="section" value="{{$section}}">
-
<div class="panel-group" id="contact-edit-tools" role="tablist" aria-multiselectable="true">
{{if $notself}}
- {{if $is_pending}}
- <div class="panel">
- <div class="section-subtitle-wrapper" role="tab" id="pending-tool">
- <h3>
- <a data-bs-toggle="collapse" data-bs-parent="#contact-edit-tools" href="#pending-tool-collapse" aria-expanded="true" aria-controls="pending-tool-collapse">
- {{$pending_label}}
- </a>
- </h3>
- </div>
- <div id="pending-tool-collapse" class="panel-collapse collapse show" role="tabpanel" aria-labelledby="pending-tool">
- <div class="section-content-tools-wrapper">
- {{include file="field_checkbox.tpl" field=$unapproved}}
- <div class="settings-submit-wrapper" >
- <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
- </div>
- </div>
- </div>
- </div>
- {{/if}}
{{if ! $is_pending}}
<div id="template-form-vcard-org" class="mb-3 form-vcard-org">
<div class="mb-3 form-vcard-org">
@@ -438,85 +475,6 @@
<input type="hidden" name="{{$excl.0}}" value="{{$excl.2}}" />
{{/if}}
- {{if $rating}}
- <div class="panel">
- <div class="section-subtitle-wrapper" role="tab" id="rating-tool">
- <h3>
- <a data-bs-toggle="collapse" data-bs-parent="#contact-edit-tools" href="#rating-tool-collapse" aria-expanded="true" aria-controls="rating-tool-collapse">
- {{$lbl_rating}}
- </a>
- </h3>
- </div>
- <div id="rating-tool-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="rating-tool">
- <div class="section-content-tools-wrapper">
- <div class="section-content-warning-wrapper">
- {{$rating_info}}
- </div>
- <div class="mb-3"><strong>{{$lbl_rating_label}}</strong></div>
- {{$rating}}
- {{include file="field_textarea.tpl" field=$rating_text}}
- <input id="contact-rating-mirror" type="hidden" name="rating" value="{{$rating_val}}" />
- <div class="settings-submit-wrapper" >
- <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
- </div>
- </div>
- </div>
- </div>
- {{/if}}
-
- {{/if}}
-
- {{if ! $is_pending}}
- <div class="panel">
- {{if $notself}}
- <div class="section-subtitle-wrapper" role="tab" id="perms-tool">
- <h3>
- <a data-bs-toggle="collapse" data-bs-parent="#contact-edit-tools" href="#perms-tool-collapse" aria-expanded="true" aria-controls="perms-tool-collapse">
- {{$permlbl}}
- </a>
- </h3>
- </div>
- {{/if}}
- <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} show{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
- <div class="section-content-tools-wrapper">
- <div class="section-content-warning-wrapper">
- {{if $notself}}{{$permnote}}{{/if}}
- {{if $self}}{{$permnote_self}}{{/if}}
- </div>
-
- {{if $permcat_enable}}
- <a href="permcats" class="float-end"><i class="fa fa-plus"></i>&nbsp;{{$permcat_new}}</a>
- {{include file="field_select.tpl" field=$permcat}}
- {{/if}}
-
- <table id="perms-tool-table" class=mb-3>
- <tr>
- <td></td>
- {{if $notself}}
- <td class="abook-them">{{$them}}</td>
- {{/if}}
- <td colspan="2" class="abook-me">{{$me}}</td>
- </tr>
- {{foreach $perms as $prm}}
- {{include file="field_acheckbox.tpl" field=$prm}}
- {{/foreach}}
- </table>
-
- {{if $self}}
- <div>
- <div class="section-content-info-wrapper">
- {{$autolbl}}
- </div>
- {{include file="field_checkbox.tpl" field=$autoperms}}
- </div>
- {{/if}}
-
- <div class="settings-submit-wrapper" >
- <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
- </div>
- </div>
- </div>
- </div>
{{/if}}
</div>
</form>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index 6882c3b8a..fa942baff 100644
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -31,7 +31,7 @@
<h3>{{$registration}}</h3>
{{include file="field_input.tpl" field=$register_text}}
- {{include file="field_select_grouped.tpl" field=$role}}
+ {{include file="field_select.tpl" field=$role}}
{{include file="field_select.tpl" field=$register_policy}}
{{** include file="field_checkbox.tpl" field=$register_wo_email **}}
{{include file="register_duty.tpl" field=$register_duty}}
diff --git a/view/tpl/connection_template.tpl b/view/tpl/connection_template.tpl
index e7ab559cb..a7f0f8759 100644
--- a/view/tpl/connection_template.tpl
+++ b/view/tpl/connection_template.tpl
@@ -1,23 +1,20 @@
<div id="contact-entry-wrapper-{{$contact.id}}">
<div class="section-subtitle-wrapper clearfix">
<div class="float-end">
- {{if $contact.approve && $contact.ignore}}
- <form action="connedit/{{$contact.id}}" method="post" >
- <button type="submit" class="btn btn-success btn-sm" name="pending" value="1" title="{{$contact.approve_hover}}"><i class="fa fa-check"></i> {{$contact.approve}}</button>
-
- <a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-sm" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
-
- {{/if}}
- {{if $contact.connect}}
- <a href="{{$contact.follow}}" class="btn btn-success btn-sm" title="{{$contact.connect_hover}}"><i class="fa fa-plus"></i> {{$contact.connect}}</a>
- {{/if}}
- <a href="#" class="btn btn-danger btn-sm contact-delete-btn" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
- <a href="{{$contact.link}}" class="btn btn-outline-secondary btn-sm" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i> {{$contact.edit}}</a>
- {{if $contact.approve}}
- </form>
+ {{if $contact.status}}
+ {{foreach $contact.states as $state}}
+ <span class="badge rounded-pill bg-danger text-white me-1" title="">{{$state}}</span>
+ {{/foreach}}
{{/if}}
+ <span id="contact-role-{{$contact.id}}" class="badge rounded-pill bg-warning text-dark me-1" title="{{$role_label}}">{{$contact.role}}</span>
+ <button type="button" class="btn btn-outline-secondary btn-sm contact-edit" title="{{$contact.edit_hover}}" data-id="{{$contact.id}}">
+ <i id="edit-icon-{{$contact.id}}" class="fa fa-fw fa-pencil"></i>
+ <div id="edit-rotator-{{$contact.id}}" class="spinner-wrapper" style="vertical-align: text-bottom; margin-right: 2px"><div class="spinner s"></div></div>
+ {{$contact.edit}}
+ </button>
+
</div>
- <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-outline-secondary btn-sm" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
+ <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o" title="{{$group_label}}"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-outline-secondary btn-sm" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
</div>
<div class="section-content-tools-wrapper">
<div class="contact-photo-wrapper" >
@@ -27,11 +24,11 @@
{{include "connstatus.tpl" perminfo=$contact.perminfo}}
</div>
<div class="contact-info">
- {{if $contact.status}}
+ {{** if $contact.status}}
<div class="contact-info-element">
<span class="contact-info-label">{{$contact.status_label}}:</span> {{$contact.status}}
</div>
- {{/if}}
+ {{/if **}}
{{if $contact.connected}}
<div class="contact-info-element">
<span class="contact-info-label">{{$contact.connected_label}}:</span> <span class="autotime" title="{{$contact.connected}}"></span>
@@ -47,6 +44,9 @@
<span class="contact-info-label">{{$contact.network_label}}:</span> {{$contact.network}} - <a href="{{$contact.recentlink}}" rel="nofollow noopener">{{$contact.recent_label}}</a>
</div>
{{/if}}
+ {{if $contact.connect}}
+ <a href="{{$contact.follow}}" class="btn btn-success btn-sm" title="{{$contact.connect_hover}}"><i class="fa fa-plus"></i> {{$contact.connect}}</a>
+ {{/if}}
</div>
</div>
diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl
index 1719a6522..5fec38a84 100644
--- a/view/tpl/connections.tpl
+++ b/view/tpl/connections.tpl
@@ -1,7 +1,10 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper clearfix">
<div class="dropdown float-end">
- <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); $('#contacts-search').focus();">
+ <button type="button" class="btn btn-success btn-sm" onclick="openClose('contacts-follow-form'); closeMenu('contacts-search-form'); $('#contacts-follow').focus();">
+ <i class="fa fa-plus"></i>&nbsp;Add
+ </button>
+ <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); closeMenu('contacts-follow-form'); $('#contacts-search').focus();">
<i class="fa fa-search"></i>&nbsp;{{$label}}
</button>
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
@@ -16,10 +19,23 @@
{{if $finding}}<h2>{{$finding}}</h2>{{else}}<h2>{{$header}}{{if $total}} ({{$total}}){{/if}}</h2>{{/if}}
</div>
<div id="contacts-search-form" class="section-content-tools-wrapper">
- <form action="{{$cmd}}" method="get" id="mimimi" name="contacts-search-form">
+ <form action="{{$cmd}}" method="get" name="contacts-search-form">
<div class="input-group mb-3">
<input type="text" name="search" id="contacts-search" class="form-control" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" />
- <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit"><i class="fa fa-fw fa-search"></i></button>
+ <button id="contacts-search-submit" class="btn btn-primary" type="submit"><i class="fa fa-fw fa-search"></i></button>
+ </div>
+ </form>
+ </div>
+ <div id="contacts-follow-form" class="section-content-tools-wrapper">
+ {{if $abook_usage_message}}
+ <div class="section-conten-info-wrapper">
+ {{$abook_usage_message}}
+ </div>
+ {{/if}}
+ <form action="follow" method="post">
+ <div class="input-group mb-3">
+ <input class="form-control" id="contacts-follow" type="text" name="url" title="Examples: bob@example.com, https://example.com/barbara" placeholder="Enter channel address">
+ <button class="btn btn-success" type="submit" name="submit" value="Connect" title="Connect"><i class="fa fa-fw fa-plus"></i></button>
</div>
</form>
</div>
@@ -34,3 +50,5 @@
<div id="page-spinner" class="spinner-wrapper">
<div class="spinner m"></div>
</div>
+{{include file="contact_edit_modal.tpl"}}
+
diff --git a/view/tpl/connstatus.tpl b/view/tpl/connstatus.tpl
index 667775f3a..30f450820 100644
--- a/view/tpl/connstatus.tpl
+++ b/view/tpl/connstatus.tpl
@@ -1 +1 @@
-<i class="fa fa-fw fa-comments oneway-overlay text-{{if $perminfo.connpermcount == 3}}success{{elseif $perminfo.connpermcount > 0}}warning{{else}}danger{{/if}}" title="{{$perminfo.connperms}}"></i>
+<i class="fa fa-circle oneway-overlay text-{{if $perminfo.connpermcount == 3}}success{{elseif $perminfo.connpermcount > 0}}warning{{else}}danger{{/if}}" title="{{$perminfo.connperms}}"></i>
diff --git a/view/tpl/contact_edit.tpl b/view/tpl/contact_edit.tpl
new file mode 100644
index 000000000..3c4ed2ffe
--- /dev/null
+++ b/view/tpl/contact_edit.tpl
@@ -0,0 +1,133 @@
+<form id="contact-edit-form" action="contactedit/{{$contact_id}}" method="post" >
+ <div id="contact-edit-tools" class="panel-group" role="tablist" >
+ <div class="panel">
+ <div class="section-subtitle-wrapper" role="tab" id="roles-tool">
+ <h3>
+ <a class="section" data-bs-toggle="collapse" data-bs-target="#roles-tool-collapse" href="#" aria-expanded="true" aria-controls="roles-tool-collapse" data-section="roles">
+ Roles
+ </a>
+ </h3>
+ </div>
+ <div id="roles-tool-collapse" class="panel-collapse collapse{{if $section == 'roles'}} show{{/if}}" role="tabpanel" aria-labelledby="roles-tool" data-bs-parent="#contact-edit-tools">
+ <div class="section-content-tools-wrapper">
+ {{include file="field_select.tpl" field=$permcat}}
+ <button class="btn btn-outline-secondary btn-sm float-end sub_section{{if $sub_section == 'perms'}} sub_section_active{{/if}}" type="button" onclick="openClose('perms-table', 'table')" data-section="perms">
+ Compare permissions
+ </button>
+ <a href="permcats/{{$permcat_value}}" class="btn btn-sm btn-outline-primary">
+ <i class="fa fa-external-link"></i>&nbsp;{{$permcat_new}}
+ </a>
+ <table id="perms-table" class="table table-hover table-sm mt-3" style="display: {{if $sub_section == 'perms'}}table{{else}}none{{/if}};">
+ <thead>
+ <tr class="w-100">
+ <th scope="col">Permission</th>
+ <th scope="col">{{$them}}</th>
+ <th scope="col">{{$me}}</th>
+ </tr>
+ </thead>
+ <tbody>
+ {{foreach $perms as $perm}}
+ <tr>
+ <td>{{$perm.1}}</td>
+ <td>
+ {{if $perm.2}}
+ <i class="fa fa-check text-success"></i>
+ {{else}}
+ <i class="fa fa-times text-danger"></i>
+ {{/if}}
+ </td>
+ <td>
+ {{if $perm.3}}
+ <i class="fa fa-check text-success"></i>
+ {{else}}
+ <i class="fa fa-times text-danger"></i>
+ {{/if}}
+ </td>
+ </tr>
+ {{/foreach}}
+
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ {{if $groups}}
+ <div class="panel">
+ <div class="section-subtitle-wrapper" role="tab" id="group-tool">
+ <h3>
+ <a class="section" data-bs-toggle="collapse" data-bs-target="#group-tool-collapse" href="#" aria-expanded="true" aria-controls="group-tool-collapse" data-section="group">
+ Privacy groups
+ </a>
+ </h3>
+ </div>
+ <div id="group-tool-collapse" class="panel-collapse collapse{{if $section == 'group'}} show{{/if}}" role="tabpanel" aria-labelledby="group-tool" data-bs-parent="#contact-edit-tools">
+ <div class="section-content-tools-wrapper clearfix">
+ {{foreach $groups as $group}}
+ {{include file="field_checkbox.tpl" field=$group}}
+ {{/foreach}}
+ <a href="group/new" class="btn btn-sm btn-outline-primary">
+ <i class="fa fa-external-link"></i>&nbsp;Privacy groups
+ </a>
+ </div>
+ </div>
+ </div>
+ {{/if}}
+ {{if $multiprofs}}
+ <div class="panel">
+ <div class="section-subtitle-wrapper" role="tab" id="profile-tool">
+ <h3>
+ <a class="section" data-bs-toggle="collapse" data-bs-target="#profile-tool-collapse" href="#" aria-expanded="true" aria-controls="profile-tool-collapse" data-section="profile">
+ Profiles
+ </a>
+ </h3>
+ </div>
+ <div id="profile-tool-collapse" class="panel-collapse collapse{{if $section == 'profile'}} show{{/if}}" role="tabpanel" aria-labelledby="profile-tool" data-bs-parent="#contact-edit-tools">
+ <div class="section-content-tools-wrapper">
+ {{$profile_select}}
+ <a href="profiles" class="btn btn-sm btn-outline-primary">
+ <i class="fa fa-external-link"></i>&nbsp;Profiles
+ </a>
+ </div>
+ </div>
+ </div>
+ {{/if}}
+ {{if $slide}}
+ <div class="panel">
+ <div class="section-subtitle-wrapper" role="tab" id="affinity-tool">
+ <h3>
+ <a class="section" data-bs-toggle="collapse" data-bs-target="#affinity-tool-collapse" href="#" aria-expanded="true" aria-controls="affinity-tool-collapse" data-section="affinity">
+ Affinity
+ </a>
+ </h3>
+ </div>
+ <div id="affinity-tool-collapse" class="panel-collapse collapse{{if $section == 'affinity'}} show{{/if}}" role="tabpanel" aria-labelledby="affinity-tool" data-bs-parent="#contact-edit-tools">
+ <div class="section-content-tools-wrapper">
+ <div class="mb-2"><label>{{$lbl_slider}}</label></div>
+ {{$slide}}
+ <input id="contact-closeness-mirror" type="hidden" name="closeness" value="{{$close}}" />
+ </div>
+ </div>
+ </div>
+ {{/if}}
+ {{if $connfilter}}
+ <div class="panel">
+ <div class="section-subtitle-wrapper" role="tab" id="filter-tool">
+ <h3>
+ <a class="section" data-bs-toggle="collapse" data-bs-target="#filter-tool-collapse" href="#" aria-expanded="true" aria-controls="filter-tool-collapse" data-section="filter">
+ Content filter
+ </a>
+ </h3>
+ </div>
+ <div id="filter-tool-collapse" class="panel-collapse collapse{{if $section == 'filter'}} show{{/if}}" role="tabpanel" aria-labelledby="filter-tool" data-bs-parent="#contact-edit-tools">
+ <div class="section-content-tools-wrapper">
+ {{include file="field_textarea.tpl" field=$incl}}
+ {{include file="field_textarea.tpl" field=$excl}}
+ </div>
+ </div>
+ </div>
+ {{else}}
+ <input type="hidden" name="{{$incl.0}}" value="{{$incl.2}}" />
+ <input type="hidden" name="{{$excl.0}}" value="{{$excl.2}}" />
+ {{/if}}
+ </div>
+</form>
diff --git a/view/tpl/contact_edit_header.tpl b/view/tpl/contact_edit_header.tpl
new file mode 100644
index 000000000..997d294bd
--- /dev/null
+++ b/view/tpl/contact_edit_header.tpl
@@ -0,0 +1,9 @@
+<div class="float-start me-2">
+ <a href="{{$href}}" title="{{$link_label}}" target="_blank">
+ <img src="{{$img_src}}" class="rounded" style="width: 3rem; height: 3rem;" />
+ </a>
+</div>
+<div class="m-1">
+ <div class="text-truncate h3 m-0"><strong>{{if $is_group}}<i class="fa fa-comments-o" title="{{$group_label}}"></i> {{/if}}{{$name}}</strong></div>
+ <div class="text-truncate text-muted">{{$addr}}</div>
+</div>
diff --git a/view/tpl/contact_edit_modal.tpl b/view/tpl/contact_edit_modal.tpl
new file mode 100644
index 000000000..a046456d9
--- /dev/null
+++ b/view/tpl/contact_edit_modal.tpl
@@ -0,0 +1,154 @@
+<div id="edit-modal" class="modal" tabindex="-1">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <div id="edit-modal-title" class="modal-title w-75">
+ <div class="placeholder-wave">
+ <span class="placeholder placeholder-lg" style="width: 200px;"></span>
+ </div>
+ </div>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div id="edit-modal-body" class="modal-body">
+ <div class="placeholder-wave">
+ <span class="placeholder placeholder-lg w-100 mb-4"></span>
+ <span class="placeholder placeholder-lg w-100 mb-4"></span>
+ <span class="placeholder placeholder-lg w-100 mb-4"></span>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <div id="edit-modal-tools" class="me-auto"></div>
+ <button id="contact-save" type="button" class="btn btn-primary"></button>
+ </div>
+ </div>
+ </div>
+</div>
+<script>
+ let poi;
+ let section = 'roles';
+ let sub_section;
+
+
+ $('#edit-modal').on('hidden.bs.modal', function (e) {
+ if (window.location.hash) {
+ history.replaceState(null, '', 'connections');
+ }
+ })
+
+ if (window.location.hash) {
+ poi = window.location.hash.substr(1);
+ init_contact_edit(poi);
+ }
+
+ window.onhashchange = function() {
+ if (window.location.hash) {
+ poi = window.location.hash.substr(1);
+ init_contact_edit(poi);
+ }
+ };
+
+
+ $(document).on('click', '.contact-edit', function (e) {
+ e.preventDefault();
+ poi = this.dataset.id
+ init_contact_edit(poi);
+ });
+
+ $(document).on('click', '#contact-save', function () {
+ let form_data = $('#contact-edit-form').serialize() + '&section=' + section + '&sub_section=' + sub_section;
+
+ $.post('contactedit/' + poi, form_data, function(data) {
+ if (!data.success) {
+ $.jGrowl(data.message, {sticky: false, theme: 'notice', life: 10000});
+ return;
+ }
+ activate(data);
+ $.jGrowl(data.message, {sticky: false, theme: ((data.success) ? 'info' : 'notice'), life: ((data.success) ? 3000 : 10000)});
+ // $('#edit-modal').modal('hide');
+ });
+
+ });
+
+ $(document).on('click', '.contact-tool', function (e) {
+ e.preventDefault();
+ let cmd = this.dataset.cmd;
+
+ $.get('contactedit/' + poi + '/' + cmd, function(data) {
+ $('#edit-modal-tools').html(data.tools);
+ $.jGrowl(data.message, {sticky: false, theme: ((data.success) ? 'info' : 'notice'), life: ((data.success) ? 3000 : 10000)});
+ if (cmd === 'drop') {
+ if ($('#contact-entry-wrapper-' + poi).length) {
+ $('#contact-entry-wrapper-' + poi).fadeOut();
+ }
+ $('#edit-modal').modal('hide');
+ }
+ });
+ });
+
+ $(document).on('click', '.section', function () {
+ section = this.dataset.section;
+ sub_section = '';
+ });
+
+ $(document).on('click', '.sub_section', function () {
+ if ($(this).hasClass('sub_section_active')) {
+ $(this).removeClass('sub_section_active');
+ sub_section = '';
+ }
+ else {
+ $(this).addClass('sub_section_active');
+ sub_section = this.dataset.section;
+ }
+ });
+
+ function init_contact_edit(poi) {
+ if (!poi)
+ return
+ $('#edit-rotator-' + poi).addClass('d-inline-block');
+ $('#edit-icon-' + poi).hide();
+ $.get('contactedit/' + poi, function(data) {
+ if (!data.success) {
+ $.jGrowl(data.message, {sticky: false, theme: 'notice', life: 10000});
+ return;
+ }
+ $('#edit-modal').modal('show');
+ activate(data);
+ });
+ }
+
+ function activate(data) {
+ $('#contact-save').removeClass('disabled');
+ $('#contact-tools').removeClass('disabled');
+ $('#edit-rotator-' + poi).removeClass('d-inline-block');
+ $('#edit-icon-' + poi).show();
+
+ if (data.title) {
+ $('#edit-modal-title').html(data.title);
+ }
+
+ if (data.body) {
+ $('#edit-modal-body').html(data.body);
+ }
+
+ if (data.tools) {
+ $('#edit-modal-tools').html(data.tools);
+ }
+
+ if (data.submit) {
+ $('#contact-save').html(data.submit);
+ }
+
+ if (data.role && $('#contact-role-' + poi).length) {
+ $('#contact-role-' + poi).html(data.role);
+ }
+
+ if (data.pending) {
+ $('#contact-save').removeClass('btn-primary');
+ $('#contact-save').addClass('btn-success');
+ }
+ else {
+ $('#contact-save').addClass('btn-primary');
+ $('#contact-save').removeClass('btn-success');
+ }
+ }
+</script>
diff --git a/view/tpl/contact_edit_tools.tpl b/view/tpl/contact_edit_tools.tpl
new file mode 100644
index 000000000..565b9df86
--- /dev/null
+++ b/view/tpl/contact_edit_tools.tpl
@@ -0,0 +1,14 @@
+<button id="contact-tools" class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
+</button>
+<div class="dropdown-menu">
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.refresh.title}}" data-cmd="refresh">{{$tools.refresh.label}}</a>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.rephoto.title}}" data-cmd="resetphoto">{{$tools.rephoto.label}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.block.title}}" data-cmd="block">{{$tools.block.label}}</a>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.ignore.title}}" data-cmd="ignore">{{$tools.ignore.label}}</a>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.archive.title}}" data-cmd="archive">{{$tools.archive.label}}</a>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.hide.title}}" data-cmd="hide">{{$tools.hide.label}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item contact-tool" href="#" title="{{$tools.delete.title}}" data-cmd="drop">{{$tools.delete.label}}</a>
+</div>
diff --git a/view/tpl/conv_frame.tpl b/view/tpl/conv_frame.tpl
index c28bb732a..4237c671b 100644
--- a/view/tpl/conv_frame.tpl
+++ b/view/tpl/conv_frame.tpl
@@ -18,3 +18,4 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+{{include file="contact_edit_modal.tpl"}}
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 7c3505410..e9d5e3c63 100644
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -36,11 +36,14 @@
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
<img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" loading="lazy" data-bs-toggle="dropdown" />
+ {{if $item.author_is_group_actor}}
+ <i class="fa fa-comments-o wall-item-photo-group-actor" title="{{$item.author_is_group_actor}}"></i>
+ {{/if}}
{{if $item.thread_author_menu}}
<i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-bs-toggle="dropdown"></i>
<div class="dropdown-menu">
{{foreach $item.thread_author_menu as $mitem}}
- <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
+ <a class="dropdown-item{{if $mitem.class}} {{$mitem.class}}{{/if}}" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}}{{if $mitem.data}} {{$mitem.data}}{{/if}}>{{$mitem.title}}</a>
{{/foreach}}
</div>
{{/if}}
@@ -48,7 +51,7 @@
</div>
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else}}fa-lock{{/if}} lockview{{if $item.privacy_warning}} text-danger{{/if}}" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else if $item.locktype == 1}}fa-lock{{else}}fa-unlock{{/if}} lockview{{if $item.privacy_warning}} text-danger{{/if}}" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
<div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl
index a20a6de8d..0463afdcb 100644
--- a/view/tpl/conv_list.tpl
+++ b/view/tpl/conv_list.tpl
@@ -30,6 +30,9 @@
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
<img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-bs-toggle="dropdown" loading="lazy" /></a>
+ {{if $item.author_is_group_actor}}
+ <i class="fa fa-comments-o wall-item-photo-group-actor" title="{{$item.author_is_group_actor}}"></i>
+ {{/if}}
{{if $item.thread_author_menu}}
<i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-bs-toggle="dropdown"></i>
<div class="dropdown-menu">
@@ -43,7 +46,7 @@
</div>
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else}}fa-lock{{/if}} lockview" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else if $item.locktype == 1}}fa-lock{{else}}fa-unlock{{/if}} lockview{{if $item.privacy_warning}} text-danger{{/if}}" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
<div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
diff --git a/view/tpl/conversation.tpl b/view/tpl/conversation.tpl
index 82c7be922..6729cf55c 100644
--- a/view/tpl/conversation.tpl
+++ b/view/tpl/conversation.tpl
@@ -9,10 +9,10 @@
<div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
{{/if}}
{{if $item.comment_lastcollapsed}}</div>{{/if}}
-
+
{{include file="{{$item.template}}"}}
-
-
+
+
{{/foreach}}
</div>
{{/foreach}}
diff --git a/view/tpl/field_acheckbox.tpl b/view/tpl/field_acheckbox.tpl
index 4c8b62f36..44f65fefd 100644
--- a/view/tpl/field_acheckbox.tpl
+++ b/view/tpl/field_acheckbox.tpl
@@ -1,24 +1,31 @@
-<tr class="highlight">
+<tr>
<td>
- <label class="mainlabel" for='me_id_{{$field.0}}'>{{$field.1}}</label><br>
- <span class='field_abook_help'>{{$field.6}}</span>
+ <label class="mainlabel" for="me_id_{{$field.0}}">{{$field.1}}</label>
+ <span class="field_abook_help">{{$field.6}}</span>
</td>
- {{if $notself}}
- <td class="abook-them">
- {{if $field.2 == 1}}<i class="fa fa-check-square-o"></i>{{/if}}
- {{if $field.2 == 0}}<i class="fa fa-square-o"></i>{{/if}}
- </td>
- {{/if}}
- <td class="abook-me">
- {{if $self || !$field.5 }}
- <input type="checkbox" name='{{$field.0}}' class='abook-edit-me' id='me_id_{{$field.0}}' value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} />
- {{/if}}
- {{if $notself && $field.5}}
- <input type="hidden" name='{{$field.0}}' value="{{if $field.7}}1{{else}}0{{/if}}" />
- {{if $field.3}}<i class="fa fa-check-square-o"></i>{{else}}<i class="fa fa-square-o"></i>{{/if}}
+ <td>
+ {{if $field.5}}
+ <span class="text-nowrap text-danger">
+ {{$inherited}}
+ {{if $field.7}}
+ <i class="fa fa-check-square-o"></i>
+ {{else}}
+ <i class="fa fa-square-o"></i>
+ {{/if}}
+ </span>
{{/if}}
</td>
<td>
- {{if $field.5}}<span class="permission-inherited">{{$inherited}}{{if $self}}{{if $field.7}} <i class="fa fa-check-square-o"></i>{{else}} <i class="fa fa-square-o"></i>{{/if}}{{/if}}</span>{{/if}}
+ {{if $is_system_role}}
+ {{if $field.3}}
+ <i class="fa fa-check-square-o"></i>
+ {{else}}
+ <i class="fa fa-square-o"></i>
+ {{/if}}
+ {{else}}
+ <input type="checkbox" name="{{$field.0}}" value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} />
+ {{/if}}
+
</td>
+
</tr>
diff --git a/view/tpl/field_checkbox.tpl b/view/tpl/field_checkbox.tpl
index a1ab42d5e..670bb7e29 100644
--- a/view/tpl/field_checkbox.tpl
+++ b/view/tpl/field_checkbox.tpl
@@ -1,6 +1,6 @@
<div id="{{$field.0}}_container" class="clearfix onoffswitch checkbox mb-3">
<label for="id_{{$field.0}}">{{$field.1}}{{if $field.6}}<sup class="required zuiqmid"> {{$field.6}}</sup>{{/if}}</label>
- <div class="float-end"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
+ <div class="float-end"><input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
<small class="form-text text-muted">{{$field.3}}</small>
</div>
{{*
diff --git a/view/tpl/group_edit.tpl b/view/tpl/group_edit.tpl
index 5568179af..f6ab1e594 100644
--- a/view/tpl/group_edit.tpl
+++ b/view/tpl/group_edit.tpl
@@ -1,23 +1,24 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="float-end">
- <button type="button" class="btn btn-sm btn-outline-secondary" onclick="openClose('group_tools')"><i class="fa fa-pencil"></i> {{$details_label}}</button>
<button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
<button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$title}}</h2>
</div>
- <div id="group_tools" class="clearfix section-content-tools-wrapper" style="display: none">
+ <div id="group_tools" class="clearfix section-content-tools-wrapper">
<form action="group/{{$gid}}" id="group-edit-form" method="post" >
<input type='hidden' name='form_security_token' value='{{$form_security_token_edit}}'>
{{include file="field_input.tpl" field=$gname}}
{{include file="field_checkbox.tpl" field=$public}}
+ {{include file="field_checkbox.tpl" field=$is_default_acl}}
+ {{include file="field_checkbox.tpl" field=$is_default_group}}
{{$pgrp_extras}}
- <a href="group/drop/{{$gid}}?t={{$form_security_token_drop}}" onclick="return confirmDelete();" class="btn btn-sm btn-danger">
+ <a href="group/drop/{{$gid}}?t={{$form_security_token_drop}}" onclick="return confirmDelete();" class="btn btn-outline-danger">
{{$delete}}
</a>
- <button type="submit" name="submit" class="btn btn-sm btn-primary float-end">{{$submit}}</button>
+ <button type="submit" name="submit" class="btn btn-primary float-end">{{$submit}}</button>
</form>
</div>
<div class="section-content-info-wrapper">
diff --git a/view/tpl/group_selection.tpl b/view/tpl/group_selection.tpl
index a91658464..7db80e06f 100644
--- a/view/tpl/group_selection.tpl
+++ b/view/tpl/group_selection.tpl
@@ -1,8 +1,8 @@
<div class="mb-3 field custom">
-<label for="group-selection" id="group-selection-lbl">{{$label}}</label>
-<select class="form-control" name="group-selection" id="group-selection" >
-{{foreach $groups as $group}}
-<option value="{{$group.id}}" {{if $group.selected}}selected="selected"{{/if}} >{{$group.name}}</option>
-{{/foreach}}
-</select>
+ <label for="id_{{$form_id}}">{{$label}}</label>
+ <select class="form-control" name="{{$form_id}}" id="{{$form_id}}" >
+ {{foreach $groups as $group}}
+ <option value="{{$group.id}}" {{if $group.selected}}selected="selected"{{/if}} >{{$group.name}}</option>
+ {{/foreach}}
+ </select>
</div>
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index 14f714ae9..979d20aa5 100644
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -13,9 +13,11 @@
<a class="nav-link{{if $group.selected}} active{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
</li>
{{/foreach}}
+ {{if $createtext}}
<li class="nav-item">
- <a class="nav-link" href="group/new" title="{{$createtext}}" ><i class="fa fa-plus-circle"></i> {{$createtext}}</a>
+ <a class="nav-link" href="group/new" title="{{$createtext}}" ><i class="fa fa-external-link"></i> {{$createtext}}</a>
</li>
+ {{/if}}
</ul>
</div>
diff --git a/view/tpl/micropro_card.tpl b/view/tpl/micropro_card.tpl
index 058bfc14c..40a7967c5 100644
--- a/view/tpl/micropro_card.tpl
+++ b/view/tpl/micropro_card.tpl
@@ -1,5 +1,5 @@
<a class="list-group-item{{if $class}} {{$class}}{{/if}} fakelink" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}>
- <img class="menu-img-3" src="{{$photo}}" title="{{$title}}" alt="" />{{if $perminfo}}{{include "connstatus.tpl"}}{{/if}}
+ <img class="menu-img-3" src="{{$photo}}" title="{{$title}}" alt="" loading="lazy" />{{if $perminfo}}{{include "connstatus.tpl"}}{{/if}}
<span class="contactname">{{$name}}</span>
<span class="dropdown-sub-text">{{$addr}}<br>{{$network}}</span>
</a>
diff --git a/view/tpl/navbar_default.tpl b/view/tpl/navbar_default.tpl
index c8b5ce26c..8d6d5dfd7 100644
--- a/view/tpl/navbar_default.tpl
+++ b/view/tpl/navbar_default.tpl
@@ -193,7 +193,7 @@
</div>
<div class="offcanvas-body pt-0">
{{if $channel_apps.0}}
- <div class="dropdown-header text-uppercase">
+ <div class="dropdown-header text-uppercase text-muted">
{{$channelapps}}
</div>
{{foreach $channel_apps as $channel_app}}
@@ -201,7 +201,7 @@
{{/foreach}}
{{/if}}
{{if $navbar_apps.0}}
- <div class="d-lg-none dropdown-header text-uppercase">
+ <div class="d-lg-none dropdown-header text-uppercase text-muted">
{{$pinned_apps}}
</div>
<div id="nav-app-bin-container" class="d-lg-none">
@@ -211,7 +211,7 @@
</div>
{{/if}}
{{if $is_owner}}
- <div class="dropdown-header text-uppercase">
+ <div class="dropdown-header text-uppercase text-muted">
{{$featured_apps}}
</div>
<div id="app-bin-container" data-token="{{$form_security_token}}">
@@ -222,7 +222,7 @@
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus"></i>{{$addapps}}</a>
{{else}}
- <div class="dropdown-header text-uppercase">
+ <div class="dropdown-header text-uppercase text-muted">
{{$sysapps}}
</div>
{{foreach $nav_apps as $nav_app}}
diff --git a/view/tpl/new_channel.tpl b/view/tpl/new_channel.tpl
index 8d72df55b..f11a4291f 100644
--- a/view/tpl/new_channel.tpl
+++ b/view/tpl/new_channel.tpl
@@ -18,17 +18,17 @@
{{if $default_role}}
<input type="hidden" name="permissions_role" value="{{$default_role}}" />
{{else}}
- {{include file="field_select_grouped.tpl" field=$role}}
+ {{include file="field_select.tpl" field=$role}}
{{/if}}
-
+
{{include file="field_input.tpl" field=$name}}
-
+
{{include file="field_input.tpl" field=$nickname}}
<button class="btn btn-primary" type="submit" id="newchannel-submit-button">{{$submit}}</button>
-
-
+
+
<div id="newchannel-submit-end" class="clear"></div>
-
+
<div id="newchannel-import-link" class="descriptive-paragraph" >{{$label_import}}</div>
<div id="newchannel-import-end" class="clear"></div>
</form>
diff --git a/view/tpl/notes.tpl b/view/tpl/notes.tpl
index 3273b4145..24c3ec53c 100644
--- a/view/tpl/notes.tpl
+++ b/view/tpl/notes.tpl
@@ -1,14 +1,14 @@
{{if $app}}
<div id="personal-notes" class="generic-content-wrapper{{if $hidden}} d-none{{/if}}">
<div class="section-title-wrapper clearfix">
- <div class="float-end rounded border border-secondary m-1 ps-1 pe-1 text-muted small note-mode" title="Double click into note for edit mode">Read mode</div>
- <h2>{{$banner}}</h2>
+ <div class="float-end rounded border border-secondary m-1 ps-1 pe-1 text-muted small note-mode" title="Double click into note for edit mode">{{$strings.read}}</div>
+ <h2>{{$strings.title}}</h2>
</div>
<div class="section-content-wrapper-np">
{{else}}
<div id="personal-notes" class="widget{{if $hidden}} d-none{{/if}}">
- <div class="float-end rounded border border-secondary mb-1 ps-1 pe-1 text-muted small note-mode" title="Double click note for edit mode">Read mode</div>
- <h3 class="float-start">{{$banner}}</h3>
+ <div class="float-end rounded border border-secondary mb-1 ps-1 pe-1 text-muted small note-mode" title="Double click note for edit mode">{{$strings.read}}</div>
+ <h3 class="float-start">{{$strings.title}}</h3>
{{/if}}
<textarea name="note_text" id="note-text" class="form-control{{if $app}} border-0{{else}} p-1{{/if}}" style="display: none;">{{$text}}</textarea>
<div id="note-text-html" class="{{if !$app}}border rounded p-1{{/if}}">{{$html}}</div>
@@ -86,22 +86,22 @@
case 'edit':
obj.removeClass('border-secondary border-success text-muted text-success')
obj.addClass('border-danger text-danger')
- obj.html('Edit mode');
+ obj.html('{{$strings.edit}}');
break;
case 'editing':
obj.removeClass('border-secondary border-success text-muted text-success')
obj.addClass('border-danger text-danger')
- obj.html('Editing...');
+ obj.html('{{$strings.editing}}{{$strings.dots}}');
break;
case 'saving':
obj.removeClass('border-secondary border-danger text-muted text-danger')
obj.addClass('border-success text-success')
- obj.html('Saving...');
+ obj.html('{{$strings.saving}}{{$strings.dots}}');
break;
case 'saved':
obj.removeClass('border-secondary border-danger text-muted text-danger')
obj.addClass('border-success text-success')
- obj.html('Saved');
+ obj.html('{{$strings.saved}}');
setTimeout(function () {
if(noteEditing) {
setNoteMode(noteMode, noteEditing === 1 ? 'edit' : 'editing');
@@ -113,7 +113,7 @@
break;
case 'read':
default:
- obj.removeClass('border-success border-danger text-success text-danger').addClass('border-secondary text-muted').html('Read mode');
+ obj.removeClass('border-success border-danger text-success text-danger').addClass('border-secondary text-muted').html('{{$strings.read}}');
}
}
diff --git a/view/tpl/permcats.tpl b/view/tpl/permcats.tpl
index 5b2d811d7..d0f175cfb 100644
--- a/view/tpl/permcats.tpl
+++ b/view/tpl/permcats.tpl
@@ -4,61 +4,63 @@
<div class="clear"></div>
</div>
<div class="section-content-tools-wrapper">
- <div class="section-content-info-wrapper">
- {{$desc}}
- </div>
+ <form action="permcats/{{$return_path}}" id="settings-permcats-form" method="post" autocomplete="off" >
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+ <input type="hidden" name="return_path" value="{{$return_path}}">
+
+ {{if $is_system_role}}
+ <input type="hidden" name="is_system_role" value="1">
+ <input type="hidden" name="name" value="{{$is_system_role}}">
+ {{/if}}
- <form action="permcats" id="settings-permcats-form" method="post" autocomplete="off" >
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$name}}
+ {{include file="field_checkbox.tpl" field=$default_role}}
+
+ {{$group_select}}
- <div class="settings-submit-wrapper mb-3">
- <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
+ <div class="section-subtitle-wrapper" id="perms-tool">
+ <h3>
+ {{$permlbl}}
+ </h3>
</div>
+ <div class="section-content-warning-wrapper">
+ {{$permnote}}
+ </div>
+ <table id="" class="table table-hover">
+ {{foreach $perms as $prm}}
+ {{include file="field_acheckbox.tpl" field=$prm}}
+ {{/foreach}}
+ </table>
+ <div class="clearfix">
+ {{if !$is_system_role && $return_path}}
+ <button type="button" class="btn btn-outline-danger" data-bs-toggle="modal" data-bs-target="#delete-modal">{{$delet_role_button}}</button>
+ {{/if}}
+ <button type="submit" name="submit" class="btn btn-primary float-end">{{$submit}}</button>
+ </div>
+ </form>
</div>
-
- <div class="panel" id="permission-settings">
- <div class="section-subtitle-wrapper" role="tab" id="perms-tool">
- <h3>
- <a data-bs-toggle="collapse" data-bs-parent="#permission-settings" href="#perms-tool-collapse" aria-expanded="true" aria-controls="perms-tool-collapse">
- {{$permlbl}}
- </a>
- </h3>
- </div>
- <div id="perms-tool-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="perms-tool">
- <div class="section-content-tools-wrapper">
- <div class="section-content-warning-wrapper">
- {{$permnote}}
- </div>
-
- <table id="perms-tool-table" class=mb-3>
- <tr>
- <td></td><td colspan="2" class="abook-me">{{$me}}</td>
- </tr>
- {{foreach $perms as $prm}}
- {{include file="field_acheckbox.tpl" field=$prm}}
- {{/foreach}}
- </table>
-
- <div class="settings-submit-wrapper" >
- <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
+</div>
+{{if !$is_system_role && $return_path}}
+<div id="delete-modal" class="modal" tabindex="-1">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <div class="h3">
+ {{$delete_label}}
</div>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
+ <form action="permcats" id="delete-permcat-form" method="post">
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+ <input type="hidden" name="deleted_role" value="{{$current_role}}">
+ <div id="edit-modal-body" class="modal-body">
+ {{include file="field_select.tpl" field=$delete_role_select}}
+ </div>
+ <div class="modal-footer">
+ <button id="" type="submit" class="btn btn-danger">{{$delet_role_button}}</button>
+ </div>
+ </form>
</div>
- {{if $permcats}}
- <div class="section-content-wrapper-np">
- <table id="permcat-index">
- {{foreach $permcats as $k => $v}}
- <tr class="permcat-row-{{$k}}">
- <td width="99%"><a href="permcats/{{$k}}">{{$v}}</a></td>
- <td width="1%"><i class="fa fa-trash-o drop-icons" onClick="dropItem('permcats/{{$k}}/drop', '.permcat-row-{{$k}}')"></i></td>
- </tr>
- {{/foreach}}
- </table>
- </div>
- {{/if}}
-
</div>
- </form>
-
</div>
+{{/if}}
diff --git a/view/tpl/permcats_widget.tpl b/view/tpl/permcats_widget.tpl
new file mode 100644
index 000000000..a7ebd91ba
--- /dev/null
+++ b/view/tpl/permcats_widget.tpl
@@ -0,0 +1,27 @@
+<div class="widget">
+ <h3>{{$roles_label}}</h3>
+ <ul class="nav nav-pills flex-column">
+ {{foreach $roles as $role}}
+ <li class="nav-item">
+ <a class="nav-link{{if $role.active}} active{{/if}}" href="{{$role.url}}">
+ {{$role.name}}
+ </a>
+ </li>
+ {{/foreach}}
+ </ul>
+</div>
+
+{{if $members}}
+<div class="widget">
+ <h3>{{$members_label}}</h3>
+ <div class="border rounded overflow-auto" style="height: 19rem;">
+ {{foreach $members as $member}}
+ <a href="{{$member.url}}" class="lh-sm border-bottom p-2 d-block text-truncate">
+ <img src="{{$member.photo}}" class="float-start rounded me-2" style="height: 2.2rem; width: 2.2rem;" loading="lazy">
+ {{$member.name}}<br>
+ <span class="text-muted small">{{$member.addr}}</span>
+ </a>
+ {{/foreach}}
+ </div>
+</div>
+{{/if}}
diff --git a/view/tpl/privacy_groups.tpl b/view/tpl/privacy_groups.tpl
index c06f5b0ca..b52cec4c8 100644
--- a/view/tpl/privacy_groups.tpl
+++ b/view/tpl/privacy_groups.tpl
@@ -1,29 +1,16 @@
<div class="generic-content-wrapper">
<div class="clearfix section-title-wrapper">
- <button type="button" class="btn btn-sm btn-success float-end" onclick="openClose('group_tools')"><i class="fa fa-plus-circle"></i> {{$add_new_label}}</button>
<h2>{{$title}}</h2>
</div>
- <div id="group_tools" class="clearfix section-content-tools-wrapper"{{if ! $new}} style="display: none"{{/if}}>
+ <div id="group_tools" class="clearfix section-content-tools-wrapper">
<form action="group/new" id="group-edit-form" method="post" >
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$gname}}
{{include file="field_checkbox.tpl" field=$public}}
+ {{include file="field_checkbox.tpl" field=$is_default_acl}}
+ {{include file="field_checkbox.tpl" field=$is_default_group}}
{{$pgrp_extras}}
- <button type="submit" name="submit" class="btn btn-sm btn-primary float-end">{{$submit}}</button>
+ <button type="submit" name="submit" class="btn btn-primary float-end">{{$submit}}</button>
</form>
</div>
-
- <table id="groups-index">
- <tr>
- <th width="99%">{{$name_label}}</th>
- <th width="1%">{{$count_label}}</th>
- </tr>
-
- {{foreach $entries as $group}}
- <tr id="groups-index-{{$group.id}}" class="group-index-row">
- <td><a href="group/{{$group.id}}">{{$group.name}}</a></td>
- <td>{{$group.count}}</td>
- </tr>
- {{/foreach}}
- </table>
</div>
diff --git a/view/tpl/profile_advanced.tpl b/view/tpl/profile_advanced.tpl
index a4f6c9525..dab2db4ac 100644
--- a/view/tpl/profile_advanced.tpl
+++ b/view/tpl/profile_advanced.tpl
@@ -21,9 +21,8 @@
<a class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" href="#" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
<div class="dropdown-menu dropdown-menu-end">
{{foreach $editmenu.menu.entries as $e}}
- <a class="dropdown-item" href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'> {{$e.profile_name}}</a>
+ <a class="dropdown-item" href="profiles/{{$e.id}}"><img class="menu-img-1" src='{{$e.photo}}'> {{$e.profile_name}}</a>
{{/foreach}}
- <a class="dropdown-item" href="profile_photo" >{{$editmenu.menu.chg_photo}}</a>
{{if $editmenu.menu.cr_new}}
<a class="dropdown-item" href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a>
{{/if}}
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index 95346b3a8..c55ce0183 100644
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -5,7 +5,7 @@
<i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
<div class="dropdown-menu dropdown-menu-end">
- <a class="dropdown-item" href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-fw fa-user"></i>&nbsp;{{$profpic}}</a>
+ <a class="dropdown-item" href="profile_photo/{{$profile_id}}" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-fw fa-user"></i>&nbsp;{{$profpic}}</a>
{{if $is_default}}
<a class="dropdown-item" href="cover_photo" id="cover-photo_upload-link" title="{{$coverpic}}"><i class="fa fa-fw fa-picture-o"></i>&nbsp;{{$coverpic}}</a>
{{/if}}
@@ -30,7 +30,7 @@
{{/if}}
</div>
</div>
- <h2>{{$banner}}</h2>
+ <h2>{{$banner}}{{if $multi_profiles}}: {{$profile_name.2}}{{/if}}</h2>
<div class="clear"></div>
</div>
<div class="section-content-tools-wrapper" id="profile-upload-form">
@@ -50,7 +50,7 @@
<div class="section-subtitle-wrapper" role="tab" id="personal">
<h3>
<a data-bs-toggle="collapse" data-bs-target="#personal-collapse" href="#" aria-expanded="true" aria-controls="personal-collapse">
- {{$personal}}
+ {{$basic}}
</a>
</h3>
</div>
@@ -84,7 +84,17 @@
{{$dob}}
{{/if}}
+ {{$profile_in_dir}}
+
+ {{$suggestme}}
+
+ {{if $show_presence}}
+ {{include file="field_checkbox.tpl" field=$show_presence}}
+ {{/if}}
+
+ {{if $hide_friends}}
{{include file="field_checkbox.tpl" field=$hide_friends}}
+ {{/if}}
<div class="mb-3" >
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index c608806ca..c8f5b939a 100644
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -1,152 +1,56 @@
-<script>
- var initializeEmbedPhotoDialog = function () {
- $('.embed-photo-selected-photo').each(function (index) {
- $(this).removeClass('embed-photo-selected-photo');
- });
- getPhotoAlbumList();
- $('#embedPhotoModalBodyAlbumDialog').off('click');
- $('#embedPhotoModal').modal('show');
- };
-
- var choosePhotoFromAlbum = function (album) {
- $.post("embedphotos/album", {name: album},
- function(data) {
- if (data['status']) {
- $('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
- $('#embedPhotoModalBodyAlbumDialog').html('\
- <div><div class="nav nav-pills flex-column">\n\
- <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
- <i class="fa fa-chevron-left"></i>&nbsp\n\
- {{$modaldiffalbum}}\n\
- </a>\n\
- </li>\n\
- </div><br></div>')
- $('#embedPhotoModalBodyAlbumDialog').append(data['content']);
- $('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
- evt.preventDefault();
- var image = document.getElementById(evt.target.id);
- if (typeof($(image).parent()[0]) !== 'undefined') {
- var imageparent = document.getElementById($(image).parent()[0].id);
- $(imageparent).toggleClass('embed-photo-selected-photo');
- var href = $(imageparent).attr('href');
- $.post("embedphotos/photolink", {href: href},
- function(ddata) {
- if (ddata['status']) {
- var pf = $('#profile-photo-profiles').val();
- var prof = ((typeof pf !== 'undefined') ? '?f=&pf=' + pf : '');
- window.location.href = 'profile_photo/use/' + ddata['resource_id'] + prof;
- } else {
- window.console.log("{{$modalerrorlink}}" + ':' + ddata['errormsg']);
- }
- return false;
- },
- 'json');
- $('#embedPhotoModalBodyAlbumDialog').html('');
- $('#embedPhotoModalBodyAlbumDialog').off('click');
- $('#embedPhotoModal').modal('hide');
- }
- });
-
- $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
- } else {
- window.console.log("{{$modalerroralbum}} " + JSON.stringify(album) + ':' + data['errormsg']);
- }
- return false;
- },
- 'json');
- };
-
- var getPhotoAlbumList = function () {
- $.post("embedphotos/albumlist", {},
- function(data) {
- if (data['status']) {
- var albums = data['albumlist']; //JSON.parse(data['albumlist']);
- $('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
- for(var i=0; i<albums.length; i++) {
- var albumName = albums[i].text;
- var jsAlbumName = albums[i].jstext;
- var albumLink = '<li class="nav-item">';
- albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
- albumLink += '</li>';
- $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
- }
- $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
- } else {
- window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
- }
- return false;
- },
- 'json');
- };
-</script>
-
+<input id="invisible-photos-file-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50px;left:-50px;width:0;height:0;">
<div id="profile-photo-content" class="generic-content-wrapper">
- <div class="section-title-wrapper">
- <h2>{{$title}}</h2>
- </div>
- <div class="section-content-wrapper">
-
- <form enctype="multipart/form-data" action="profile_photo" method="post">
- <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-
- <div id="profile-photo-upload-wrapper">
- {{if $info}}
- <div class="section-content-warning-wrapper">{{$info}}</div>
- {{/if}}
- {{if $importfile}}
- <input type="hidden" name="importfile" value="{{$importfile}}">
- {{else}}
- <label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">{{$lbl_upfile}}</label>
- <input name="userfile" class="form-input" type="file" id="profile-photo-upload" size="48" />
- {{/if}}
- <div class="clear"></div>
-
-
- {{if $single}}
- <input type="hidden" name="profile" value="{{$profile0.id}}" />
- {{else}}
-
-
-
- <label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">{{$lbl_profiles}}</label>
- <select name="profile" id="profile-photo-profiles" class="form-control" >
- {{foreach $profiles as $p}}
- <option value="{{$p.id}}" {{if $p.selected}}selected="selected"{{/if}}>{{$p.name}}</option>
- {{/foreach}}
- </select>
- <div class="clear"></div>
- <br />
- <br />
- {{/if}}
-
- <div id="profile-photo-submit-wrapper">
- <button type="submit" class="btn btn-outline-primary" name="submit" id="profile-photo-submit">{{$submit}}</button>
- <button type="submit" class="btn btn-outline-danger" name="remove" id="profile-photo-remove">{{$remove}}</button>
+ <div class="section-title-wrapper">
+ <h2>{{$title}}: {{$profile.name}}</h2>
+ </div>
+ <div class="section-content-wrapper">
+
+ <form enctype="multipart/form-data" id="profile-photo-form" action="profile_photo" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
+ <div id="profile-photo-upload-wrapper">
+ {{if $info}}
+ <div class="section-content-warning-wrapper">{{$info}}</div>
+ {{/if}}
+ {{if $importfile}}
+ <input type="hidden" name="importfile" value="{{$importfile}}">
+ {{/if}}
+ <div class="clear mb-3"></div>
+
+ <input type="hidden" name="profile" value="{{$profile_id}}"/>
+
+ <div id="profile-photo-upload-spinner" class="spinner-wrapper">
+ <div class="spinner m"></div>
+ </div>
+ <div id="profile-photo-submit-wrapper">
+ <button type="submit" class="btn btn-primary float-end" name="submit" id="profile-photo-submit">
+ {{$submit}}
+ </button>
+ <button id="embed-photo-wrapper" type="button"
+ class="btn btn-default btn-outline-success float-end me-1" title="{{$embedPhotos}}"
+ onclick="initializeEmbedPhotoDialog();">
+ <i id="embed-photo" class="fa fa-file-image-o"></i> {{$select}}
+ </button>
+ <button type="submit" class="btn btn-outline-danger" name="remove" id="profile-photo-remove">
+ {{$remove}}
+ </button>
+ </div>
</div>
- </div>
</form>
- <br />
- <div id="profile-photo-link-select-wrapper">
- <button id="embed-photo-wrapper" class="btn btn-default btn-primary" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
- <i id="embed-photo" class="fa fa-file-image-o"></i> {{$select}}
- </button>
- </div>
</div>
</div>
-<div class="modal" id="embedPhotoModal" tabindex="-1" role="dialog" aria-labelledby="embedPhotoLabel" aria-hidden="true">
+<div class="modal" id="embedPhotoModal" tabindex="-1" role="dialog" aria-labelledby="embedPhotoLabel"
+ aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-hidden="true"></button>
</div>
- <div class="modal-body" id="embedPhotoModalBody" >
+ <div class="modal-body" id="embedPhotoModalBody">
<div id="embedPhotoModalBodyAlbumListDialog" class="d-none">
<div id="embedPhotoModalBodyAlbumList"></div>
</div>
@@ -155,3 +59,115 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+
+<script src="vendor/blueimp/jquery-file-upload/js/vendor/jquery.ui.widget.js"></script>
+<script src="vendor/blueimp/jquery-file-upload/js/jquery.iframe-transport.js"></script>
+<script src="vendor/blueimp/jquery-file-upload/js/jquery.fileupload.js"></script>
+<script>
+ var initializeEmbedPhotoDialog = function () {
+ $('.embed-photo-selected-photo').each(function (index) {
+ $(this).removeClass('embed-photo-selected-photo');
+ });
+ getPhotoAlbumList();
+ $('#embedPhotoModalBodyAlbumDialog').off('click');
+ $('#embedPhotoModal').modal('show');
+ };
+
+ var choosePhotoFromAlbum = function (album) {
+ $.post("embedphotos/album", {name: album},
+ function (data) {
+ if (data['status']) {
+ $('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
+ $('#embedPhotoModalBodyAlbumDialog').html('\
+ <div><div class="nav nav-pills flex-column">\n\
+ <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <i class="fa fa-chevron-left"></i>&nbsp\n\
+ {{$modaldiffalbum}}\n\
+ </a>\n\
+ </li>\n\
+ </div><br></div>')
+ $('#embedPhotoModalBodyAlbumDialog').append(data['content']);
+ $('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
+ evt.preventDefault();
+ var image = document.getElementById(evt.target.id);
+ if (typeof ($(image).parent()[0]) !== 'undefined') {
+ var imageparent = document.getElementById($(image).parent()[0].id);
+ $(imageparent).toggleClass('embed-photo-selected-photo');
+ var href = $(imageparent).attr('href');
+ $.post("embedphotos/photolink", {href: href},
+ function (ddata) {
+ if (ddata['status']) {
+ window.location.href = 'profile_photo/use/' + ddata['resource_id'] + '?f=&profile={{$profile_id}}';
+ } else {
+ window.console.log("{{$modalerrorlink}}" + ':' + ddata['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ $('#embedPhotoModalBodyAlbumDialog').html('');
+ $('#embedPhotoModalBodyAlbumDialog').off('click');
+ $('#embedPhotoModal').modal('hide');
+ }
+ });
+
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
+ } else {
+ window.console.log("{{$modalerroralbum}} " + JSON.stringify(album) + ':' + data['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ };
+
+ var getPhotoAlbumList = function () {
+ $.post("embedphotos/albumlist", {},
+ function (data) {
+ if (data['status']) {
+ var albums = data['albumlist']; //JSON.parse(data['albumlist']);
+ $('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
+ for (var i = 0; i < albums.length; i++) {
+ var albumName = albums[i].text;
+ var jsAlbumName = albums[i].jstext;
+ var albumLink = '<li class="nav-item">';
+ albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
+ albumLink += '</li>';
+ $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
+ }
+ $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
+ } else {
+ window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ };
+
+
+ $('#invisible-photos-file-upload').fileupload({
+ url: 'profile_photo',
+ dataType: 'json',
+ // dropZone: filedrag,
+ maxChunkSize: 2 * 1024 * 1024,
+
+ add: function (e, data) {
+ data.formData = $('#profile-photo-form').serializeArray();
+ data.submit();
+ $('#profile-photo-upload-spinner').show();
+ },
+
+ done: function (e, data) {
+ $('#profile-photo-upload-spinner').hide();
+ window.location.href = 'profile_photo/use/' + data.result.message + '?profile={{$profile_id}}';
+ }
+
+ });
+
+ $('#profile-photo-submit').click(function (event) {
+ event.preventDefault();
+ $('#invisible-photos-file-upload').trigger('click');
+ return false;
+ });
+</script>
diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl
index 13caf5603..3da580f60 100644
--- a/view/tpl/profile_vcard.tpl
+++ b/view/tpl/profile_vcard.tpl
@@ -1,60 +1,100 @@
-<div class="vcard h-card">
- {{if ! $zcard}}
- <div id="profile-photo-wrapper">{{if $editmenu}}<a href="profile_photo" title="{{$change_photo}}">{{/if}}<img class="photo u-photo" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.fullname}}">{{if $editmenu}}</a>{{/if}}</div>
- {{/if}}
- {{if $connect}}
- <div class="connect-btn-wrapper"><a href="{{$connect_url}}" class="btn btn-block btn-success btn-sm"><i class="fa fa-plus"></i> {{$connect}}</a></div>
- {{/if}}
- {{if ! $zcard}}
- {{if $editmenu.multi}}
- <div class="dropdown float-end">
- <a class="dropdown-toggle" data-bs-toggle="dropdown" href="#" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a>
- <div class="dropdown-menu dropdown-menu-end" role="menu">
- {{foreach $editmenu.menu.entries as $e}}
- <a href="profiles/{{$e.id}}" class="dropdown-item"><img class="menu-img-1" src='{{$e.photo}}'> {{$e.profile_name}}</a>
- {{/foreach}}
- <a href="profile_photo" class="dropdown-item">{{$editmenu.menu.chg_photo}}</a>
- {{if $editmenu.menu.cr_new}}<a href="profiles/new" id="profile-listing-new-link" class="dropdown-item">{{$editmenu.menu.cr_new}}</a>{{/if}}
+<div class="rounded mb-3 vcard-card h-card">
+ <div class="card mb-2">
+ <div class="row">
+ <div class="col-4" style="width: fit-content;">
+ <div id="profile-photo-wrapper">
+ <img class="rounded-start u-photo" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.fullname}}" style="width: 6rem; height:6rem;">
+ </div>
+ </div>
+ <div class="col-7 m-1 p-0">
+ {{if $editmenu.multi}}
+ <div class="dropdown float-end">
+ <a class="profile-edit-side-link float-end" data-bs-toggle="dropdown" href="#" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a>
+ <div class="dropdown-menu dropdown-menu-end" role="menu">
+ {{foreach $editmenu.menu.entries as $e}}
+ <a href="profiles/{{$e.id}}" class="dropdown-item"><img class="menu-img-1" src='{{$e.photo}}'> {{$e.profile_name}}</a>
+ {{/foreach}}
+ {{if $editmenu.menu.cr_new}}
+ <a href="profiles/new" id="profile-listing-new-link" class="dropdown-item">{{$editmenu.menu.cr_new}}</a>
+ {{/if}}
+ </div>
+ </div>
+ {{elseif $editmenu}}
+ <a class="profile-edit-side-link float-end" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a>
+ {{/if}}
+
+ <div class="text-truncate">
+ <strong class="fn p-name">{{$profile.fullname}}{{if $profile.online}}<i class="fa fa-fw fa-asterisk text-danger ps-2" title="{{$profile.online}}"></i>{{/if}}</strong>
+ </div>
+ <div class="text-truncate">
+ <small class="text-muted p-adr">{{$profile.reddress}}</small>
+ </div>
+ {{if $connect}}
+ <div class="mt-1">
+ <a href="{{$connect_url}}" class="btn btn-success btn-sm" rel="nofollow">
+ <i class="fa fa-plus"></i> {{$connect}}
+ </a>
+ </div>
+ {{/if}}
+ </div>
</div>
</div>
- {{elseif $editmenu}}
- <a class="profile-edit-side-link" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a>
- {{/if}}
- {{/if}}
-
- {{if ! $zcard}}
- <div class="fn p-name">{{$profile.fullname}}{{if $profile.online}} <i class="fa fa-asterisk online-now" title="{{$profile.online}}"></i>{{/if}}</div>
- {{if $reddress}}<div class="reddress">{{$profile.reddress}}</div>{{/if}}
- {{/if}}
- {{if $pdesc}}<div class="title">{{$profile.pdesc}}</div>{{/if}}
- {{if $location}}
- <dl class="location"><dt class="location-label">{{$location}}</dt>
- <dd class="adr h-adr">
- {{if $profile.address}}<div class="street-address p-street-address">{{$profile.address}}</div>{{/if}}
- <span class="city-state-zip">
- <span class="locality p-locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
- <span class="region p-region">{{$profile.region}}</span>
- <span class="postal-code p-postal-code">{{$profile.postal_code}}</span>
- </span>
- {{if $profile.country_name}}<span class="country-name p-country-name">{{$profile.country_name}}</span>{{/if}}
- </dd>
+ {{if $details}}
+ <div class="vcard ps-2 pe-2">
+ {{if $profile.pdesc}}
+ <div class="mb-2">{{$profile.pdesc}}</div>
+ {{/if}}
+ {{if $location}}
+ <dl class="mb-0 pb-1">
+ <dt class="location-label">{{$location}}</dt>
+ <dd class="adr h-adr">
+ {{if $profile.address}}
+ <div class="street-address p-street-address">{{$profile.address}}</div>
+ {{/if}}
+ <div class="city-state-zip">
+ <span class="postal-code p-postal-code">{{$profile.postal_code}}</span>
+ <span class="locality p-locality">{{$profile.locality}}</span>
+ </div>
+ {{if $profile.region}}
+ <div class="region p-region">{{$profile.region}}</div>
+ {{/if}}
+ {{if $profile.country_name}}
+ <div class="country-name p-country-name">{{$profile.country_name}}</div>
+ {{/if}}
+ </dd>
+ </dl>
+ {{/if}}
+ {{if $hometown}}
+ <dl class="mb-0 pb-1">
+ <dt class="hometown-label">{{$hometown}}</dt>
+ <dd class="p-hometown">{{$profile.hometown}}</dd>
+ </dl>
+ {{/if}}
+ {{if $gender}}
+ <dl class="mb-0 pb-1">
+ <dt class="gender-label">{{$gender}}</dt>
+ <dd class="p-gender">{{if $profile.gender_icon}}<i class="fa fa-{{$profile.gender_icon}}"></i>&nbsp;{{/if}}{{$profile.gender}}</dd>
+ </dl>
+ {{/if}}
+ {{if $marital}}
+ <dl class="mb-0 pb-1">
+ <dt class="marital-label"><span class="heart"><i class="fa fa-heart"></i>&nbsp;</span>{{$marital}}</dt>
+ <dd class="marital-text">{{$profile.marital}}</dd>
</dl>
+ {{/if}}
+ {{if $homepage}}
+ <dl class="mb-0 pb-1">
+ <dt class="homepage-label">{{$homepage}}</dt>
+ <dd class="homepage-url u-url">{{$profile.homepage}}</dd>
+ </dl>
+ {{/if}}
+ <div class="hcard-addon"></div>
+ </div>
{{/if}}
-
- {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="p-gender">{{if $profile.gender_icon}}<i class="fa fa-{{$profile.gender_icon}}"></i>&nbsp;{{/if}}{{$profile.gender}}</dd></dl>{{/if}}
-
- {{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart"><i class="fa fa-heart"></i>&nbsp;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
-
- {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url u-url">{{$profile.homepage}}</dd></dl>{{/if}}
-
-<div class="hcard-addon"></div>
</div>
-<div class="clear"></div>
-
-{{$rating}}
-
+{{if $details}}
{{$chanmenu}}
-
{{$contact_block}}
+{{/if}}
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index ee89973a8..cb9ad57cc 100644
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -24,6 +24,9 @@
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}">
<img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-bs-toggle="dropdown" loading="lazy" />
+ {{if $item.author_is_group_actor}}
+ <i class="fa fa-comments-o wall-item-photo-group-actor" title="{{$item.author_is_group_actor}}"></i>
+ {{/if}}
{{if $item.thread_author_menu}}
<i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-bs-toggle="dropdown"></i>
<div class="dropdown-menu">
@@ -36,7 +39,7 @@
</div>
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else}}fa-lock{{/if}} lockview" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa {{if $item.locktype == 2}}fa-envelope-o{{else if $item.locktype == 1}}fa-lock{{else}}fa-unlock{{/if}} lockview{{if $item.privacy_warning}} text-danger{{/if}}" data-bs-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
</div>
{{/if}}
<div class="wall-item-author">
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index 353da9c2b..9b23d7d82 100644
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -18,13 +18,14 @@
</div>
<div id="basic-settings-collapse" class="collapse show" role="tabpanel" aria-labelledby="basic-settings" data-bs-parent="#settings">
<div class="section-content-tools-wrapper">
- {{include file="field_input.tpl" field=$username}}
+ {{include file="field_select.tpl" field=$role}}
{{include file="field_select_grouped.tpl" field=$timezone}}
{{include file="field_input.tpl" field=$defloc}}
{{include file="field_checkbox.tpl" field=$allowloc}}
{{include file="field_checkbox.tpl" field=$adult}}
{{include file="field_input.tpl" field=$photo_path}}
{{include file="field_input.tpl" field=$attach_path}}
+ {{include file="field_input.tpl" field=$expire}}
{{if $basic_addon}}
{{$basic_addon}}
{{/if}}
@@ -35,66 +36,6 @@
</div>
</div>
<div class="panel">
- <div class="section-subtitle-wrapper" role="tab" id="privacy-settings">
- <h3>
- <a data-bs-toggle="collapse" data-bs-target="#privacy-settings-collapse" href="#">
- {{$h_prv}}
- </a>
- </h3>
- </div>
- <div id="privacy-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="privacy-settings" data-bs-parent="#settings">
- <div class="section-content-tools-wrapper">
- {{include file="field_select_grouped.tpl" field=$role}}
- {{$autoperms}}
- <div id="advanced-perm" style="display:{{if $permissions_set}}none{{else}}block{{/if}};">
- <div class="mb-3">
- <button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#apsModal">{{$lbl_p2macro}}</button>
- </div>
- <div class="modal" id="apsModal">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h4 class="modal-title">{{$lbl_p2macro}}</h4>
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
- </div>
- <div class="modal-body">
- {{foreach $permiss_arr as $permit}}
- {{include file="field_select.tpl" field=$permit}}
- {{/foreach}}
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Close</button>
- </div>
- </div><!-- /.modal-content -->
- </div><!-- /.modal-dialog -->
- </div><!-- /.modal -->
-
- <div id="settings-default-perms" class="mb-3" >
- <button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
- </div>
- {{$group_select}}
- {{include file="field_checkbox.tpl" field=$hide_presence}}
- {{$profile_in_dir}}
- </div>
- <div class="settings-common-perms">
- {{$suggestme}}
- {{include file="field_checkbox.tpl" field=$blocktags}}
- {{include file="field_input.tpl" field=$expire}}
- </div>
- {{if $permcat_enable}}
- {{include file="field_select.tpl" field=$defpermcat}}
- {{/if}}
-
- {{if $sec_addon}}
- {{$sec_addon}}
- {{/if}}
- <div class="settings-submit-wrapper" >
- <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
- </div>
- </div>
- </div>
- </div>
- <div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="notification-settings">
<h3>
<a data-bs-toggle="collapse" data-bs-target="#notification-settings-collapse" href="#">
diff --git a/view/tpl/settings_privacy.tpl b/view/tpl/settings_privacy.tpl
new file mode 100644
index 000000000..aff9619c3
--- /dev/null
+++ b/view/tpl/settings_privacy.tpl
@@ -0,0 +1,56 @@
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <h2>{{$ptitle}}</h2>
+ </div>
+ {{$nickname_block}}
+ <form action="settings/privacy" id="settings-form" method="post" autocomplete="off">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}' />
+
+ <div class="section-content-tools-wrapper">
+
+ {{include file="field_checkbox.tpl" field=$autoperms}}
+ {{include file="field_checkbox.tpl" field=$index_opt_out}}
+
+ {{if $sec_addon}}
+ {{$sec_addon}}
+ {{/if}}
+ {{if $permission_limits}}
+ <div id="permission-limits">
+ <div class="modal" id="apsModal">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <div class="modal-title h3">{{$permission_limits_label}}</div>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+ <div class="multi-collapse collapse show">
+ <h2 class="text-danger mb-3"><i class="fa fa-warning"></i> {{$permission_limits_warning.0}}</h2>
+ <h3 class="mb-3">{{$permission_limits_warning.1}}</h3>
+ <button type="button" class="btn btn-primary" data-bs-toggle="collapse" data-bs-target=".multi-collapse" aria-expanded="false" aria-controls="collapseExample">{{$permission_limits_warning.2}}</button>
+ </div>
+ <div class="multi-collapse collapse">
+ {{foreach $permiss_arr as $permit}}
+ {{include file="field_select.tpl" field=$permit}}
+ {{/foreach}}
+ {{include file="field_checkbox.tpl" field=$group_actor}}
+ </div>
+
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Close</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+ </div><!-- /.modal -->
+ </div>
+ <div class="float-end">
+ <button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#apsModal">{{$permission_limits_label}}</button>
+ </div>
+ {{/if}}
+ <div class="settings-submit-wrapper" >
+ <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
+ </div>
+ </div>
+ </form>
+</div>
diff --git a/view/tpl/tokens.tpl b/view/tpl/tokens.tpl
index 6bf8dc202..3b267ddcc 100644
--- a/view/tpl/tokens.tpl
+++ b/view/tpl/tokens.tpl
@@ -14,59 +14,13 @@
{{include file="field_input.tpl" field=$name}}
{{include file="field_input.tpl" field=$token}}
{{include file="field_input.tpl" field=$expires}}
- <div class="settings-submit-wrapper mb-3">
- <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
- </div>
- </div>
-
- <div class="panel" id="permission-settings">
- <div class="section-subtitle-wrapper" role="tab" id="perms-tool">
- <h3>
- <a data-bs-toggle="collapse" data-bs-parent="#permission-settings" href="#perms-tool-collapse" aria-expanded="true" aria-controls="perms-tool-collapse">
- {{$permlbl}}
- </a>
- </h3>
- </div>
- <div id="perms-tool-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="perms-tool">
- <div class="section-content-tools-wrapper">
- <div class="section-content-warning-wrapper">
- {{$permnote}}
- </div>
-
- <table id="perms-tool-table" class=mb-3>
- <tr>
- <td></td><td colspan="2" class="abook-me">{{$me}}</td>
- </tr>
- {{foreach $perms as $prm}}
- {{include file="field_acheckbox.tpl" field=$prm}}
- {{/foreach}}
- </table>
+ {{include file="field_select.tpl" field=$permcat}}
- <div class="settings-submit-wrapper" >
- <button type="submit" name="submit" class="btn btn-primary">{{$submit}}</button>
- </div>
+ <div class="clearfix">
+ {{if $atoken}}
+ <button type="submit" name="delete" class="btn btn-outline-danger">{{$delete}}</button>
+ {{/if}}
+ <button type="submit" name="submit" class="btn btn-primary float-end">{{$submit}}</button>
</div>
- </div>
- </div>
- </form>
-
- <div class="descriptive-text">{{$desc2}}</div>
- <ul>
- <li>{{$url1}}<span class="zat-example">?f=&zat=<span class="token-mirror"></span></span></li>
- <li>{{$url2}}<span class="zat-example">?f=&zat=<span class="token-mirror"></span></span></li>
- </ul>
-
- {{if $tokens}}
- <div class="section-content-wrapper-np">
- <table id="atoken-index">
- {{foreach $tokens as $t}}
- <tr id="atoken-index-{{$t.atoken_id}}" class="atoken-index-row">
- <td width="99%"><a href="tokens/{{$t.atoken_id}}">{{$t.atoken_name}}</a></td>
- <td width="1%" class="atoken-index-tool"><i class="fa fa-trash-o drop-icons" onClick="dropItem('tokens/{{$t.atoken_id}}/drop', '#atoken-index-{{$t.atoken_id}}')"></i></td>
- </tr>
- {{/foreach}}
- </table>
-
</div>
- {{/if}}
</div>
diff --git a/view/tpl/uexport.tpl b/view/tpl/uexport.tpl
index 7eafd97a6..2b7967970 100644
--- a/view/tpl/uexport.tpl
+++ b/view/tpl/uexport.tpl
@@ -3,17 +3,54 @@
<h2>{{$title}}</h2>
</div>
<div class="section-content-wrapper">
- <b><a href="uexport/basic">{{$basictitle}}</a></b></p>
- <p>{{$basic}}</p>
-
- <p><b><a href="uexport/complete">{{$fulltitle}}</a></b></p>
- <p>{{$full}}</p>
-
- <p>{{$extra}}</p>
- <p>{{$extra2}}</p>
- <p>{{$extra3}}</p>
-
- <p>{{$extra4}}</p>
-
+ <p class="mb-3">
+ <h3>{{$channel_title}}</h3>
+ <p>
+ {{$channel_info}}
+ </p>
+ <a href="uexport/channel" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$channel_title}}</a>
+ </p>
+ <p class="mb-3">
+ <h3>{{$content_title}}</h3>
+ <p>
+ {{$content_info}}
+ {{$items_extra_info}}
+ </p>
+ {{foreach $years as $year}}
+ <a href="uexport/{{$year}}" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$year}}</a>
+ {{/foreach}}
+ </p>
+ <p class="mb-3">
+ <h3>{{$wikis_title}}</h3>
+ <p>
+ {{$wikis_info}}
+ {{$items_extra_info}}
+ </p>
+ <a href="uexport/wikis" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$wikis_title}}</a>
+ </p>
+ <p class="mb-3">
+ <h3>{{$webpages_title}}</h3>
+ <p>
+ {{$webpages_info}}
+ {{$items_extra_info}}
+ </p>
+ <a href="uexport/webpages" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$webpages_title}}</a>
+ </p>
+ <p class="mb-3">
+ <h3>{{$events_title}}</h3>
+ <p>
+ {{$events_info}}
+ {{$items_extra_info}}
+ </p>
+ <a href="uexport/events" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$events_title}}</a>
+ </p>
+ <p class="mb-3">
+ <h3>{{$chatrooms_title}}</h3>
+ <p>
+ {{$chatrooms_info}}
+ {{$items_extra_info}}
+ </p>
+ <a href="uexport/chatrooms" class="btn btn-outline-primary"><i class="fa fa-download"></i> {{$chatrooms_title}}</a>
+ </p>
</div>
</div>
diff --git a/view/tpl/widget_menu.tpl b/view/tpl/widget_menu.tpl
new file mode 100644
index 000000000..86799ff00
--- /dev/null
+++ b/view/tpl/widget_menu.tpl
@@ -0,0 +1,10 @@
+<div class="widget">
+ <h3>{{$title}}</h3>
+ <ul class="nav nav-pills flex-column">
+ {{foreach $menu_items as $menu_item}}
+ <li class="nav-item">
+ <a class="nav-link{{if $menu_item.active}} active{{/if}}" href="{{$menu_item.href}}" title="{{$menu_item.title}}">{{$menu_item.label}}</a>
+ <li>
+ {{/foreach}}
+ </ul>
+</div>
diff --git a/view/tpl/widget_menu_count.tpl b/view/tpl/widget_menu_count.tpl
new file mode 100644
index 000000000..5e8189b5f
--- /dev/null
+++ b/view/tpl/widget_menu_count.tpl
@@ -0,0 +1,13 @@
+<div class="widget">
+ <h3>{{$title}}</h3>
+ <ul class="nav nav-pills flex-column">
+ {{foreach $menu_items as $menu_item}}
+ <li class="nav-item">
+ <a class="nav-link {{if $menu_item.active}} active{{/if}}" href="{{$menu_item.href}}" title="{{$menu_item.title}}">
+ {{$menu_item.label}}
+ <span class="badge {{if $menu_item.active}} bg-light text-dark{{else}} bg-secondary{{/if}} float-end">{{$menu_item.count}}</span>
+ </a>
+ <li>
+ {{/foreach}}
+ </ul>
+</div>
diff --git a/view/tpl/xchan_vcard.tpl b/view/tpl/xchan_vcard.tpl
index 7deae0f99..a5568f283 100644
--- a/view/tpl/xchan_vcard.tpl
+++ b/view/tpl/xchan_vcard.tpl
@@ -1,19 +1,19 @@
<div class="card mb-3 h-card">
<div class="row">
- <div class="col-4">
+ <div class="col-4" style="width: 7rem;">
<a href="{{$link}}" >
- <img class="u-photo" src="{{$photo}}" alt="{{$name}}" width="80px" height="80px">
+ <img class="u-photo rounded-start" src="{{$photo}}" alt="{{$name}}" style="width: 6rem; height:6rem;">
</a>
</div>
- <div class="col-7 m-1">
- <div class="row">
- <strong class="fn p-name text-truncate">{{$name}}</strong>
+ <div class="col-7 m-1 p-0">
+ <div class="text-truncate">
+ <strong class="fn p-name">{{$name}}</strong>
</div>
- <div class="row">
- <small class="text-muted p-adr text-truncate">{{$addr}}</small>
+ <div class="text-truncate">
+ <small class="text-muted p-adr">{{$addr}}</small>
</div>
{{if $connect}}
- <div class="row mt-2">
+ <div class="mt-1">
<a href="follow?f=&url={{$follow}}&interactive=1" class="btn btn-success btn-sm" rel="nofollow">
<i class="fa fa-plus"></i> {{$connect}}
</a>
diff --git a/view/tpl/xrd_host.tpl b/view/tpl/xrd_host.tpl
index 2a40dcf47..43bd94664 100644
--- a/view/tpl/xrd_host.tpl
+++ b/view/tpl/xrd_host.tpl
@@ -1,11 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
-<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
- xmlns:hm='http://host-meta.net/xrd/1.0'>
-
- <hm:Host>{{$zhost}}</hm:Host>
-
- <Link rel='lrdd' type="application/xrd+xml" template='{{$zroot}}/xrd/?uri={uri}' />
- <Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
- href="{{$zroot}}/oexchange/xrd" />
-
+<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0' xmlns:hm='http://host-meta.net/xrd/1.0'>
+ <hm:Host>{{$zhost}}</hm:Host>
+ <Link rel='lrdd' type="application/xrd+xml" template='{{$zroot}}/xrd/?uri={uri}' />
+ <Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml" href="{{$zroot}}/oexchange/xrd" />
</XRD>
diff --git a/view/tpl/xrd_person.tpl b/view/tpl/xrd_person.tpl
index 52adb54e3..63f8e0846 100644
--- a/view/tpl/xrd_person.tpl
+++ b/view/tpl/xrd_person.tpl
@@ -1,28 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
-
- <Subject>{{$subject}}</Subject>
- {{if $aliases}}{{foreach $aliases as $a}}
- <Alias>{{$a}}</Alias>
- {{/foreach}}{{/if}}
-
- <Link rel="http://schemas.google.com/g/2010#updates-from"
- type="application/atom+xml"
- href="{{$atom}}" />
- <Link rel="http://webfinger.net/rel/profile-page"
- type="text/html"
- href="{{$profile_url}}" />
- <Link rel="http://portablecontacts.net/spec/1.0"
- href="{{$poco_url}}" />
- <Link rel="http://webfinger.net/rel/avatar"
- type="image/jpeg"
- href="{{$photo}}" />
- <Link rel="http://microformats.org/profile/hcard"
- type="text/html"
- href="{{$hcard_url}}" />
- <Link rel="http://ostatus.org/schema/1.0/subscribe"
- template="{{$subscribe}}" />
- <Link rel="magic-public-key"
- href="{{$modexp}}" />
-
+ <Subject>{{$subject}}</Subject>
+{{if $aliases}}
+{{foreach $aliases as $a}}
+ <Alias>{{$a}}</Alias>
+{{/foreach}}
+{{/if}}
+ <Link rel="http://schemas.google.com/g/2010#updates-from" type="application/atom+xml" href="{{$atom}}" />
+ <Link rel="http://webfinger.net/rel/profile-page" type="text/html" href="{{$profile_url}}" />
+ <Link rel="http://portablecontacts.net/spec/1.0" href="{{$poco_url}}" />
+ <Link rel="http://webfinger.net/rel/avatar" type="image/jpeg" href="{{$photo}}" />
+ <Link rel="http://microformats.org/profile/hcard" type="text/html" href="{{$hcard_url}}" />
+ <Link rel="http://ostatus.org/schema/1.0/subscribe" template="{{$subscribe}}" />
+ <Link rel="magic-public-key" href="{{$modexp}}" />
</XRD>