Merge "tests: Fix broken assertion in ApiQueryAllPagesTest"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 1 Oct 2019 13:31:19 +0000 (13:31 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 1 Oct 2019 13:31:19 +0000 (13:31 +0000)
83 files changed:
includes/Revision/RevisionStore.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/libs/filebackend/FileBackendStore.php
includes/parser/Parser.php
includes/resourceloader/ResourceLoaderModule.php
languages/i18n/ar.json
languages/i18n/ary.json
languages/i18n/bg.json
languages/i18n/diq.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/exif/bg.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fit.json
languages/i18n/fr.json
languages/i18n/it.json
languages/i18n/kab.json
languages/i18n/ko.json
languages/i18n/mk.json
languages/i18n/my.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nqo.json
languages/i18n/pl.json
maintenance/archives/patch-actor-table.sql
maintenance/archives/patch-archive-ar_actor.sql [new file with mode: 0644]
maintenance/archives/patch-filearchive-fa_actor.sql [new file with mode: 0644]
maintenance/archives/patch-image-img_actor.sql [new file with mode: 0644]
maintenance/archives/patch-ipblocks-ipb_by_actor.sql [new file with mode: 0644]
maintenance/archives/patch-logging-log_actor.sql [new file with mode: 0644]
maintenance/archives/patch-oldimage-oi_actor.sql [new file with mode: 0644]
maintenance/archives/patch-recentchanges-rc_actor.sql [new file with mode: 0644]
maintenance/archives/patch-revision_actor_temp-table.sql [new file with mode: 0644]
maintenance/dev/includes/router.php
maintenance/postgres/archives/patch-actor-table.sql
maintenance/postgres/archives/patch-revision_actor_temp-table.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-actor-table.sql [deleted file]
maintenance/sqlite/archives/patch-archive-ar_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-image-img_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-ipblocks-ipb_by_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-logging-log_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-oldimage-oi_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-recentchanges-rc_actor.sql [new file with mode: 0644]
package-lock.json
package.json
tests/phpunit/includes/Revision/McrRevisionStoreDbTest.php
tests/phpunit/includes/Revision/RevisionQueryInfoTest.php
tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/selenium/.eslintrc.json
tests/selenium/pageobjects/createaccount.page.js
tests/selenium/pageobjects/delete.page.js
tests/selenium/pageobjects/edit.page.js
tests/selenium/pageobjects/history.page.js
tests/selenium/pageobjects/page.js [deleted file]
tests/selenium/pageobjects/preferences.page.js
tests/selenium/pageobjects/recentchanges.page.js
tests/selenium/pageobjects/restore.page.js
tests/selenium/pageobjects/undo.page.js
tests/selenium/pageobjects/userlogin.page.js [deleted file]
tests/selenium/pageobjects/watchable.page.js
tests/selenium/pageobjects/watchlist.page.js
tests/selenium/specs/page.js
tests/selenium/specs/rollback.js
tests/selenium/specs/specialrecentchanges.js
tests/selenium/specs/specialwatchlist.js
tests/selenium/specs/user.js
tests/selenium/wdio-mediawiki/Api.js
tests/selenium/wdio-mediawiki/BlankPage.js
tests/selenium/wdio-mediawiki/LoginPage.js
tests/selenium/wdio-mediawiki/Page.js
tests/selenium/wdio-mediawiki/README.md
tests/selenium/wdio-mediawiki/RunJobs.js
tests/selenium/wdio-mediawiki/Util.js
tests/selenium/wdio-mediawiki/index.js
tests/selenium/wdio-mediawiki/package.json
tests/selenium/wdio-mediawiki/specs/BlankPage.js
tests/selenium/wdio.conf.js

index c444cc4..420fe65 100644 (file)
@@ -1653,6 +1653,11 @@ class RevisionStore
                                        = $this->emulateContentId( intval( $row->rev_text_id ) );
                        }
 
+                       // We may have a fake blob_data field from getSlotRowsForBatch(), use it!
+                       if ( isset( $row->blob_data ) ) {
+                               $slotContents[$row->content_address] = $row->blob_data;
+                       }
+
                        $contentCallback = function ( SlotRecord $slot ) use ( $slotContents, $queryFlags ) {
                                $blob = null;
                                if ( isset( $slotContents[$slot->getAddress()] ) ) {
@@ -1897,7 +1902,8 @@ class RevisionStore
         * @param array $options Supports the following options:
         *               'slots' - whether metadata about revision slots should be
         *               loaded immediately. Supports falsy or truthy value as well
-        *               as an explicit list of slot role names.
+        *               as an explicit list of slot role names. The main slot will
+        *               always be loaded.
         *               'content'- whether the actual content of the slots should be
         *               preloaded.
         * @param int $queryFlags
@@ -1918,7 +1924,7 @@ class RevisionStore
                $result = new StatusValue();
 
                $rowsByRevId = [];
-               $pageIds = [];
+               $pageIdsToFetchTitles = [];
                $titlesByPageId = [];
                foreach ( $rows as $row ) {
                        if ( isset( $rowsByRevId[$row->rev_id] ) ) {
@@ -1931,8 +1937,17 @@ class RevisionStore
                                throw new InvalidArgumentException(
                                        "Revision {$row->rev_id} doesn't belong to page {$title->getArticleID()}"
                                );
+                       } elseif ( !$title && !isset( $titlesByPageId[ $row->rev_page ] ) ) {
+                               if ( isset( $row->page_namespace ) && isset( $row->page_title ) &&
+                                       // This should not happen, but just in case we don't have a page_id
+                                       // set or it doesn't match rev_page, let's fetch the title again.
+                                       isset( $row->page_id ) && $row->rev_page === $row->page_id
+                               ) {
+                                       $titlesByPageId[ $row->rev_page ] = Title::newFromRow( $row );
+                               } else {
+                                       $pageIdsToFetchTitles[] = $row->rev_page;
+                               }
                        }
-                       $pageIds[] = $row->rev_page;
                        $rowsByRevId[$row->rev_id] = $row;
                }
 
@@ -1944,9 +1959,9 @@ class RevisionStore
                // If the title is not supplied, batch-fetch Title objects.
                if ( $title ) {
                        $titlesByPageId[$title->getArticleID()] = $title;
-               } else {
-                       $pageIds = array_unique( $pageIds );
-                       foreach ( Title::newFromIDs( $pageIds ) as $t ) {
+               } elseif ( !empty( $pageIdsToFetchTitles ) ) {
+                       $pageIdsToFetchTitles = array_unique( $pageIdsToFetchTitles );
+                       foreach ( Title::newFromIDs( $pageIdsToFetchTitles ) as $t ) {
                                $titlesByPageId[$t->getArticleID()] = $t;
                        }
                }
@@ -1969,47 +1984,25 @@ class RevisionStore
                        return $result;
                }
 
-               $slotQueryConds = [ 'slot_revision_id' => array_keys( $rowsByRevId ) ];
-               if ( is_array( $options['slots'] ) ) {
-                       $slotQueryConds['slot_role_id'] = array_map( function ( $slot_name ) {
-                               return $this->slotRoleStore->getId( $slot_name );
-                       }, $options['slots'] );
-               }
-
-               // We need to set the `content` flag because newRevisionFromRowAndSlots requires content
-               // metadata to be loaded.
-               $slotQueryInfo = self::getSlotsQueryInfo( [ 'content' ] );
-               $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
-               $slotRows = $db->select(
-                       $slotQueryInfo['tables'],
-                       $slotQueryInfo['fields'],
-                       $slotQueryConds,
-                       __METHOD__,
-                       [],
-                       $slotQueryInfo['joins']
-               );
+               $slotRowOptions = [
+                       'slots' => $options['slots'] ?? true,
+                       'blobs' => $options['content'] ?? false,
+               ];
 
-               $slotRowsByRevId = [];
-               foreach ( $slotRows as $slotRow ) {
-                       $slotRowsByRevId[$slotRow->slot_revision_id][] = $slotRow;
+               if ( is_array( $slotRowOptions['slots'] )
+                       && !in_array( SlotRecord::MAIN, $slotRowOptions['slots'] )
+               ) {
+                       // Make sure the main slot is always loaded, RevisionRecord requires this.
+                       $slotRowOptions['slots'][] = SlotRecord::MAIN;
                }
 
-               $slotContents = null;
-               if ( $options['content'] ?? false ) {
-                       $blobAddresses = [];
-                       foreach ( $slotRows as $slotRow ) {
-                               $blobAddresses[] = $slotRow->content_address;
-                       }
-                       $slotContentFetchStatus = $this->blobStore
-                               ->getBlobBatch( $blobAddresses, $queryFlags );
-                       foreach ( $slotContentFetchStatus->getErrors() as $error ) {
-                               $result->warning( $error['message'], ...$error['params'] );
-                       }
-                       $slotContents = $slotContentFetchStatus->getValue();
-               }
+               $slotRowsStatus = $this->getSlotRowsForBatch( $rowsByRevId, $slotRowOptions, $queryFlags );
+
+               $result->merge( $slotRowsStatus );
+               $slotRowsByRevId = $slotRowsStatus->getValue();
 
                $result->setResult( true, array_map( function ( $row ) use
-                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $slotContents, $result ) {
+                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $result ) {
                                if ( !isset( $slotRowsByRevId[$row->rev_id] ) ) {
                                        $result->warning(
                                                'internalerror',
@@ -2025,8 +2018,7 @@ class RevisionStore
                                                                $row->rev_id,
                                                                $slotRowsByRevId[$row->rev_id],
                                                                $queryFlags,
-                                                               $titlesByPageId[$row->rev_page],
-                                                               $slotContents
+                                                               $titlesByPageId[$row->rev_page]
                                                        )
                                                ),
                                                $queryFlags,
@@ -2040,6 +2032,174 @@ class RevisionStore
                return $result;
        }
 
+       /**
+        * Gets the slot rows associated with a batch of revisions.
+        * The serialized content of each slot can be included by setting the 'blobs' option.
+        * Callers are responsible for unserializing and interpreting the content blobs
+        * based on the model_name and role_name fields.
+        *
+        * @param Traversable|array $rowsOrIds list of revision ids, or revision rows from a db query.
+        * @param array $options Supports the following options:
+        *               'slots' - a list of slot role names to fetch. If omitted or true or null,
+        *                         all slots are fetched
+        *               'blobs'- whether the serialized content of each slot should be loaded.
+        *                        If true, the serialiezd content will be present in the slot row
+        *                        in the blob_data field.
+        * @param int $queryFlags
+        *
+        * @return StatusValue a status containing, if isOK() returns true, a two-level nested
+        *         associative array, mapping from revision ID to an associative array that maps from
+        *         role name to a database row object. The database row object will contain the fields
+        *         defined by getSlotQueryInfo() with the 'content' flag set, plus the blob_data field
+        *         if the 'blobs' is set in $options. The model_name and role_name fields will also be
+        *         set.
+        */
+       private function getSlotRowsForBatch(
+               $rowsOrIds,
+               array $options = [],
+               $queryFlags = 0
+       ) {
+               $readNew = $this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW );
+               $result = new StatusValue();
+
+               $revIds = [];
+               foreach ( $rowsOrIds as $row ) {
+                       $revIds[] = is_object( $row ) ? (int)$row->rev_id : (int)$row;
+               }
+
+               // Nothing to do.
+               // Note that $rowsOrIds may not be "empty" even if $revIds is, e.g. if it's a ResultWrapper.
+               if ( empty( $revIds ) ) {
+                       $result->setResult( true, [] );
+                       return $result;
+               }
+
+               // We need to set the `content` flag to join in content meta-data
+               $slotQueryInfo = self::getSlotsQueryInfo( [ 'content' ] );
+               $revIdField = $slotQueryInfo['keys']['rev_id'];
+               $slotQueryConds = [ $revIdField => $revIds ];
+
+               if ( $readNew && isset( $options['slots'] ) && is_array( $options['slots'] ) ) {
+                       if ( empty( $options['slots'] ) ) {
+                               // Degenerate case: return no slots for each revision.
+                               $result->setResult( true, array_fill_keys( $revIds, [] ) );
+                               return $result;
+                       }
+
+                       $roleIdField = $slotQueryInfo['keys']['role_id'];
+                       $slotQueryConds[$roleIdField] = array_map( function ( $slot_name ) {
+                               return $this->slotRoleStore->getId( $slot_name );
+                       }, $options['slots'] );
+               }
+
+               $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
+               $slotRows = $db->select(
+                       $slotQueryInfo['tables'],
+                       $slotQueryInfo['fields'],
+                       $slotQueryConds,
+                       __METHOD__,
+                       [],
+                       $slotQueryInfo['joins']
+               );
+
+               $slotContents = null;
+               if ( $options['blobs'] ?? false ) {
+                       $blobAddresses = [];
+                       foreach ( $slotRows as $slotRow ) {
+                               $blobAddresses[] = $slotRow->content_address;
+                       }
+                       $slotContentFetchStatus = $this->blobStore
+                               ->getBlobBatch( $blobAddresses, $queryFlags );
+                       foreach ( $slotContentFetchStatus->getErrors() as $error ) {
+                               $result->warning( $error['message'], ...$error['params'] );
+                       }
+                       $slotContents = $slotContentFetchStatus->getValue();
+               }
+
+               $slotRowsByRevId = [];
+               foreach ( $slotRows as $slotRow ) {
+                       if ( $slotContents === null ) {
+                               // nothing to do
+                       } elseif ( isset( $slotContents[$slotRow->content_address] ) ) {
+                               $slotRow->blob_data = $slotContents[$slotRow->content_address];
+                       } else {
+                               $result->warning(
+                                       'internalerror',
+                                       "Couldn't find blob data for rev {$slotRow->slot_revision_id}"
+                               );
+                               $slotRow->blob_data = null;
+                       }
+
+                       // conditional needed for SCHEMA_COMPAT_READ_OLD
+                       if ( !isset( $slotRow->role_name ) && isset( $slotRow->slot_role_id ) ) {
+                               $slotRow->role_name = $this->slotRoleStore->getName( (int)$slotRow->slot_role_id );
+                       }
+
+                       // conditional needed for SCHEMA_COMPAT_READ_OLD
+                       if ( !isset( $slotRow->model_name ) && isset( $slotRow->content_model ) ) {
+                               $slotRow->model_name = $this->contentModelStore->getName( (int)$slotRow->content_model );
+                       }
+
+                       $slotRowsByRevId[$slotRow->slot_revision_id][$slotRow->role_name] = $slotRow;
+               }
+
+               $result->setResult( true, $slotRowsByRevId );
+               return $result;
+       }
+
+       /**
+        * Gets raw (serialized) content blobs for the given set of revisions.
+        * Callers are responsible for unserializing and interpreting the content blobs
+        * based on the model_name field and the slot role.
+        *
+        * This method is intended for bulk operations in maintenance scripts.
+        * It may be chosen over newRevisionsFromBatch by code that are only interested
+        * in raw content, as opposed to meta data. Code that needs to access meta data of revisions,
+        * slots, or content objects should use newRevisionsFromBatch() instead.
+        *
+        * @param Traversable|array $rowsOrIds list of revision ids, or revision rows from a db query.
+        * @param array|null $slots the role names for which to get slots.
+        * @param int $queryFlags
+        *
+        * @return StatusValue a status containing, if isOK() returns true, a two-level nested
+        *         associative array, mapping from revision ID to an associative array that maps from
+        *         role name to an anonymous object object containing two fields:
+        *         - model_name: the name of the content's model
+        *         - blob_data: serialized content data
+        */
+       public function getContentBlobsForBatch(
+               $rowsOrIds,
+               $slots = null,
+               $queryFlags = 0
+       ) {
+               $result = $this->getSlotRowsForBatch(
+                       $rowsOrIds,
+                       [ 'slots' => $slots, 'blobs' => true ],
+                       $queryFlags
+               );
+
+               if ( $result->isOK() ) {
+                       // strip out all internal meta data that we don't want to expose
+                       foreach ( $result->value as $revId => $rowsByRole ) {
+                               foreach ( $rowsByRole as $role => $slotRow ) {
+                                       if ( is_array( $slots ) && !in_array( $role, $slots ) ) {
+                                               // In SCHEMA_COMPAT_READ_OLD mode we may get the main slot even
+                                               // if we didn't ask for it.
+                                               unset( $result->value[$revId][$role] );
+                                               continue;
+                                       }
+
+                                       $result->value[$revId][$role] = (object)[
+                                               'blob_data' => $slotRow->blob_data,
+                                               'model_name' => $slotRow->model_name,
+                                       ];
+                               }
+                       }
+               }
+
+               return $result;
+       }
+
        /**
         * Constructs a new MutableRevisionRecord based on the given associative array following
         * the MW1.29 convention for the Revision constructor.
@@ -2589,16 +2749,22 @@ class RevisionStore
         *  - tables: (string[]) to include in the `$table` to `IDatabase->select()`
         *  - fields: (string[]) to include in the `$vars` to `IDatabase->select()`
         *  - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
+        *  - keys: (associative array) to look up fields to match against.
+        *          In particular, the field that can be used to find slots by rev_id
+        *          can be found in ['keys']['rev_id'].
         */
        public function getSlotsQueryInfo( $options = [] ) {
                $ret = [
                        'tables' => [],
                        'fields' => [],
                        'joins'  => [],
+                       'keys'  => [],
                ];
 
                if ( $this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_OLD ) ) {
                        $db = $this->getDBConnectionRef( DB_REPLICA );
+                       $ret['keys']['rev_id'] = 'rev_id';
+
                        $ret['tables'][] = 'revision';
 
                        $ret['fields']['slot_revision_id'] = 'rev_id';
@@ -2622,6 +2788,9 @@ class RevisionStore
                                }
                        }
                } else {
+                       $ret['keys']['rev_id'] = 'slot_revision_id';
+                       $ret['keys']['role_id'] = 'slot_role_id';
+
                        $ret['tables'][] = 'slots';
                        $ret['fields'] = array_merge( $ret['fields'], [
                                'slot_revision_id',
@@ -2639,6 +2808,8 @@ class RevisionStore
                        }
 
                        if ( in_array( 'content', $options, true ) ) {
+                               $ret['keys']['model_id'] = 'content_model';
+
                                $ret['tables'][] = 'content';
                                $ret['fields'] = array_merge( $ret['fields'], [
                                        'content_size',
index a249ada..5b0909f 100644 (file)
@@ -358,6 +358,14 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'addTable', 'content_models', 'patch-content_models.sql' ],
                        [ 'migrateArchiveText' ],
                        [ 'addTable', 'actor', 'patch-actor-table.sql' ],
+                       [ 'addTable', 'revision_actor_temp', 'patch-revision_actor_temp-table.sql' ],
+                       [ 'addField', 'archive', 'ar_actor', 'patch-archive-ar_actor.sql' ],
+                       [ 'addField', 'ipblocks', 'ipb_by_actor', 'patch-ipblocks-ipb_by_actor.sql' ],
+                       [ 'addField', 'image', 'img_actor', 'patch-image-img_actor.sql' ],
+                       [ 'addField', 'oldimage', 'oi_actor', 'patch-oldimage-oi_actor.sql' ],
+                       [ 'addField', 'filearchive', 'fa_actor', 'patch-filearchive-fa_actor.sql' ],
+                       [ 'addField', 'recentchanges', 'rc_actor', 'patch-recentchanges-rc_actor.sql' ],
+                       [ 'addField', 'logging', 'log_actor', 'patch-logging-log_actor.sql' ],
                        [ 'migrateActors' ],
                        [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
                        [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
index d7b1457..d0b16cb 100644 (file)
@@ -512,6 +512,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addTable', 'slot_roles', 'patch-slot_roles-table.sql' ],
                        [ 'migrateArchiveText' ],
                        [ 'addTable', 'actor', 'patch-actor-table.sql' ],
+                       [ 'addTable', 'revision_actor_temp', 'patch-revision_actor_temp-table.sql' ],
                        [ 'setDefault', 'revision', 'rev_user', 0 ],
                        [ 'setDefault', 'revision', 'rev_user_text', '' ],
                        [ 'setDefault', 'archive', 'ar_user', 0 ],
index 15b3a5a..eac0738 100644 (file)
@@ -216,7 +216,14 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
                        [ 'migrateArchiveText' ],
                        [ 'addTable', 'actor', 'patch-actor-table.sql' ],
+                       [ 'addField', 'archive', 'ar_actor', 'patch-archive-ar_actor.sql' ],
+                       [ 'addTable', 'revision_actor_temp', 'patch-revision_actor_temp-table.sql' ],
+                       [ 'addField', 'ipblocks', 'ipb_by_actor', 'patch-ipblocks-ipb_by_actor.sql' ],
+                       [ 'addField', 'image', 'img_actor', 'patch-image-img_actor.sql' ],
+                       [ 'addField', 'oldimage', 'oi_actor', 'patch-oldimage-oi_actor.sql' ],
                        [ 'addField', 'filearchive', 'fa_actor', 'patch-filearchive-fa_actor.sql' ],
+                       [ 'addField', 'recentchanges', 'rc_actor', 'patch-recentchanges-rc_actor.sql' ],
+                       [ 'addField', 'logging', 'log_actor', 'patch-logging-log_actor.sql' ],
                        [ 'migrateActors' ],
                        [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
                        [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
index d7d428e..ffb8793 100644 (file)
@@ -1440,7 +1440,10 @@ abstract class FileBackendStore extends FileBackend {
                                $name = strtolower( $name );
                                $maxHVLen = in_array( $name, $longs ) ? INF : 255;
                                if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
-                                       trigger_error( "Header '$name: $value' is too long." );
+                                       $this->logger->error( "Header '{header}' is too long.", [
+                                               'filebackend' => $this->name,
+                                               'header' => "$name: $value",
+                                       ] );
                                } else {
                                        $newHeaders[$name] = strlen( $value ) ? $value : ''; // null/false => ""
                                }
@@ -1789,7 +1792,9 @@ abstract class FileBackendStore extends FileBackend {
         */
        final protected function deleteContainerCache( $container ) {
                if ( !$this->memCache->delete( $this->containerCacheKey( $container ), 300 ) ) {
-                       trigger_error( "Unable to delete stat cache for container $container." );
+                       $this->logger->warning( "Unable to delete stat cache for container {container}.",
+                               [ 'filebackend' => $this->name, 'container' => $container ]
+                       );
                }
        }
 
@@ -1887,7 +1892,9 @@ abstract class FileBackendStore extends FileBackend {
                        return; // invalid storage path
                }
                if ( !$this->memCache->delete( $this->fileCacheKey( $path ), 300 ) ) {
-                       trigger_error( "Unable to delete stat cache for file $path." );
+                       $this->logger->warning( "Unable to delete stat cache for file {path}.",
+                               [ 'filebackend' => $this->name, 'path' => $path ]
+                       );
                }
        }
 
index 9ec5834..ccc46bb 100644 (file)
@@ -759,7 +759,7 @@ class Parser {
 
                if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                        wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
-                               $this->mTitle->getPrefixedDBkey() );
+                               $this->getTitle()->getPrefixedDBkey() );
                }
                return $text;
        }
@@ -906,9 +906,9 @@ class Parser {
        /**
         * Set the context title
         *
-        * @param Title $t
+        * @param Title|null $t
         */
-       public function setTitle( $t ) {
+       public function setTitle( Title $t = null ) {
                if ( !$t ) {
                        $t = Title::makeTitle( NS_SPECIAL, 'Badtitle/Parser' );
                }
@@ -924,9 +924,9 @@ class Parser {
        /**
         * Accessor for the Title object
         *
-        * @return Title|null
+        * @return Title
         */
-       public function getTitle() {
+       public function getTitle() : Title {
                return $this->mTitle;
        }
 
@@ -936,7 +936,7 @@ class Parser {
         * @param Title|null $x Title object or null to just get the current one
         * @return Title
         */
-       public function Title( $x = null ) {
+       public function Title( Title $x = null ) : Title {
                return wfSetVar( $this->mTitle, $x );
        }
 
@@ -1022,7 +1022,6 @@ class Parser {
         *
         * @since 1.19
         *
-        * @throws MWException
         * @return Language
         */
        public function getTargetLanguage() {
@@ -1032,11 +1031,9 @@ class Parser {
                        return $target;
                } elseif ( $this->mOptions->getInterfaceMessage() ) {
                        return $this->mOptions->getUserLangObj();
-               } elseif ( is_null( $this->mTitle ) ) {
-                       throw new MWException( __METHOD__ . ': $this->mTitle is null' );
                }
 
-               return $this->mTitle->getPageLanguage();
+               return $this->getTitle()->getPageLanguage();
        }
 
        /**
@@ -1676,7 +1673,14 @@ class Parser {
                        }
                        $url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
                        $this->addTrackingCategory( $trackingCat );
-                       return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass, [], $this->mTitle );
+                       return Linker::makeExternalLink(
+                               $url,
+                               "{$keyword} {$id}",
+                               true,
+                               $cssClass,
+                               [],
+                               $this->getTitle()
+                       );
                } elseif ( isset( $m[6] ) && $m[6] !== ''
                        && $this->mOptions->getMagicISBNLinks()
                ) {
@@ -1771,7 +1775,7 @@ class Parser {
                        $text = Linker::makeExternalLink( $url,
                                $this->getTargetLanguage()->getConverter()->markNoConversion( $url ),
                                true, 'free',
-                               $this->getExternalLinkAttribs( $url ), $this->mTitle );
+                               $this->getExternalLinkAttribs( $url ), $this->getTitle() );
                        # Register it in the output object...
                        $this->mOutput->addExternalLink( $url );
                }
@@ -2069,7 +2073,7 @@ class Parser {
                        # Funny characters like ö aren't valid in URLs anyway
                        # This was changed in August 2004
                        $s .= Linker::makeExternalLink( $url, $text, false, $linktype,
-                               $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail;
+                               $this->getExternalLinkAttribs( $url ), $this->getTitle() ) . $dtrail . $trail;
 
                        # Register link in the output object.
                        $this->mOutput->addExternalLink( $url );
@@ -2110,7 +2114,7 @@ class Parser {
         */
        public function getExternalLinkAttribs( $url ) {
                $attribs = [];
-               $rel = self::getExternalLinkRel( $url, $this->mTitle );
+               $rel = self::getExternalLinkRel( $url, $this->getTitle() );
 
                $target = $this->mOptions->getExternalLinkTarget();
                if ( $target ) {
@@ -2286,7 +2290,6 @@ class Parser {
        /**
         * Process [[ ]] wikilinks (RIL)
         * @param string &$s
-        * @throws MWException
         * @return LinkHolderArray
         *
         * @private
@@ -2312,10 +2315,7 @@ class Parser {
                $line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
                $s = substr( $s, 1 );
 
-               if ( is_null( $this->mTitle ) ) {
-                       throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
-               }
-               $nottalk = !$this->mTitle->isTalkPage();
+               $nottalk = !$this->getTitle()->isTalkPage();
 
                $useLinkPrefixExtension = $this->getTargetLanguage()->linkPrefixExtension();
                $e2 = null;
@@ -2509,7 +2509,7 @@ class Parser {
                                }
 
                                if ( $ns == NS_FILE ) {
-                                       if ( !$this->badFileLookup->isBadFile( $nt->getDBkey(), $this->mTitle ) ) {
+                                       if ( !$this->badFileLookup->isBadFile( $nt->getDBkey(), $this->getTitle() ) ) {
                                                if ( $wasblank ) {
                                                        # if no parameters were passed, $text
                                                        # becomes something like "File:Foo.png",
@@ -2551,7 +2551,7 @@ class Parser {
                        # Self-link checking. For some languages, variants of the title are checked in
                        # LinkHolderArray::doVariants() to allow batching the existence checks necessary
                        # for linking to a different variant.
-                       if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && !$nt->hasFragment() ) {
+                       if ( $ns != NS_SPECIAL && $nt->equals( $this->getTitle() ) && !$nt->hasFragment() ) {
                                $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
                                continue;
                        }
@@ -2635,7 +2635,7 @@ class Parser {
         */
        public function areSubpagesAllowed() {
                # Some namespaces don't allow subpages
-               return $this->nsInfo->hasSubpages( $this->mTitle->getNamespace() );
+               return $this->nsInfo->hasSubpages( $this->getTitle()->getNamespace() );
        }
 
        /**
@@ -2647,7 +2647,7 @@ class Parser {
         * @private
         */
        public function maybeDoSubpageLink( $target, &$text ) {
-               return Linker::normalizeSubpageLink( $this->mTitle, $target, $text );
+               return Linker::normalizeSubpageLink( $this->getTitle(), $target, $text );
        }
 
        /**
@@ -2670,19 +2670,9 @@ class Parser {
         * @param string $index Magic variable identifier as mapped in MagicWordFactory::$mVariableIDs
         * @param bool|PPFrame $frame
         *
-        * @throws MWException
         * @return string
         */
        public function getVariableValue( $index, $frame = false ) {
-               if ( is_null( $this->mTitle ) ) {
-                       // If no title set, bad things are going to happen
-                       // later. Title should always be set since this
-                       // should only be called in the middle of a parse
-                       // operation (but the unit-tests do funky stuff)
-                       throw new MWException( __METHOD__ . ' Should only be '
-                               . ' called while parsing (no title set)' );
-               }
-
                // Avoid PHP 7.1 warning from passing $this by reference
                $parser = $this;
 
@@ -2749,72 +2739,72 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'd' ), true );
                                break;
                        case 'pagename':
-                               $value = wfEscapeWikiText( $this->mTitle->getText() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getText() );
                                break;
                        case 'pagenamee':
-                               $value = wfEscapeWikiText( $this->mTitle->getPartialURL() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getPartialURL() );
                                break;
                        case 'fullpagename':
-                               $value = wfEscapeWikiText( $this->mTitle->getPrefixedText() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getPrefixedText() );
                                break;
                        case 'fullpagenamee':
-                               $value = wfEscapeWikiText( $this->mTitle->getPrefixedURL() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getPrefixedURL() );
                                break;
                        case 'subpagename':
-                               $value = wfEscapeWikiText( $this->mTitle->getSubpageText() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getSubpageText() );
                                break;
                        case 'subpagenamee':
-                               $value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getSubpageUrlForm() );
                                break;
                        case 'rootpagename':
-                               $value = wfEscapeWikiText( $this->mTitle->getRootText() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getRootText() );
                                break;
                        case 'rootpagenamee':
                                $value = wfEscapeWikiText( wfUrlencode( str_replace(
                                        ' ',
                                        '_',
-                                       $this->mTitle->getRootText()
+                                       $this->getTitle()->getRootText()
                                ) ) );
                                break;
                        case 'basepagename':
-                               $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
+                               $value = wfEscapeWikiText( $this->getTitle()->getBaseText() );
                                break;
                        case 'basepagenamee':
                                $value = wfEscapeWikiText( wfUrlencode( str_replace(
                                        ' ',
                                        '_',
-                                       $this->mTitle->getBaseText()
+                                       $this->getTitle()->getBaseText()
                                ) ) );
                                break;
                        case 'talkpagename':
-                               if ( $this->mTitle->canHaveTalkPage() ) {
-                                       $talkPage = $this->mTitle->getTalkPage();
+                               if ( $this->getTitle()->canHaveTalkPage() ) {
+                                       $talkPage = $this->getTitle()->getTalkPage();
                                        $value = wfEscapeWikiText( $talkPage->getPrefixedText() );
                                } else {
                                        $value = '';
                                }
                                break;
                        case 'talkpagenamee':
-                               if ( $this->mTitle->canHaveTalkPage() ) {
-                                       $talkPage = $this->mTitle->getTalkPage();
+                               if ( $this->getTitle()->canHaveTalkPage() ) {
+                                       $talkPage = $this->getTitle()->getTalkPage();
                                        $value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
                                } else {
                                        $value = '';
                                }
                                break;
                        case 'subjectpagename':
-                               $subjPage = $this->mTitle->getSubjectPage();
+                               $subjPage = $this->getTitle()->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedText() );
                                break;
                        case 'subjectpagenamee':
-                               $subjPage = $this->mTitle->getSubjectPage();
+                               $subjPage = $this->getTitle()->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
                                break;
                        case 'pageid': // requested in T25427
                                # Inform the edit saving system that getting the canonical output
                                # after page insertion requires a parse that used that exact page ID
                                $this->setOutputFlag( 'vary-page-id', '{{PAGEID}} used' );
-                               $value = $this->mTitle->getArticleID();
+                               $value = $this->getTitle()->getArticleID();
                                if ( !$value ) {
                                        $value = $this->mOptions->getSpeculativePageId();
                                        if ( $value ) {
@@ -2827,7 +2817,7 @@ class Parser {
                                        $this->svcOptions->get( 'MiserMode' ) &&
                                        !$this->mOptions->getInterfaceMessage() &&
                                        // @TODO: disallow this word on all namespaces
-                                       $this->nsInfo->isContent( $this->mTitle->getNamespace() )
+                                       $this->nsInfo->isContent( $this->getTitle()->getNamespace() )
                                ) {
                                        // Use a stub result instead of the actual revision ID in order to avoid
                                        // double parses on page save but still allow preview detection (T137900)
@@ -2883,27 +2873,29 @@ class Parser {
                                break;
                        case 'namespace':
                                $value = str_replace( '_', ' ',
-                                       $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
+                                       $this->contLang->getNsText( $this->getTitle()->getNamespace() ) );
                                break;
                        case 'namespacee':
-                               $value = wfUrlencode( $this->contLang->getNsText( $this->mTitle->getNamespace() ) );
+                               $value = wfUrlencode( $this->contLang->getNsText( $this->getTitle()->getNamespace() ) );
                                break;
                        case 'namespacenumber':
-                               $value = $this->mTitle->getNamespace();
+                               $value = $this->getTitle()->getNamespace();
                                break;
                        case 'talkspace':
-                               $value = $this->mTitle->canHaveTalkPage()
-                                       ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() )
+                               $value = $this->getTitle()->canHaveTalkPage()
+                                       ? str_replace( '_', ' ', $this->getTitle()->getTalkNsText() )
                                        : '';
                                break;
                        case 'talkspacee':
-                               $value = $this->mTitle->canHaveTalkPage() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
+                               $value = $this->getTitle()->canHaveTalkPage()
+                                       ? wfUrlencode( $this->getTitle()->getTalkNsText() )
+                                       : '';
                                break;
                        case 'subjectspace':
-                               $value = str_replace( '_', ' ', $this->mTitle->getSubjectNsText() );
+                               $value = str_replace( '_', ' ', $this->getTitle()->getSubjectNsText() );
                                break;
                        case 'subjectspacee':
-                               $value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) );
+                               $value = ( wfUrlencode( $this->getTitle()->getSubjectNsText() ) );
                                break;
                        case 'currentdayname':
                                $value = $pageLang->getWeekdayName( (int)MWTimestamp::getInstance( $ts )->format( 'w' ) + 1 );
@@ -3377,7 +3369,7 @@ class Parser {
                        $relative = $this->maybeDoSubpageLink( $part1, $subpage );
                        if ( $part1 !== $relative ) {
                                $part1 = $relative;
-                               $ns = $this->mTitle->getNamespace();
+                               $ns = $this->getTitle()->getNamespace();
                        }
                        $title = Title::newFromText( $part1, $ns );
                        if ( $title ) {
@@ -3582,7 +3574,6 @@ class Parser {
         * @param PPFrame $frame The current frame, contains template arguments
         * @param string $function Function name
         * @param array $args Arguments to the function
-        * @throws MWException
         * @return array
         */
        public function callParserFunction( $frame, $function, array $args = [] ) {
@@ -4221,17 +4212,17 @@ class Parser {
                        $this->mShowToc = false;
                }
                if ( isset( $this->mDoubleUnderscores['hiddencat'] )
-                       && $this->mTitle->getNamespace() == NS_CATEGORY
+                       && $this->getTitle()->getNamespace() == NS_CATEGORY
                ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
                # (T10068) Allow control over whether robots index a page.
                # __INDEX__ always overrides __NOINDEX__, see T16899
-               if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex() ) {
+               if ( isset( $this->mDoubleUnderscores['noindex'] ) && $this->getTitle()->canUseNoindex() ) {
                        $this->mOutput->setIndexPolicy( 'noindex' );
                        $this->addTrackingCategory( 'noindex-category' );
                }
-               if ( isset( $this->mDoubleUnderscores['index'] ) && $this->mTitle->canUseNoindex() ) {
+               if ( isset( $this->mDoubleUnderscores['index'] ) && $this->getTitle()->canUseNoindex() ) {
                        $this->mOutput->setIndexPolicy( 'index' );
                        $this->addTrackingCategory( 'index-category' );
                }
@@ -4250,7 +4241,7 @@ class Parser {
         * @return bool Whether the addition was successful
         */
        public function addTrackingCategory( $msg ) {
-               return $this->mOutput->addTrackingCategory( $msg, $this->mTitle );
+               return $this->mOutput->addTrackingCategory( $msg, $this->getTitle() );
        }
 
        /**
@@ -4328,7 +4319,7 @@ class Parser {
                $toclevel = 0;
                $prevtoclevel = 0;
                $markerRegex = self::MARKER_PREFIX . "-h-(\d+)-" . self::MARKER_SUFFIX;
-               $baseTitleText = $this->mTitle->getPrefixedDBkey();
+               $baseTitleText = $this->getTitle()->getPrefixedDBkey();
                $oldType = $this->mOutputType;
                $this->setOutputType( self::OT_WIKI );
                $frame = $this->getPreprocessor()->newFrame();
@@ -4561,7 +4552,7 @@ class Parser {
                                        $editsectionSection = "T-$sectionIndex";
                                        $editsectionContent = null;
                                } else {
-                                       $editsectionPage = $this->mTitle->getPrefixedText();
+                                       $editsectionPage = $this->getTitle()->getPrefixedText();
                                        $editsectionSection = $sectionIndex;
                                        $editsectionContent = $headlineHint;
                                }
@@ -4752,7 +4743,7 @@ class Parser {
                $text = preg_replace( $p4, '[[\\1\\2\\3|\\2]]', $text );
                $text = preg_replace( $p3, '[[\\1\\2\\3\\4|\\2]]', $text );
 
-               $t = $this->mTitle->getText();
+               $t = $this->getTitle()->getText();
                $m = [];
                if ( preg_match( "/^($nc+:|)$tc+?( \\($tc+\\))$/", $t, $m ) ) {
                        $text = preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text );
@@ -5179,7 +5170,7 @@ class Parser {
                        $ig = ImageGalleryBase::factory( false );
                }
 
-               $ig->setContextTitle( $this->mTitle );
+               $ig->setContextTitle( $this->getTitle() );
                $ig->setShowBytes( false );
                $ig->setShowDimensions( false );
                $ig->setShowFilename( false );
@@ -6510,7 +6501,7 @@ class Parser {
         */
        protected function setOutputFlag( $flag, $reason ) {
                $this->mOutput->setFlag( $flag );
-               $name = $this->mTitle->getPrefixedText();
+               $name = $this->getTitle()->getPrefixedText();
                $this->logger->debug( __METHOD__ . ": set $flag flag on '$name'; $reason" );
        }
 }
index eca3a97..b4a0f46 100644 (file)
@@ -697,7 +697,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @return array
         */
        final protected function buildContent( ResourceLoaderContext $context ) {
-               $rl = $context->getResourceLoader();
                $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $statStart = microtime( true );
 
@@ -766,7 +765,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                }
                                // Wrap styles into @media groups as needed and flatten into a numerical array
                                $styles = [
-                                       'css' => $rl->makeCombinedStyles( $stylePairs )
+                                       'css' => ResourceLoader::makeCombinedStyles( $stylePairs )
                                ];
                        }
                }
index d2ed7e5..cb93cc6 100644 (file)
        "version-poweredby-credits": "تدار هذه الويكي بواسطة <strong>[https://www.mediawiki.org/ ميدياويكي]</strong>، حقوق النشر © 2001-$1 $2.",
        "version-poweredby-others": "آخرون",
        "version-poweredby-translators": "مترجمو ترانسليت ويكي دوت نت",
+       "version-poweredby-various": "مؤلفون متعددون",
        "version-credits-summary": "نود أن نعرف بالأشخاص التالية أسماؤهم لمساهمتهم في [[Special:Version|ميدياويكي]].",
        "version-license-info": "ميدياويكي برنامج حر، يحق لك توزيعه و/أو تعديله وفقاً لبنود رخصة جنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (وفقا لاختيارك أنت) أي إصدار لاحق.\n\nهذا البرنامج يوزع على أمل أن يكون مفيداً، ولكن <em>دون أية ضمانات</em>، بما في ذلك ضمانات <strong>التسويق</strong> أو <strong>الملاءمة لغرض معين</strong>. انظر رخصة جنو العمومية لمزيد من التفاصيل.\n\nينبغي أن تكون قد تلقيت [{{SERVER}}{{SCRIPTPATH}}/COPYING نسخة من رخصة جنو العمومية] إذا لم يتم ذلك، اكتب إلى Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA أو [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اقرأها على الإنترنت].",
        "version-software": "البرنامج المثبت",
index f300cd6..18eb469 100644 (file)
@@ -13,7 +13,8 @@
                        "Abdeaitali",
                        "Reda Benkhadra",
                        "Anass Sedrati",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "SADIQUI"
                ]
        },
        "tog-underline": "Ṣetter l-lyanaṫ:",
        "editfont-monospace": "ĥtt tabit lġarḍ",
        "editfont-sansserif": "ĥtt  ba ziyada",
        "editfont-serif": "kht bzwayd",
-       "sunday": "لحد",
-       "monday": "تنين",
-       "tuesday": "Ṫ-Ṫlaṫ",
-       "wednesday": "L-Arbeĝ",
-       "thursday": "L-Ĥmis",
-       "friday": "جÙ\85عا",
-       "saturday": "سبت",
-       "sun": "Ḫed",
-       "mon": "Ṫnin",
-       "tue": "Ṫlaṫ",
-       "wed": "Arbeĝ",
-       "thu": "Ĥmis",
-       "fri": "جÙ\85عا",
+       "sunday": "الأحد",
+       "monday": "اÙ\84إثنين",
+       "tuesday": "الثلاثاء",
+       "wednesday": "الأربعاء",
+       "thursday": "الخميس",
+       "friday": "اÙ\84جÙ\85عة",
+       "saturday": "اÙ\84سبت",
+       "sun": "أحد",
+       "mon": "اثنين",
+       "tue": "ثلاثاء",
+       "wed": "أربعاء",
+       "thu": "خميس",
+       "fri": "جÙ\85عة",
        "sat": "سبت",
-       "january": "Yanayer",
+       "january": "يناير",
        "february": "فبراير",
-       "march": "Mars",
-       "april": "Abril",
-       "may_long": "May",
-       "june": "Yonyo",
-       "july": "Yolyoz",
-       "august": "Ġoċṫ",
-       "september": "Ċoṫanbir",
-       "october": "Okṫober",
-       "november": "Nowanbir",
-       "december": "Dojanbir",
+       "march": "مارس",
+       "april": "أبريل",
+       "may_long": "ماي",
+       "june": "يونيو",
+       "july": "يوليوز",
+       "august": "غشت",
+       "september": "شتنبر",
+       "october": "أكتوبر",
+       "november": "نونبر",
+       "december": "دجنبر",
        "january-gen": "يناير",
-       "february-gen": "Febrayer",
+       "february-gen": "فبراير",
        "march-gen": "Mars",
        "april-gen": "Abril",
        "may-gen": "May",
        "october-gen": "Okṫober",
        "november-gen": "Nowanbir",
        "december-gen": "Dojanbir",
-       "jan": "Yan",
-       "feb": "Feb",
-       "mar": "Mar",
-       "apr": "Abr",
-       "may": "May",
-       "jun": "Yon",
-       "jul": "Yol",
-       "aug": "Ġoċ",
-       "sep": "Ċoṫ",
-       "oct": "Okṫ",
-       "nov": "Now",
-       "dec": "Doj",
-       "pagecategories": "{{PLURAL:$1|Katégori|Katégoryaṫ}}",
-       "category_header": "ṣ-ṣefḫaṫ fe l-katégori \"$1\"",
+       "jan": "يناير",
+       "feb": "فبراير",
+       "mar": "مارس",
+       "apr": "أبريل",
+       "may": "ماي",
+       "jun": "يونيو",
+       "jul": "يوليو",
+       "aug": "غشت",
+       "sep": "شتنبر",
+       "oct": "أكتوبر",
+       "nov": "نونبر",
+       "dec": "دجنبر",
+       "pagecategories": "{{PLURAL:$1|تصنيف|تصنيفات}}",
+       "category_header": "الصفحات لي كاينين فالتصنيف \"$1\"",
        "subcategories": "L-katégoriyaṫ ṫ-ṫeḫṫaniya",
        "category-media-header": "L-fiċyé mulṫimédya li kaynin fe l-katégori \"$1\"",
        "category-empty": "\" Had l-katégori ma fiha ḫṫa ċi ṣefḫa ola fiċyé mulṫimédya. \"",
-       "hidden-categories": "{{PLURAL:$1|Katégori mĥebya|Katégoryaṫ mĥebyin}}",
+       "hidden-categories": "{{PLURAL:$1|تصنيف مخفي|تصنيفات مخفية}}",
        "hidden-category-category": "Katégoryaṫ mĥebyin",
-       "category-subcat-count": "Had l-katégori fiha {{PLURAL:$2|l-katégori l-ferĝiya|$2 katégoryaṫ ferĝiyin, menhom {{PLURAL:$1|hadi|$1}}}} li l-ṫeḫṫ.",
+       "category-subcat-count": "{{PLURAL:$2|هاد التصنيف فيه غير هاد التصنيف الفرعي|هاد التصنيف فيه {{PLURAL:$1|تصنيف فرعي|$1 تصنيفات فرعية}}، من أصل $2 فالمجموع.}}",
        "category-subcat-count-limited": "Had l-katégori fiha {{PLURAL:$1|l-katégori l-ferĝiya|$1 katégoryaṫ ferĝiyin}} l-ṫeḫṫ.",
-       "category-article-count": "Had l-katégori fiha {{PLURAL:$2|had 'ṣ-ṣefḫa|$2 ṣefḫaṫ, menhom {{PLURAL:$1|hadi|$1}} li l-ṫeḫṫ}}.",
+       "category-article-count": "{{PLURAL:$2|هاد التصنيف فيه غير هاد الصفحة.|هاد {{PLURAL:$1|الصفحة كاينا|$1 الصفحات كاينين}} فهاد التصنيف، من أصل $2 فالمجموع.}}",
        "category-article-count-limited": "{{PLURAL:$1|Had 'ṣ-ṣefḫa kayna|Had $1 dyal 'ṣ-ṣefḫaṫ kaynin}} fe had l-katégori.",
        "category-file-count": "Had l-katégori fiha {{PLURAL:$2|had l-fiċyé|$2 fiċyé, menhom {{PLURAL:$1|hada|$1}} li l-ṫeḫṫ}}.",
        "category-file-count-limited": "{{PLURAL:$1|Had l-fiċyé kayen|Had $1 dyal l-fiċyé kaynin}} fe had l-katégori.",
-       "listingcontinuesabbrev": "L-Kmala",
+       "listingcontinuesabbrev": "لكمالة",
        "index-category": "sfahi mfhrssa",
        "noindex-category": "shat mamfhtsach",
        "broken-file-category": "ṣfaḫi fiha wṣlat milffaṫ mhrrsa",
        "about": "ala",
        "article": "sfht mohtawa",
-       "newwindow": "(kayṫḫell fe ċerjem weḫdaĥor)",
-       "cancel": "lġi",
+       "newwindow": "(كتحل فــوينداو جديدة)",
+       "cancel": "لغي",
        "moredotdotdot": "Kṫer...",
        "mypage": "'Ṣ-Ṣefḫa dyali",
        "mytalk": "صفحة ديال النقاش",
        "anontalk": "hdr maa had l'ip",
-       "navigation": "Navigasyon",
-       "and": "&#32;o",
+       "navigation": "تصفح",
+       "and": "&#32;و",
        "faq": "asaila kaytaawdo bzaf",
        "actions": "afaal",
-       "namespaces": "Maḫel s-smiyyaṫ :",
-       "variants": "lhja:",
-       "navigation-heading": "Ù\82ائÙ\85Ø© Ø¯Ù\8aاÙ\84 Ø§Ù\84تصÙ\81Ø­",
+       "namespaces": "نطاقات",
+       "variants": "المتغيرات",
+       "navigation-heading": "قائمة التصفح",
        "errorpagetitle": "ĥata'",
        "returnto": "Rjeĝ le $1",
        "tagline": "من {{SITENAME}}",
-       "help": "Ù\85عاÙ\88Ù\86ة",
+       "help": "Ù\85ساعدة",
        "search": "قلّب",
        "searchbutton": "قلّب",
        "go": "Sir",
-       "searcharticle": "Sir",
-       "history": "Ṫariĥ ṣ-ṣefḫa",
-       "history_short": "Historik",
+       "searcharticle": "سير",
+       "history": "تاريخ الصفحة",
+       "history_short": "التاريخ",
        "updatedmarker": "tam thditha ala akhir ziyara liya",
-       "printableversion": "Vérsyon imkenliha ṫṫetbeĝ",
-       "permalink": "Lyan dayem",
+       "printableversion": "طبع هاد الصفحة",
+       "permalink": "رابط دائم",
        "print": "tbeĝ",
        "view": "شوف",
-       "edit": "صاÙ\8aب",
+       "edit": "عدÙ\84",
        "create": "Ĥṫareĝ",
        "delete": "Mḫi",
        "undelete_short": "strjaa {{PLURAL:$1|wahd taadil|$1 taadil}}",
        "protect_change": "Beddel",
        "unprotect": "Ḫiyed l-ḫimaya",
        "newpage": "Ṣefḫa jdida",
-       "talkpagelinktext": "Ṫnaqeċ",
+       "talkpagelinktext": "نقاش",
        "specialpage": "Ṣefḫa ĥaṣa",
-       "personaltools": "Adawaṫ ċeĥṣiya",
-       "talk": "Modakara",
-       "views": "Afiċaj",
+       "personaltools": "أدوات شخصية",
+       "talk": "نقاش",
+       "views": "أفيشاج",
        "toolbox": "أدوات",
        "imagepage": "ċof ṣ-ṣefḫa dyal l-fiċyé",
        "mediawikipage": "Ċof ṣ-ṣefḫa de risala",
        "viewhelppage": "Ċof ṣ-ṣefḫa de l-mosaaada",
        "categorypage": "Ċof l-katégori dyal ṣ-ṣefḫa",
        "viewtalkpage": "Ċof tadakor",
-       "otherlanguages": "Be loġaṫ ĥrin",
-       "redirectedfrom": "(Ṫḫowwlaṫ men $1)",
+       "otherlanguages": "بلغات أخرى",
+       "redirectedfrom": "(تحولات من $1)",
        "redirectpagesub": "Ṣefḫa dyal ṫ-ṫeḫwil",
-       "lastmodifiedat": ".آخر Ù\85رة ØªØ¹Ø¯Ù\84ات Ù\81Ù\8aÙ\87ا Ù\87اذ الصفحة كان نهار $1، الساعة $2",
+       "lastmodifiedat": ".آخر Ù\85رة ØªØ¹Ø¯Ù\84ات Ù\81Ù\8aÙ\87ا Ù\87اد الصفحة كان نهار $1، الساعة $2",
        "viewcount": "had sfha tchaft {{PLURAL:$1|wa7d lmrra|$1 mrra}}.",
        "protectedpage": "Ṣefḫa mhmiya",
        "jumpto": "سير ل:",
-       "jumptonavigation": "Navigasyon",
+       "jumptonavigation": "تصفح",
        "jumptosearch": "قلّب",
        "view-pool-error": "smh lina serveurat ayana\nbzzaf dlmostakhdimin bghaw iwslo lhad sfha\naafak hawl mn ba3d wahd chwiya\n\n$1",
        "pool-timeout": "Daz l-weqṫ faċ konṫi kaṫṫsenna z-zeqron",
        "pool-queuefull": "Ṣeff l-ĥedma ĝamṛa",
        "pool-errorunknown": "khata mjhol",
-       "aboutsite": "Kolċi ĝla {{SITENAME}}",
-       "aboutpage": "Project:Meĝlomaṫ",
+       "aboutsite": "معلومات على {{SITENAME}}",
+       "aboutpage": "Project:معلومات",
        "copyright": "L-moḫṫawa mojod fe $1",
-       "copyrightpage": "{{ns:project}}:Copyrights",
-       "currentevents": "laahdath ljariya",
-       "currentevents-url": "Project:ahdat  jariya",
-       "disclaimers": "Inḍaraṫ",
-       "disclaimerpage": "Project:Inḍaraṫ ĝammin",
+       "copyrightpage": "{{ns:project}}:حقوق التأليف و النشر",
+       "currentevents": "آخر الأحداث",
+       "currentevents-url": "Project:آخر الأحداث",
+       "disclaimers": "إنذارات",
+       "disclaimerpage": "Project:إنذار عام",
        "edithelp": "معاونة",
        "mainpage": "صفحة لولا",
-       "mainpage-description": "Ṣ-Ṣefḫa l-owla",
+       "mainpage-description": "الصفحة الرئيسية",
        "policy-url": "Project:siyassa",
-       "portal": "bwabt lmojtamaaa",
-       "portal-url": "Project:bwabt lmojtamaaa",
-       "privacy": "Siyasa ĥoṣoṣiya",
-       "privacypage": "Project:Siyasa ĥoṣoṣiya",
+       "portal": "بوابة المجتمع",
+       "portal-url": "Project:بوابة المجتمع",
+       "privacy": "سياسة الخصوصية",
+       "privacypage": "Project:سياسة الخصوصية",
        "badaccess": "Ġalat fe s-smaḫ",
        "badaccess-group0": "mamsmohch lik tdkhl had ttbiq li bghiti",
        "badaccess-groups": "had laction lli tlbtih msmoh ghir lmostkhdimin li kaynin f  {{PLURAL:$2|group|wahd mn had les group}}: $1.",
        "ok": "waĥĥa",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
-       "retrievedfrom": "Mrejjĝa men \"$1\"",
+       "retrievedfrom": "مرجّعة من \"$1\"",
        "youhavenewmessages": "Ĝendek $1 ($2).",
        "youhavenewmessagesmulti": "Jawek méṣajaṫ jdad fe $1",
-       "editsection": "Ṣayeb",
+       "editsection": "عدل",
        "editold": "ṣayeb",
        "viewsourceold": "Ċof l-masdar",
-       "editlink": "ṣayeb",
-       "viewsourcelink": "Ċof l-ĝin",
-       "editsectionhint": "Ṣayeb s-séksyon : $1",
-       "toc": "لمضمون",
+       "editlink": "عدل",
+       "viewsourcelink": "شوف المصدر",
+       "editsectionhint": "عدل القسم: $1",
+       "toc": "المضمون",
        "showtoc": "Werri",
        "hidetoc": "Ḫebbi",
        "collapsible-collapse": "twi",
        "page-atom-feed": "L-Flu Atom dyal \"$1\"",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (صفحة ما كايناش)",
+       "red-link-title": "$1 (اÙ\84صÙ\81حة Ù\85ا Ù\83اÙ\8aÙ\86اش)",
        "sort-descending": "ṛṫṫḅ b-ttloĝ",
        "sort-ascending": "ṛṫṫḅ b-lhḅot",
-       "nstab-main": "صفحة",
+       "nstab-main": "اÙ\84صÙ\81حة",
        "nstab-user": "Ṣ-Ṣefḫa dyal l-mosṫeĥdim",
        "nstab-media": "sfha dyal media",
-       "nstab-special": "Ṣefḫa ĥaṣṣa",
+       "nstab-special": "صفحة خاصة",
        "nstab-project": "Ṣefḫa dyal meċroĝ",
-       "nstab-image": "mileff",
+       "nstab-image": "ملف",
        "nstab-mediawiki": "risala",
        "nstab-template": "Modél",
        "nstab-help": "sfhat lmosaaada",
-       "nstab-category": "ṫṣnif",
-       "mainpage-nstab": "صÙ\81حة Ù\84Ù\88Ù\84ا",
+       "nstab-category": "تصنيف",
+       "mainpage-nstab": "اÙ\84صÙ\81حة Ø§Ù\84رئÙ\8aسÙ\8aØ©",
        "nosuchaction": "makaynch fiaal bhal hada",
        "nosuchactiontext": "lfial li tlbti mashihch\nimkn ghltti flktba dyal ladresse\nhadchi imkn kadalik ichir lchi khataaa f {{SITENAME}}",
        "nosuchspecialpage": "makaynach sfha bhad smiya",
        "perfcached": "l-bayanaṫ ṫ-ṫalia kayna f-lcache o-maymknċ ṫ-ḫddṫha. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "l-bayanaṫ ṫ-ṫalia kayna f-lcache, o-ṫḫddṫaṫ aĥir mrra f-$1.",
        "querypage-no-updates": "ṫḫdiṫad dial had ṣfḫa ma ĥḍḍamaċ daba.\nl-bayanaṫ lli kayna hna daba maĥadiċ ṫṫḫḍḍṫ.",
-       "viewsource": "Ċof l-ĝin",
+       "viewsource": "شوف المصدر",
        "actionthrottled": "had l-feĝl ṫṫḫbs",
        "actionthrottledtext": "baċ nṫfadaw ṣ-ṣpam, ĝadad l-mṛṛaṫ lli ymkn ddir fiha had l-feĝl f-modda qṣiṛa rah mḫdod, o-nta rak fṫṫi had l-ĝadar.\nĝawd jṛṛḅ mn beĝd ċwiya dial dqayq.",
        "protectedpagetext": "had sfha mhmiya bach mataadlch baqi",
        "login-abort-generic": "d-doĥol ṫaĝk ma njaḫ-ċ — ilġa'",
        "loginlanguagelabel": "Loġa: $1",
        "suspicious-userlogout": "t-talab dialk baċ ṫdĥol mrfoḍ ḫqqaċ tayḍhṛ billa rah ṫsift mn moṫaṣffiḫ mĝtob wlla caching proxy.",
-       "pt-login": "دخل",
-       "pt-createaccount": "دÙ\8aر Ù\83Ù\88Ù\86ت",
+       "pt-login": "سجÙ\84 Ø§Ù\84دخÙ\88ل",
+       "pt-createaccount": "صاÙ\88ب Ø­Ø³Ø§Ø¨",
        "php-mail-error-unknown": "ĥata' ma mĝrof-ċ fl-mail() function taĝ l-PHP.",
        "user-mail-no-addy": "ḫawlṫi ṫsift email bla ĝonwan l-email.",
        "changepassword": "tbdl lmot de passe",
        "changeemail-newemail": "ĝonwan dial l-email jdid:",
        "changeemail-none": "(walo)",
        "changeemail-submit": "bddel l-email",
-       "summary": "Moleĥĥaṣ:",
+       "summary": "ملخص:",
        "subject": "Mowḍoĝ/Ĝonwan",
        "minoredit": "Hada ṫeĝdil sġir",
-       "watchthis": "Ṫebbeĝ had ṣ-ṣefḫa",
-       "savearticle": "Ċejjel ṣ-ṣefḫa",
+       "watchthis": "تبع هاد الصفحة",
+       "savearticle": "حفظ الصفحة",
        "preview": "L-Prévizualizasyon",
-       "showpreview": "Werri l-prévizualizasyon",
-       "showdiff": "Werri ṫ-ṫeġyiraṫ",
+       "showpreview": "وري لبري-ڤيو",
+       "showdiff": "وري التغييرات",
        "anoneditwarning": "'''Ĝendak:''' Ma mkonéktéċ.\nĠayṫċejjel l-ĝonwan IP dyalek fe ṫariĥ had ṣ-ṣefḫa.",
        "anonpreviewwarning": "''ṛak ma daĥlċ. l-ḫifḍ ġadi ysjjl ĝonwan l-IP dialk f-listorik dial had ṣ-ṣfḫa.''",
        "missingsummary": "'''ma ṫnsaċ:''' ma ĝtiṫiċ ċi molĥaṣṣ dial ṫ-ṫĝdil.\nila ĝawd klikiṫi \"$1\", ġadi yṫsjjl ṫ-ṫĝdil dialk bla bih.",
        "nosuchsectiontitle": "maymknch nlgaw lqissm",
        "nosuchsectiontext": "ḫawlṫi ṫĝddl ċi qism ma kayenċ.\nyqdr ikon ṫnql wlla ṫḫyyd mlli knṫi kaṫċof had ṣfḫa.",
        "loginreqtitle": "khassk tsjl dokhol",
-       "loginreqlink": "تÙ\83Ù\88Ù\86Ù\8aÙ\83طا",
+       "loginreqlink": "سجÙ\84 Ø§Ù\84دخÙ\88Ù\84",
        "loginreqpagetext": "ĥaṣṣk ddir $1 baċ ṣfaḫi ĥrin.",
        "accmailtitle": "lmot de passe tsaft.",
        "accmailtext": "waḫd klmṫ s-srr mṣayba ĝċwa'iyyn ĝla ḫsab [[User talk:$1|$1]] ṫsiftaṫ l-$2.\n\nṫqdr ṫbddal klmṫ s-srr dialt had l-ḫisab j-jdid f-ṣṣfḫa ṫaĝ ''[[Special:ChangePassword|bḍḍel klmṫ s-srr]]'' mn bĝdmma ṫdĥol.",
        "templatesused": "Had ṣ-ṣefḫa {{PLURAL:$1|kaṫsṫeĝmel had l-modél|kaysṫeĝmel had l-modélaṫ}}:",
        "templatesusedpreview": "{{PLURAL:$1|Modél l-mesṫeĝmel|Modélaṫ l-mesṫeĝmlin}} fe had l-prévizualizasyon:",
        "templatesusedsection": "{{PLURAL:$1|l-modél l-mosṫĝmal|l-modélaṫ l-mosṫĝmal}} f-had l-qism:",
-       "template-protected": "Ḫimaya",
-       "template-semiprotected": "(ḫimaya ma kamlaċ)",
+       "template-protected": "(محميّة)",
+       "template-semiprotected": "(نصف محمية)",
        "hiddencategories": "{{PLURAL:$1|L-Katégori l-mĥebbya li kaṫmlek|L-Katégoriyaṫ l-mĥebbyin li kaymelko}} had ṣ-ṣefḫa :",
        "edittools": "<!-- nass ghayban hna t7t t3dil ot7t istimarat raf3 sowar. -->",
        "nocreate-loggedin": "ma ĝndek-ċ l-heqq ṫsayb ṣ-ṣfaḫi jdad.",
        "nohistory": "ma kayn ḫṫṫa istorik d-ṫĝdilaṫ l-had ṣfḫa.",
        "currentrev": "Ċof l-versyon l-leĥĥra",
        "currentrev-asof": "L-Vérsyon l-leĥĥra nhar $2 mĝa s-saĝa $3",
-       "revisionasof": "Morajaĝa $1",
+       "revisionasof": "مراجعة $1",
        "revision-info": "morajaĝa f-$1 d-$2",
-       "previousrevision": "Morajaĝa qdem",
+       "previousrevision": "→ مراجعة أقدم",
        "nextrevision": "L-Vérsyon li mbeĝd →",
        "currentrevisionlink": "Ċof l-versyon l-leĥĥra",
        "cur": "دابا",
        "revertmerge": "Ḫiyyed ṫ-ṫeĥlat.",
        "history-title": "Ṫ-Ṫariĥ dyal lé-vérsyon dyal \"$1\"",
        "difference-multipage": "(l-fṛq bin ṣ-ṣfaḫi)",
-       "lineno": "Ṣter $1:",
+       "lineno": "سطر $1:",
        "compareselectedversions": "Qaren lé-versyon li meĝzolin",
        "showhideselectedversions": "wrri/ĥbbi l-morajaĝṫ l-mĥṫaṛa",
-       "editundo": "Rjeĝ",
+       "editundo": "تراجع",
        "diff-multi-manyusers": "({{PLURAL:$1|ṃoṛajaĝa waṣita wḫda|$1 dl-ṃoṛajaĝaṫ l-waṣita}} ṫaĝṫ kṫr mn $2 {{PLURAL:$2|l-mosṫĥdim|dl-mosṫĥdimin}} ma mbeyyna-ċ)",
-       "searchresults": "N-Naṫa'ij dyal l-beḫṫ",
-       "searchresults-title": "N-Naṫa'ij dyal l-beḫṫ ĝla \"$1\"",
+       "searchresults": "Ù\86تائج Ø§Ù\84بحث",
+       "searchresults-title": "نتائج البحث على \"$1\"",
        "titlematches": "onwan sfha yotabiq",
        "textmatches": "neṣ sfha kaytabq",
        "notextmatches": "Ḫṫa ċi neṣ ma mlaqi mĝa dakċi li kaṫqelleb ĝlih",
-       "prevn": "L-Li qbel {{PLURAL:$1|$1}}",
-       "nextn": "L-Li mbeĝd {{PLURAL:$1|$1}}",
+       "prevn": "{{PLURAL:$1|$1}} لي من قبل",
+       "nextn": "{{PLURAL:$1|$1}} لي من بعد",
        "prevn-title": "$1 {{PLURAL:$1|naṫija|naṫayj}} lli qbl",
        "nextn-title": "$1 {{PLURAL:$1|naṫija|naṫayj}} lli bĝd",
-       "shown-title": "wrri $1 {{PLURAL:$1|naṫija|naṫayj}} f-ṣṣfḫa",
-       "viewprevnext": "Ċof ($1 {{int:pipe-separator}} $2) ($3).",
+       "shown-title": "شوف $1 {{PLURAL:$1|نتيجة|نتائج}} فكل صفحة",
+       "viewprevnext": "شوف ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''ḫṫṫa ṣfḫa f-had l-wiki ma smiṫha \"[[:$1]]\".'''",
        "searchmenu-new": "'''ṣayb f-had l-wiki ṣfḫṫ \"[[:$1]]\"!'''",
-       "searchprofile-articles": "sfht mohtawa",
-       "searchprofile-images": "media",
+       "searchprofile-articles": "صفحات المحتوى",
+       "searchprofile-images": "الميديا",
        "searchprofile-everything": "كلشي",
-       "searchprofile-advanced": "motaqaddim",
-       "searchprofile-articles-tooltip": "qllb f $1",
-       "searchprofile-images-tooltip": "qllb f tsawr",
-       "searchprofile-everything-tooltip": "qlleb kolċi fl-moḫṫawa (ḫṫṫa ṣfaḫi n-niqaċ)",
-       "searchprofile-advanced-tooltip": "qlleb ġi f-ċi nitaqaṫ",
-       "search-result-size": "$1 ({{PLURAL:$2|kelma weḫda|$2 kelmaṫ}})",
+       "searchprofile-advanced": "متقدم",
+       "searchprofile-articles-tooltip": "قلّب في $1",
+       "searchprofile-images-tooltip": "قلّب فالتصاور",
+       "searchprofile-everything-tooltip": "قلّب فگاع المحتوى (حتى صفحات النقاش)",
+       "searchprofile-advanced-tooltip": "قلّب غير فشي نطاقات",
+       "search-result-size": "$1 ({{PLURAL:$2|كلمة وحدة|$2 كلمات}})",
        "search-result-category-size": "{{PLURAL:$1|ĝoḍw 1|$1 dl-aĝḍa'}} ({{PLURAL:$2|ṫṣnif fṛĝi 1|$2 d-ṫṣnifaṫ l-fṛĝiyya}}, {{PLURAL:$3|milef 1|$3 dl-milffaṫ}})",
        "search-redirect": "(Ṫeḫwil $1)",
        "search-section": "(seksyon $1)",
        "searchrelated": "mortabita",
        "searchall": "kolċi",
        "showingresults": "mbyyena l-ṫḫṫ ḫṫṫa l-{{PLURAL:$3|'''1''' n-naṫija|'''$3''' d-nnaṫa'ij}} badya mn rqm '''$2'''.",
-       "search-nonefound": "ḫṫṫa naṫija ma bḫal ḫad t-talab.",
+       "search-nonefound": "حتى نتيجة ما كاطابقش مع هاد الطلب.",
        "powersearch-legend": "Ṫeqlab ṣĝib",
        "powersearch-ns": "Qelleb fe maḫel s-smiyyaṫ",
        "powersearch-togglelabel": "Ĥṫar",
        "right-autoconfirmed": "ĝddel ṣfaḫi nṣṣ-mḫmiyya.",
        "right-bot": "ĝaml ki ċi ijṛa' otomatizi.",
        "right-apihighlimits": "sṫiĥdam ḫodod aĝla f-talabaṫ l-API",
-       "right-writeapi": "sṫiĥdam l-API d-lkṫaba",
+       "right-writeapi": "استخدام API للكتابة",
        "right-delete": "Mḫi had 'ṣ-ṣefḫa",
        "right-bigdelete": "ḫdef ṣfaḫi lli ĝndha istorikaṫ twila",
        "right-deleterevision": "ḫyyed wlla ṛeḍḍ morajaĝaṫ moĝyyana l-ṣfaḫi",
        "right-siteadmin": "sd o zl qaidat lbayant",
        "right-override-export-depth": "tsdir sfahi obinha sfahi lmawsola hta lomq 5",
        "right-sendemail": "sift email lmostkhdimin lkhrin",
-       "newuserlogpage": "Ṫariĥ dyal l-ḫsabaṫ j-jdad",
+       "newuserlogpage": "السجل ديال الحسابات الجداد",
        "newuserlogpagetext": "hada sijill d-inċa'aṫ l-moṣṫĥdimin.",
        "rightslog": "Ĝamaliyaṫ ḫoqoq l-mosṫeĥdim",
        "rightslogtext": "hada sijil btaghyirat f salahiyat lmostkhdimin",
        "action-userrights-interwiki": "taadil salahiyat lmostkhdimin f lwikiyat lkhrin",
        "action-siteadmin": "sd o7l qaidat lbayant",
        "nchanges": "{{PLURAL:$1|ṫeġyira weḫda|$1 dyal ṫ-ṫeġyiraṫ}}",
-       "recentchanges": "Ṫ-Ṫeĝdilaṫ l-leĥĥra",
-       "recentchanges-legend": "Opsyon dyal ṫ-ṫeġyiraṫ l-leĥĥra",
+       "recentchanges": "آخر التعديلات",
+       "recentchanges-legend": "لي زوپسيون ديال التعديلات الأخيرة",
        "recentchanges-summary": "Ṫebbeĝ ṫ-ṫeĝdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.",
        "recentchanges-feed-description": "Ṫebbeĝ ṫ-ṫeĝdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.",
-       "recentchanges-label-newpage": "anch' had tadil sfha jdida",
-       "recentchanges-label-minor": "Hada ṫeĝdil sġir",
-       "recentchanges-label-bot": "had taadil darou bot",
-       "recentchanges-label-unpatrolled": "had taadil matrajach",
+       "recentchanges-label-newpage": "صفحة جديدة",
+       "recentchanges-label-minor": "هادا تعديل صغير",
+       "recentchanges-label-bot": "هاد التعديل دارو بوت",
+       "recentchanges-label-unpatrolled": "هاد التعديل مازال ما تراجعش",
        "rcnotefrom": "hna taghirat mn  '''$2''' (tal '''$1''' maaroda).",
-       "rclistfrom": "Werri ṫeġyiraṫ jdad badyen men $3 $2",
-       "rcshowhideminor": "$1 Ṫeĝdilaṫ ma mohimminċ bezzaf",
+       "rclistfrom": "شوف التعديلات الجداد ابتداء من $2, $3",
+       "rcshowhideminor": "$1 التعديلات الصغار",
        "rcshowhideminor-hide": "خبي",
-       "rcshowhidebots": "$1 R-Robowaṫ",
+       "rcshowhidebots": "$1 البوتات",
        "rcshowhidebots-show": "وري",
        "rcshowhidebots-hide": "خبي",
        "rcshowhideliu": "$1 l-mosṫeĥdimin l-mċejjlin",
        "rcshowhideliu-show": "وري",
        "rcshowhideliu-hide": "خبي",
-       "rcshowhideanons": "$1 mosṫeĥdimin mĥebbyin",
+       "rcshowhideanons": "$1 مستخدمين مجهولين",
        "rcshowhideanons-hide": "خبي",
        "rcshowhidepatr": "$1  taadilat lmorajaa",
-       "rcshowhidemine": "$1 ṫ-ṫeĝdilaṫ dyawli",
+       "rcshowhidemine": "$1 التعديلات دياولي",
        "rcshowhidemine-hide": "خبي",
        "rclinks": "Werri l-$1 dyal ṫ-ṫeġyiraṫ l-leĥĥrin li ṫdaro fe had l-$2 l-iyam l-leĥĥrin",
-       "diff": "ferq",
-       "hist": "Ṫariĥ",
+       "diff": "فرق",
+       "hist": "تاريخ",
        "hide": "خبي",
        "show": "Werri",
-       "minoreditletter": "",
-       "newpageletter": "J",
-       "boteditletter": "b",
+       "minoreditletter": "ص",
+       "newpageletter": "ج",
+       "boteditletter": "ب",
        "rc-change-size": "$1",
        "newsectionsummary": "/* $1 */ qism jdid",
        "rc-enhanced-expand": "Werri ṫ-ṫafaṣil (kayḫṫaj JavaScript)",
        "rc-enhanced-hide": "Ĥebbi ṫ-ṫafaṣil",
-       "recentchangeslinked": "L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin",
+       "recentchangeslinked": "تعديلات عندها علاقة",
        "recentchangeslinked-feed": "L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin",
-       "recentchangeslinked-toolbox": "L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin",
-       "recentchangeslinked-title": "Ṫ-Ṫeġyiraṫ li mlaqyin mĝa \"$1\"",
+       "recentchangeslinked-toolbox": "تعديلات عندها علاقة",
+       "recentchangeslinked-title": "التغييرات لي متعلقين بـ \"$1\"",
        "recentchangeslinked-summary": "Hadi lista dial 'ṫ-ṫeġyiraṫ li ṫdaro mo'aĥarane le 'ṣ-ṣefḫaṫ li mlaqyin mĝa 'ṣ-ṣefḫa l-meĝniya (ola le 'aĝda' dial ċi ṣefa mĝayana). 'Ṣ-Ṣefḫaṫ li [[Special:Watchlist|mṫebeĝ]] mekṫobine be ḫrof ġlaḍ.",
        "recentchangeslinked-page": "Smiyṫ ṣ-ṣefḫa",
        "recentchangeslinked-to": "Ċof ṫ-ṫeġyiraṫ dyal ṣ-ṣefḫaṫ li fihom ċi lyan kayddik le ṣ-ṣefḫa li bġiṫi fe blaṣt ma ṫdir l-ĝeks",
-       "upload": "Ṣifet ċi fiċyé",
+       "upload": "رفع ملف",
        "uploadbtn": "Ṣifet ċi fiċyé",
        "reuploaddesc": "ilgha' rojoa orjaa l upload form",
        "upload-tryagain": "fist lmodifikasyon",
        "listfiles_size": "lhajm",
        "listfiles_description": "wasf",
        "listfiles_count": "naskh",
-       "file-anchor-link": "mileff",
-       "filehist": "Ṫariĥ l-fiċyé",
-       "filehist-help": "Brek ĝla ṫ-ṫariĥ o s-saĝa baċ ṫċof l-fiċyé bḫal li kan fe hadik l-owqiṫa.",
+       "file-anchor-link": "ملف",
+       "filehist": "التاريخ ديال الملف",
+       "filehist-help": "ورك على تاريخ/ساعة باش تشوف هاد الملف كيف كان كايبان فداك الوقت",
        "filehist-deleteall": "Suprimi kolchi",
        "filehist-deleteone": "Suprimi",
        "filehist-revert": "Rejjeĝ",
-       "filehist-current": "dyal daba",
-       "filehist-datetime": "Nhar/Saĝa",
-       "filehist-thumb": "miniatir",
-       "filehist-thumbtext": "Ṫ-Ṫeṣġir dyal l-vérsyon dyal nhar $2 mĝa s-saĝa $3",
+       "filehist-current": "ديال دابا",
+       "filehist-datetime": "نهار/توقيت",
+       "filehist-thumb": "تصغير",
+       "filehist-thumbtext": "التصغير ديال النسخة بتاريخ $1",
        "filehist-nothumb": "la tasghir",
-       "filehist-user": "Mosṫeĥdim",
-       "filehist-dimensions": "T-Tol o l-ĝerḍ",
+       "filehist-user": "مستخدم",
+       "filehist-dimensions": "الأبعاد",
        "filehist-filesize": "hajm lfichier",
-       "filehist-comment": "Ĝelleq",
+       "filehist-comment": "تعليق",
        "imagelinks": "wṣlaṫ l-milef",
        "linkstoimage": "{{PLURAL:$1|Had ṣ-ṣefḫa kaṫsṫeĝmel|Had l-$1 de ṣ-ṣefḫaṫ kaysṫeĝmlo}}:",
        "morelinkstoimage": "wrri [[Special:WhatLinksHere/$1|wṣlaṫ aĥṛa]] l-had l-milef.",
        "listredirects": "Lisṫaṫ 'ṫ-ṫeḫwilaṫ",
        "unusedtemplates": "qwalb mamstkhmdach",
        "unusedtemplateswlh": "wslat khrin",
-       "randompage": "sfahi achwaiya",
+       "randompage": "صفحة عشوائية",
        "randomredirect": "ṫḫwil ĝċwa'i",
        "statistics": "Staṫisṫik",
        "statistics-header-pages": "ihsa'at sfahi",
        "withoutinterwiki": "ṣfaḫi bla wṣlaṫ dl-loġaṫ",
        "withoutinterwiki-legend": "prifix",
        "withoutinterwiki-submit": "Werri",
-       "nbytes": "$1 {{PLURAL:$1|okté|okté}}",
+       "nbytes": "$1 {{PLURAL:$1|بايت}}",
        "ncategories": "$1 {{PLURAL:$1|ṫ-ṫṣnif|dṫ-ṫṣnifaṫ}}",
        "nlinks": "$1 {{PLURAL:$1|l-wṣla|dl-wṣlaṫ}}",
        "nmembers": "$1 {{PLURAL:$1|Ĝoḍw|Aĝḍa'}}",
        "deletereasonotherlist": "Sabab weḫdaĥor",
        "delete-edit-reasonlist": "ĝddel asbab l-ḫdf",
        "rollback": "tjjea taadilat",
-       "rollbacklink": "Rjeĝ l-lor",
+       "rollbacklink": "استرجع",
        "rollbackfailed": "rjoaa mankhch",
        "editcomment": "molĥĥaṣ ṫ-ṫĝdil kan: <em>$1</em>.",
        "protectlogpage": "Ṫariĥ l-ḫimaya",
        "undelete-cleanup-error": "ĥata' f-ḫdf milef arċiv ma mĥddem-ċ \"$1\".",
        "undelete-error-short": "Tṛa waḫed l-ġalat fe sṫirjaĝ l-fiċyé : $1",
        "undelete-show-file-submit": "iyih",
-       "namespace": "Maḫel s-smiyyaṫ :",
-       "invert": "Qleb 's-séléksyon",
-       "namespace_association": "nitaq mqṫarn",
-       "blanknamespace": "(Re'si)",
+       "namespace": "النطاق:",
+       "invert": "قلب الاختيار",
+       "namespace_association": "النطاق المقتارن",
+       "blanknamespace": "(رئيسي)",
        "contributions": "L-mosahamaṫ dyal l-mosṫeĥdim",
        "contributions-title": "L-Mosahamaṫ dyal $1",
        "mycontris": "لمساهمات دياولي",
        "sp-contributions-username": "Ĝonwan IP ola smiyṫ l-mosṫeĥdim",
        "sp-contributions-toponly": "wrri ġi ṫĝdilaṫ lli hiya l-ṃoṛajaĝṫ l-aĥrra",
        "sp-contributions-submit": "Qelleb",
-       "whatlinkshere": "Ṣefḫaṫ mlaqyin",
+       "whatlinkshere": "صفحات كايوصّلو لهنا",
        "whatlinkshere-title": "Ṣ-Ṣefḫaṫ li mlaqyin mĝa \"$1\"",
        "whatlinkshere-page": "ṣfḫa:",
        "linkshere": "Had ṣ-ṣefḫaṫ kayddiw le '''$2''':",
        "blocklist-nousertalk": "ma ymken loċ yṣayeb ṣfeḫṫo dyal n-niqaċ",
        "ipblocklist-empty": "L-Lista dyal l-ĝanawin IP li mblokyin raha daba ĥawya.",
        "ipblocklist-no-results": "L-Ĝonwan IP ola l-mosṫeĥdim li tlebṫiw ma mblokiċ.",
-       "blocklink": "Bloki",
+       "blocklink": "بلوكي",
        "unblocklink": "Ḫiyyed l-manĝ",
        "change-blocklink": "beddel l-manĝ",
        "contribslink": "مساهمات",
        "tooltip-pt-preferences": "Li kaṫfeddel",
        "tooltip-pt-watchlist": "L-Lista dyal ṣ-ṣefḫaṫ li kaṫṫebbĝo",
        "tooltip-pt-mycontris": "L-Lista dyal mosahamaṫek",
-       "tooltip-pt-login": "Ḫsen lik ṫṫkonékta{{GENDER:||e|(y)}}, walakin maċi ḍarori.",
+       "tooltip-pt-login": "حسن ليك تسجل الدخول؛ ولكن ماشي ضروري",
        "tooltip-pt-logout": "Ṫdékonékta",
-       "tooltip-ca-talk": "Modakara ĝla l-li fe had ṣ-ṣefḫa",
+       "tooltip-ca-talk": "تناقش على محتويات الصفحة",
        "tooltip-ca-edit": "Imkenlik ṫṣayeb had ṣ-ṣefḫa.\nĜafak sṫeĝmel l-boton dyal l-prévizualizasyon qbel ma ṫċejjel",
-       "tooltip-ca-addsection": "Bda séksyon jdida",
-       "tooltip-ca-viewsource": "Had ṣ-ṣefḫa mḫamya.\nImken lek ṫċof l-ĝin dyalha.",
-       "tooltip-ca-history": "L-vérsyonaṫ l-qdam dyal had ṣ-ṣefḫa",
+       "tooltip-ca-addsection": "بدا قسم جديد",
+       "tooltip-ca-viewsource": "هاد الصفحة محمية.\nإمكن ليك تشوف المصدر",
+       "tooltip-ca-history": "النسخ السابقة ديال هاد الصفحة",
        "tooltip-ca-protect": "Ḫami ĝla had ṣ-ṣefḫa",
        "tooltip-ca-delete": "Mḫi had ṣ-ṣefḫa",
        "tooltip-ca-move": "Neqqel had ṣ-ṣefḫa",
-       "tooltip-ca-watch": "Zid had ṣ-ṣefḫa le l-lista dyal s-suivi",
+       "tooltip-ca-watch": "زيد هاد الصفحة لقائمة التتبع",
        "tooltip-ca-unwatch": "Ḫiyyed had ṣ-ṣefḫa men l-lista dyal s-suivi dyalṫek",
-       "tooltip-search": "Qelleb fe {{SITENAME}}",
-       "tooltip-search-go": "Sir le ċi sefḫa l-li ĝendha nefs s-smiya, ila kaneṫ",
-       "tooltip-search-fulltext": "Qelleb ĝla ṣ-ṣefḫaṫ li fihom had n-neṣ",
-       "tooltip-p-logo": "ṣefḫaṫ l-sṫiqbal",
-       "tooltip-n-mainpage": "Sir le ṣ-ṣefḫa de l-sṫiqbal",
-       "tooltip-n-mainpage-description": "Sir le ṣefḫaṫ l-sṫiqbal",
-       "tooltip-n-portal": "Ĝel l-meċroĝ ; ċno imken lek ṫdir ; fin ṫelqa ḫajaṫ li ṫeḫṫajhom",
-       "tooltip-n-currentevents": "Ċof deġya aċ tari daba",
-       "tooltip-n-recentchanges": "Lisṫa dyal ṫ-ṫeġyiraṫ l-leĥrin fe l-wiki",
-       "tooltip-n-randompage": "Ċarji ċi ṣefḫa ĝe L-Lah",
-       "tooltip-n-help": "Mosaĝada",
-       "tooltip-t-whatlinkshere": "Lisṫa dyal ṣ-ṣefḫaṫ kamlin li mlaqyin mĝa hadi",
-       "tooltip-t-recentchangeslinked": "Lisṫa dyal ṫ-ṫeġyiraṫ l-leĥĥrin dyal ṣ-ṣefḫaṫ l-li mlaqyin mĝa hadi",
+       "tooltip-search": "قلّب في {{SITENAME}}",
+       "tooltip-search-go": "سير لشي صفحة عندها نفس السمية إلى كانت",
+       "tooltip-search-fulltext": "قلّب على الصفحات لي فيهوم هاد النص",
+       "tooltip-p-logo": "سير للصفحة الرئيسية",
+       "tooltip-n-mainpage": "سير للصفحة الرئيسية",
+       "tooltip-n-mainpage-description": "سير للصفحة الرئيسية",
+       "tooltip-n-portal": "معلومات على المشروع، شنو إمكن ليك دير، فين تلاقا لحاجات لي محتاجهوم",
+       "tooltip-n-currentevents": "شوف شنو طاري فلعالم",
+       "tooltip-n-recentchanges": "قائمة ديال آخر التغييرات فلويكي",
+       "tooltip-n-randompage": "شارجي صفحة عشوائية",
+       "tooltip-n-help": "فين تلاقا المساعدة",
+       "tooltip-t-whatlinkshere": "قائمة بگاع الصفحات لي فيهوم الرابط ديال هاد الصفحة",
+       "tooltip-t-recentchangeslinked": "آخر التعديلات ديال الصفحات لي كاين الرابط ديالهم هنا",
        "tooltip-feed-rss": "L-Flu RSS dyal had ṣ-ṣefḫa",
        "tooltip-feed-atom": "L-Flu Atom dyal had ṣ-ṣefḫa",
        "tooltip-t-contributions": "Ċof l-lista dyal mosahamaṫ had l-mosṫeĝmil",
        "tooltip-t-emailuser": "Ṣifet imayl le had l-mosṫeĥdim",
-       "tooltip-t-upload": "Ṣifet ci fiċyé",
-       "tooltip-t-specialpages": "Lisṫa dyal ṣ-sefḫaṫ l-ĥaṣin kollhom",
-       "tooltip-t-print": "Vérsyon dyal ṣ-ṣefḫa l-li imken lik ṫetbeĝ",
-       "tooltip-t-permalink": "Lyan dayem le had l-vérsyon dyal ṣ-ṣefḫa",
-       "tooltip-ca-nstab-main": "Ċof l-li fe ṣ-ṣefḫa",
+       "tooltip-t-upload": "رفع ملفات",
+       "tooltip-t-specialpages": "قائمة ديال گاع الصفحات الخاصة",
+       "tooltip-t-print": "ڤيرزيون ديال هاد الصفحة باش طبعها",
+       "tooltip-t-permalink": "رابط دائم لهاد النسخة بالضبط من الصفحة",
+       "tooltip-ca-nstab-main": "شوف الصفحة ديال المحتوى",
        "tooltip-ca-nstab-user": "Ċof ṣ-ṣefḫa de l-mosṫeĥdim",
        "tooltip-ca-nstab-media": "tchof sfht lmedia",
        "tooltip-ca-nstab-special": "Hadi ṣefḫa ĥaṣa, ma imkenlikċ ṫṣayebha",
        "tooltip-ca-nstab-project": "Ċof ṣ-ṣefḫa dyal l-meċroĝ",
-       "tooltip-ca-nstab-image": "ċof ṣ-ṣefḫa dyal l-fiċyé",
+       "tooltip-ca-nstab-image": "شوف صفحة الملف",
        "tooltip-ca-nstab-mediawiki": "tcouf rasa'il nidam",
        "tooltip-ca-nstab-template": "Ċof ṣ-ṣefḫa de l-meḍmon",
        "tooltip-ca-nstab-help": "Ċof ṣ-ṣefḫa de l-mosaaada",
-       "tooltip-ca-nstab-category": "Ċof l-katégori dyal ṣ-ṣefḫa",
+       "tooltip-ca-nstab-category": "شوف الصفحة ديال التصنيف",
        "tooltip-minoredit": "Ĝelmo bḫal ċi ṫeĝdil ma mohimċ",
-       "tooltip-save": "Ċejjel ṫ-ṫeġyiraṫ dyawlek",
-       "tooltip-preview": "Ċof ċno beddelti, ĝafak steĥdem hadi qbel ma ṫċejjel !",
-       "tooltip-diff": "Werri ċno li beddelṫi fe n-neṣ",
+       "tooltip-save": "سجل التغييرات دياولك",
+       "tooltip-preview": "شوف شنو بدلتي. عافاك استخدم هادي قبل ما تسجل.",
+       "tooltip-diff": "وري شنو لي بدلتي فالنص",
        "tooltip-compareselectedversions": "Werri ṫ-ṫeġyiraṫ mabin lé-vérsyon l-meĝzolin dyal had ṣ-ṣefḫa",
        "tooltip-watch": "Ḫḍi had s-sefḫa",
        "tooltip-upload": "bda rafaa",
-       "tooltip-rollback": "« Sṫerjeĝ » kaybettel be klik waḫed ṫeġyir(aṫ) dyal had ṣ-ṣefḫa be l-mosahim l-leĥĥer.",
+       "tooltip-rollback": "« استرجاع » كترجع التعديلات ديال آخر مساهم بكيلك وحدة",
        "tooltip-undo": "\"Rejjeĝ ki 'ma kan\" kaysṫerjeĝ li sayebṫi o kayḫell ċerjem weḫdaĥor ka prévizualizasyon. Kaṫĥellik ṫzid ċi sabab fe sendoq l-moleĥĥaṣaṫ.",
        "tooltip-preferences-save": "sjjl taghyirat",
-       "tooltip-summary": "dkhl molkhass  qssir",
+       "tooltip-summary": "دخل ملخص قصير",
        "common.css": "/* CSS placed here will be applied to all skins */",
        "others": "khrin",
        "creditspage": "ichadat sfha",
        "thumbsize": "ḫajm l-miniatur:",
        "widthheight": "$1 × $2",
        "file-info": "ḫajm l-milef: $1, n-noĝ dl-MIME: $2",
-       "file-info-size": "$1 × $2 piksel, ṫqel l-fiċyé: $3, ċkel MIME : $4",
+       "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "file-nohires": "Ma kayenċ ċi rézolusyon kber men hadi.",
        "svg-long-desc": "Fiċyé SVG, rézolusyon $1 × $2 pikselaṫ, ḫajm : $3",
        "show-big-image": "Rézolusyon kamla",
-       "show-big-image-size": "$1 × $2 dl-ppiksilaṫ",
+       "show-big-image-size": "$1 × $2 بكسل",
        "file-info-gif-looped": "mlfoof",
        "file-info-png-looped": "mlfof",
        "newimages-legend": "Filter",
        "variantname-kk-latn": "kk-latn",
        "variantname-kk-arab": "kk-arab",
        "variantname-ku": "ku",
-       "metadata": "L-Métadoné",
-       "metadata-help": "Had l-fiċyé fih l-mazid dyal l-meĝlomaṫ ; ikon zadhom s-scanér ola l-moṣewwira li ĥṫarĝohom.\nIla ṫbeddel l-fiċyé men ḫalṫo l-'aṣliya, kaynin ċi ṫafaṣil ma mnasbinċ kolliyan le l-fiċyé li mbeddel.",
+       "metadata": "ميتاداتا",
+       "metadata-help": "هاد الملف فيه معلومات إضافية، غاتكون زادتهم الكاميرا الرقمية ولا السكانير لي تستعملو باش إصايبوه.\nإلى الملف تعدل على حالتو الأصلية، إمكن يكونو بعض التفاصيل لي ما غاديش تعبر على الملف المعدل.",
        "metadata-expand": "Werri ṫ-ṫafaṣil",
        "metadata-collapse": "Ĥebbi ṫ-ṫafaṣil",
        "metadata-fields": "L-'itaraṫ dyal lé-métadoné EXIF li mlistyin fe had ṣ-ṣefḫa ġaykono fe ṣ-ṣefḫa de l-woṣf dyal ṫ-ṫeṣwira menni ṫṫṣeġġer l-lowḫa dyal lé-métadoné. L'itaraṫ l-ĥrin ġaykono mĥebbyin be tariqa otomaṫikiyan.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "fileduplicatesearch-result-1": "ḫṫṫa ċi ṫakṛaṛ ma mtabq ll-milef \"$1\".",
        "fileduplicatesearch-result-n": "l-milef \"$1\" fih {{PLURAL:$2|1 ṫ-ṫakṛaṛ lli mtabq|$2 d-ṫakṛaṛaṫ lli mtabqa}}.",
        "fileduplicatesearch-noresults": "ma lqina ḫṫṫa ċi milef ṣmito \"$1\".",
-       "specialpages": "Ṣefḫaṫ ĥaṣṣin",
+       "specialpages": "صفحات خاصة",
        "specialpages-group-maintenance": "taqarir siyana",
        "specialpages-group-other": "sfahi khassin khrin",
        "specialpages-group-login": "dkhl/tqiyd",
        "blankpage": "sfha khawiya",
        "intentionallyblankpage": "had sfha trkat fargh a anwa",
        "tags": "wossom taghyir shiha",
-       "tag-filter": "filtr t-[[Special:Tags|tagaṫ]]:",
+       "tag-filter": "فيلتر [[Special:Tags|الطاگات]]:",
        "tag-filter-submit": "Filter",
        "tags-title": "wossom",
        "tags-intro": "had ṣ-ṣfḫa ka tlisti t-tagaṫ lla ymkn imarki biha l-lojiciél ċi ṫĝdil, ol-mĝna ṫaĝha.",
index 8da3832..31841ae 100644 (file)
        "virus-scanfailed": "неуспешно сканиране (код $1)",
        "virus-unknownscanner": "непознат антивирус:",
        "logouttext": "<strong>Излязохте от системата.</strong>\n\nОбърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеша на браузъра.",
+       "logout-failed": "Невъзможен е излизането в момента: $1",
        "cannotlogoutnow-title": "Не може да излезете сега",
        "cannotlogoutnow-text": "Излизането не е възможно, когато се използва $1.",
        "welcomeuser": "Здравейте, $1!",
        "action-changetags": "добавяне и премахване на произволни етикети на индивидуални редакции и записи в дневниците",
        "action-deletechangetags": "изтриване на етикети от базата от данни",
        "action-purge": "почисти кеша на тази страница",
+       "action-apihighlimits": "използване на по-големи лимити при API-заявки",
+       "action-autoconfirmed": "изключение от ограничение на заявките по IP-адрес",
+       "action-bigdelete": "изтриване на страници с дълга история",
+       "action-blockemail": "блокиране на потребител за изпращане на ел. писма",
+       "action-bot": "да бъдете третирани като автоматизиран процес",
+       "action-editprotected": "редактиране на страници защитени като „{{int:protect-level-sysop}}“",
+       "action-editsemiprotected": "редактиране на страници защитени като „{{int:protect-level-autoconfirmed}}“",
+       "action-editinterface": "редактиране на потребителския интерфейс",
+       "action-editusercss": "редактиране на CSS файловете на други потребители",
+       "action-edituserjson": "редактиране на JSON файловете на други потребители",
+       "action-edituserjs": "редактиране на JavaScript файловете на други потребители",
+       "action-editsitecss": "редактиране на CSS за цялото уики",
+       "action-editsitejson": "редактиране на JSON за цялото уики",
+       "action-editsitejs": "редактиране на JavaScript за цялото уики",
+       "action-editmyusercss": "редактиране на собствените потребителски CSS файлове",
+       "action-editmyuserjson": "редактиране на собствените потребителски JSON файлове",
+       "action-editmyuserjs": "редактиране на собствените потребителски JavaScript файлове",
        "action-ipblock-exempt": "пренебрегване на IP блокирания, автоматични блокирания и блокирани диапазони",
        "nchanges": "$1 {{PLURAL:$1|промяна|промени}}",
        "ntimes": "$1×",
        "rcfilters-filter-showlinkedto-label": "Показване на промени на страници, сочещи към",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Страници, сочещи към</strong> избраната страница",
        "rcfilters-target-page-placeholder": "Въведете име на страница (или категория)",
+       "rcfilters-allcontents-label": "Всички именни пространства със съдържание",
+       "rcfilters-alldiscussions-label": "Всички дискусии",
        "rcnotefrom": "{{PLURAL:$5|Дадена е промяната|Дадени са промените}} от <strong>$3, $4</strong> (до <strong>$1</strong> показани).",
        "rclistfromreset": "Нулиране на избора на дата",
        "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "version-poweredby-credits": "Това уики работи на базата на <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
+       "version-poweredby-various": "Различни автори",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|МедияУики]].",
        "version-license-info": "МедияУики е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nМедияУики се разпространява с надеждата, че ще бъде полезен, но <em>БЕЗ НИКАКВИ ГАРАНЦИИ</em>, без дори косвена гаранция за <strong>ПРОДАВАЕМОСТ</strong> или <strong>ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА</strong>. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
        "version-software": "Инсталиран софтуер",
index ecddb15..2822ccd 100644 (file)
        "version-poweredby-credits": "Ena wiki, dezginda '''[https://www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
        "version-poweredby-others": "ê bini",
        "version-poweredby-translators": "Açernere translatewiki.net'i",
+       "version-poweredby-various": "Nuştekarê mıxtelıfi",
        "version-credits-summary": "Ma qayılime ke [[Special:Version|MediaWiki]] rê ke kami destek dayo wa mayê vanime inan bışınasne.",
        "version-license-info": "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.\n\nNuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.\n\nenê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU] zi şımarê icab keno; narak lisansê şıma çıno se, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresi ra yana [//www.gnu.org/licenses/old-licenses/gpl-2.0.html enê lisansi buwane].",
        "version-software": "Softwareyê ronayi",
index a8bbaf1..f7cef6d 100644 (file)
        "version-poweredby-credits": "Este wiki funciona gracias a <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "otros",
        "version-poweredby-translators": "Traductores de translatewiki.net",
+       "version-poweredby-various": "Varios autores",
        "version-credits-summary": "Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki es software libre; puedes redistribuirlo o modificarlo según los términos de la Licencia General Pública de GNU tal como la publica la Free Software Foundation; ya sea la versión 2 de la licencia o (a tu elección) cualquier versión posterior.\n\nMediaWiki se distribuye con la esperanza de que sea útil, pero <em>SIN NINGUNA GARANTÍA</em>; sin siquiera con la garantía implícita de <em>COMERCIABILIDAD</em> o de <em>IDONEIDAD PARA UN PROPÓSITO PARTICULAR</em>. Consulta la Licencia Pública General de GNU para más detalles.\n\nHas recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública General de GNU] junto a este programa; si no es así, escríbele a la Free Software Foundation, Inc., Calle Franklin 51, quinto piso, Boston, MA 02110-1301, EE. UU. o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html léela en línea].",
        "version-software": "Software instalado",
index b2aa80c..b96509e 100644 (file)
@@ -79,6 +79,7 @@
        "tog-useeditwarning": "Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata",
        "tog-prefershttps": "Kasuta sisselogimisel alati turvalist ühendust",
        "tog-showrollbackconfirmation": "Küsi tühistamislingile klõpsamise järel kinnitust",
+       "tog-requireemail": "Nõua parooli lähtestamisel e-posti aadressi",
        "underline-always": "Alati",
        "underline-never": "Mitte kunagi",
        "underline-default": "Kujunduse või brauseri vaikeväärtus",
        "perfcached": "Järgmised andmed on puhverdatud ja ei pruugi olla kõige värskemad. Puhvris on saadaval kuni {{PLURAL:$1|üks tulemus|$1 tulemust}}.",
        "perfcachedts": "Järgmised andmed on vahemälus. Viimane uuendamisaeg: $2, kell $3. Puhvris on saadaval kuni {{PLURAL:$4|üks tulemus|$4 tulemust}}.",
        "querypage-no-updates": "Lehekülje uuendamine ei ole hetkel lubatud ning andmeid ei värskendata.",
+       "querypage-updates-periodical": "Seda lehekülge uuendatakse korrapäraselt.",
        "viewsource": "Vaata lähteteksti",
        "viewsource-title": "Lehekülje $1 lähteteksti vaatamine",
        "actionthrottled": "Toiming nurjus",
        "createaccountmail": "Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile",
        "createaccountmail-help": "Saab kasutada konto loomiseks teisele kasutajale ilma parooli teada saamata.",
        "createacct-realname": "Pärisnimi (valikuline)",
-       "createacct-reason": "Põhjus",
+       "createacct-reason": "Põhjus (logitakse avalikult)",
        "createacct-reason-ph": "Miks lood teist kontot?",
        "createacct-reason-help": "Sõnum, mida näidatakse konto loomise logis",
        "createacct-submit": "Loo konto",
        "undo-norev": "Muudatust ei saanud eemaldada, kuna seda ei ole olemas või see kustutati.",
        "undo-nochange": "Paistab, et see muudatus on juba eemaldatud.",
        "undo-summary": "Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]])",
+       "undo-summary-anon": "Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Eemaldatud redaktsioon $1, mille tegi peidetud kasutaja",
        "cantcreateaccount-text": "[[User:$3|$3]] on blokeerinud konto loomise sellelt IP-aadressilt (<strong>$1</strong>).\n\n$3 märkis järgmise põhjuse: <em>$2</em>",
        "cantcreateaccount-range-text": "Kontode loomine IP-aadressidelt vahemikus <strong>$1</strong>, millesse jääb sinu IP-aadress (<strong>$4</strong>), on blokeeritud. Blokeeris kasutaja [[User:$3|$3]].\n\n$3 tõi järgmise põhjuse: <em>$2</em>",
        "prefs-help-email": "E-posti aadressi sisestamine pole kohustuslik, kuid võimaldab sul tellida parooli meeldetuletuse, kui peaksid oma parooli unustama.",
        "prefs-help-email-others": "Võid ka paluda teistel sinu kasutaja- või aruteluleheküljel sinuga ühendust võtta, selle asemel, et peaksid oma isikuandmeid avaldama.",
        "prefs-help-email-required": "E-posti aadress on vajalik.",
+       "prefs-help-requireemail": "Kui märgitud, siis saadetakse parooli lähtestamise e-kirju ainult juhul, kui lähtestaja toob ära nii konto kasutajanime kui ka e-posti aadressi.",
        "prefs-info": "Põhiteave",
        "prefs-i18n": "Rahvusvaheline",
        "prefs-signature": "Allkiri",
        "backend-fail-contenttype": "Faili, mida soovitakse talletada asukohas \"$1\", sisutüüpi saanud kindlaks teha.",
        "backend-fail-batchsize": "Tagamällu edastati {{PLURAL:$1|ühest|$1}} failioperatsioonist koosnev pakk; ülemmäär on {{PLURAL:$2|üks operatsioon|$2 operatsiooni}}.",
        "backend-fail-usable": "Faili $1 ei saa ebapiisavate õiguste või puuduvate kataloogide/konteinerite tõttu lugeda ega kirjutada.",
+       "backend-fail-stat": "Faili \"$1\" olekut ei õnnestunud lugeda.",
+       "backend-fail-hash": "Faili \"$1\" krüptograafilist räsiväärtust ei õnnestunud kindlaks teha.",
        "filejournal-fail-dbconnect": "Tagamälus \"$1\" ebaõnnestus ühendumine päevikuga.",
        "filejournal-fail-dbquery": "Tagamälus \"$1\" ebaõnnestus päeviku värskendamine.",
        "lockmanager-notlocked": "Rada \"$1\" ei saa lukust lahti teha, sest see pole lukus.",
        "listfiles-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "imgfile": "fail",
        "listfiles": "Failide loend",
+       "listfiles_subpage": "Kasutaja $1 üleslaaditud failid",
        "listfiles_thumb": "Pisipilt",
        "listfiles_date": "Kuupäev",
        "listfiles_name": "Nimi",
        "alreadyrolled": "Muudatust, mille tegi lehele [[:$1]] kasutaja [[User:$2|$2]] ([[User talk:$2|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), ei saa tühistada, sest keegi teine on seda lehte vahepeal muutnud.\n\nLehte muutis viimasena [[User:$3|$3]] ([[User talk:$3|arutelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Redaktsiooni resümee oli: <em>$1</em>.",
        "revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
+       "revertpage-anon": "Tühistati kasutaja [[Special:Contributions/$2|$2]] tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
        "revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
        "rollback-success": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Seansiviga",
        "ipblocklist-legend": "Leia blokeeritud kasutaja",
        "blocklist-userblocks": "Peida kontod",
        "blocklist-tempblocks": "Peida ajutised",
+       "blocklist-indefblocks": "Peida tähtajatud",
        "blocklist-addressblocks": "Peida üksikud IP-aadressid",
        "blocklist-type": "Tüüp:",
        "blocklist-type-opt-all": "Kõik",
        "version-poweredby-credits": "See viki kasutab '''[https://www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
        "version-poweredby-others": "teised",
        "version-poweredby-translators": "translatewiki.net-i tõlkijad",
+       "version-poweredby-various": "Erinevad autorid",
        "version-credits-summary": "Tahame tunnustada järgmisi inimesi [[Special:Version|MediaWikile]] tehtud kaastöö eest.",
        "version-license-info": "MediaWiki on vaba tarkvara; tohid seda taaslevitada ja/või selle põhjal teisendeid luua vastavalt Vaba Tarkvara Fondi avaldatud GNU Üldise Avaliku Litsentsi versioonis 2 või hilisemas seatud tingimustele.\n\nMediaWiki tarkvara levitatakse lootuses, et see on kasulik, aga <em>igasuguse tagatiseta</em>, ka kaudse tagatiseta teose <strong>turustatavuse</strong> või <strong>müügikõlblikkuse</strong> kohta. Üksikasjad leiad GNU Üldisest Avalikust Litsentsist.\n\nGNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks selle programmiga kaasas olema; kui pole, kirjuta aadressil Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA või [//www.gnu.org/licenses/old-licenses/gpl-2.0.html loe seda võrgust].",
        "version-software": "Paigaldatud tarkvara",
        "mycustomjsredirectprotected": "Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see on ümbersuunamine ja see ei viita sinu kasutajaruumi.",
        "easydeflate-invaliddeflate": "Ette antud sisu ei ole õigesti vähendatud",
        "unprotected-js": "Turvalisuse huvides ei saa JavaScripti laadida kaitsmata lehekülgedelt. Palun koosta JavaScripti ainult nimeruumis MediaWiki või kasutajate nimeruumi alamleheküljel.",
-       "userlogout-continue": "Kas soovid välja logida?"
+       "userlogout-continue": "Kas soovid välja logida?",
+       "rest-prefix-mismatch": "Päritud tee ($1) is sisaldu REST API juurtees ($2)",
+       "rest-wrong-method": "Päritud meetod ($1) ei ole sellel teel ($2) {{PLURAL:$3|lubatud meetod|üks lubatud meetoditest}}",
+       "rest-no-match": "Päritud suhteline tee ($1) ei vasta ühelegi teadaolevale käsitlejale"
 }
index 0e4eb28..3e9dbef 100644 (file)
        "exif-scenetype-1": "Пряко заснето изображение",
        "exif-customrendered-0": "Нормален процес",
        "exif-customrendered-1": "Нестандартна обработка",
+       "exif-customrendered-2": "HDR (оригиналът не е запазен)",
+       "exif-customrendered-3": "HDR (запазен оригинал)",
+       "exif-customrendered-4": "Оригинал (за HDR)",
+       "exif-customrendered-6": "Панорама",
+       "exif-customrendered-7": "Портретен HDR",
+       "exif-customrendered-8": "Портрет",
        "exif-exposuremode-0": "автоматична експонация",
        "exif-exposuremode-1": "ръчна експонация",
        "exif-exposuremode-2": "Автоматичен клин",
        "exif-gpsdirection-t": "Истинска",
        "exif-gpsdirection-m": "Магнитна",
        "exif-ycbcrpositioning-1": "Центрирани",
+       "exif-ycbcrpositioning-2": "Co-sited",
        "exif-dc-contributor": "Сътрудници",
        "exif-dc-coverage": "Пространствен или времеви обхват на медийния файл",
        "exif-dc-date": "Дата(и)",
index e5baac8..8962d59 100644 (file)
        "createacct-another-submit": "ایجاد حساب کاربری",
        "createacct-continue-submit": "ادامهٔ ايجاد حساب",
        "createacct-another-continue-submit": "ادامهٔ ايجاد حساب",
-       "createacct-benefit-heading": "{{SITENAME}} ØªÙ\88سط Ø§Ù\81رادÛ\8c Ù\85اÙ\86Ù\86د Ø´Ù\85ا Ø³Ø§Ø®ØªÙ\87 Ø´Ø¯Ù\87 Ø§Ø³Øª",
+       "createacct-benefit-heading": "{{SITENAME}} Ø±Ø§ Ø§Ù\81رادÛ\8c Ù\87Ù\85Ú\86Ù\88Ù\86 Ø´Ù\85ا Ø³Ø§Ø®ØªÙ\87â\80\8cاÙ\86د",
        "createacct-benefit-body1": "{{PLURAL:$1|ویرایش}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "createacct-benefit-body3": "{{PLURAL:$1|مشارکت‌کنندهٔ}} اخیر",
index 3f1ae4b..78961a2 100644 (file)
        "watchlistedit-normal-explain": "Tarkkailulistasi sivut on lueteltu alla. Voit poistaa sivuja valitsemalla niitä vastaavat valintaruudut ja napsauttamalla ”{{int:Watchlistedit-normal-submit}}”. Voit myös muokata listaa [[Special:EditWatchlist/raw|tekstimuodossa]].",
        "watchlistedit-normal-submit": "Poista kohteet",
        "watchlistedit-normal-done": "{{PLURAL:$1|Yksi sivu|$1 sivua}} poistettiin tarkkailulistaltasi:",
-       "watchlistedit-raw-title": "Tarkkailulistan muokkaus",
+       "watchlistedit-raw-title": "Tarkkailulistan muokkaus raakamuodossa",
        "watchlistedit-raw-legend": "Muokkaa tarkkailulistaa raakamuodossa",
        "watchlistedit-raw-explain": "Tarkkailulistasi sivut on lueteltu alla jokainen omalla rivillään. Voit muokata listaa lisäämällä ja poistamalla rivejä.\nKun olet valmis, napsauta ”{{int:Watchlistedit-raw-submit}}”.\nVoit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].",
        "watchlistedit-raw-titles": "Sivut",
index 982b7d7..9a5ef9a 100644 (file)
@@ -25,7 +25,7 @@
        "tog-previewonfirst": "Näytä esitarkastelu kun mookkaus alethaan",
        "tog-enotifwatchlistpages": "Lähätä e-postipreivi mulle kun sivu tai fiili minun valvontalistala on muutettu",
        "tog-enotifusertalkpages": "Lähätä E-posti, kun käyttäjäsivun keskustelusivu muuttuu",
-       "tog-enotifminoredits": "Lähätä epostieto pienistäki muutoksista sivuissa ja fiileissä",
+       "tog-enotifminoredits": "Lähätä e-postipreivi pienistäki muutoksista sivuissa ja fiileissä",
        "tog-enotifrevealaddr": "Näytä minun e-posti atressin muile lähetetyissä ilmoituksissa",
        "tog-shownumberswatching": "Näytä kuinka moni käyttäjä valvoo sivua",
        "tog-oldsig": "Sinun nykynen allekirjotus:",
@@ -45,7 +45,7 @@
        "fri": "pe",
        "sat": "la",
        "january": "janyaari",
-       "february": "febryaari",
+       "february": "helmikuu",
        "march": "maaliskuu",
        "april": "huhtikuu",
        "may_long": "toukokuu",
@@ -55,7 +55,7 @@
        "september": "septempäri",
        "october": "lokakuu",
        "november": "marraskuu",
-       "december": "tesämperi",
+       "december": "joulukuu",
        "january-gen": "janyaarin",
        "february-gen": "febryaarin",
        "march-gen": "maaliskuun",
@@ -67,7 +67,7 @@
        "september-gen": "septempäri",
        "october-gen": "lokakuun",
        "november-gen": "marraskuun",
-       "december-gen": "tesämperin",
+       "december-gen": "joulukuun",
        "jan": "tammikuu",
        "feb": "helmikuu",
        "mar": "maaliskuu",
        "badtitle": "Virheelinen titteli",
        "badtitletext": "Pyytämästi sivurypriikki oli virheelinen, tyhjä eli titteli on väärin linkitetty muusta wikistä. Se saattaa sisältää yhen eli monta sympoolia, joita ei saa käyttää sivutittelissä.",
        "viewsource": "Näytä lähekooti",
+       "exception-nologin": "Ei lokattu sisäle",
        "welcomeuser": "Tervetuloa, $1!",
        "yourname": "Käyttäjänimi",
        "userlogin-yourname": "Käyttäjänimi",
        "userlogin-yourname-ph": "Kirjota sinun käyttäjänimi",
+       "createacct-another-username-ph": "Kirjota käyttäjänimi",
        "yourpassword": "Salasana",
        "userlogin-yourpassword": "Salasana",
+       "userlogin-yourpassword-ph": "Kirjota sinun salasana",
+       "createacct-yourpassword-ph": "Kirjota salasana",
        "yourpasswordagain": "Salasana uuesti",
+       "createacct-yourpasswordagain-ph": "Kirjota salasana uuesti",
        "login": "Lokkaa sisäle",
        "nav-login-createaccount": "Lokkaa sisäle / luo konttu",
        "logout": "Lokkaa ulos",
        "userlogout": "Lokkaa ulos",
+       "notloggedin": "Ei lokattu sisäle",
+       "userlogin-noaccount": "Eikos sulla ole käyttäjäkonttua?",
        "userlogin-joinproject": "Liity {{SITENAME}}",
        "createaccount": "Luo käyttäjäkonttu",
+       "userlogin-resetpassword-link": "Unhouttanu sinun salasanan?",
+       "userlogin-createanother": "Luo toinen käyttäjäkonttu",
        "createacct-emailrequired": "E-postin atressi",
+       "createacct-emailoptional": "E-postin atressi (vapa)",
+       "createacct-submit": "Luo sinun käyttäjäkonttu",
        "createacct-another-submit": "Luo konttu",
        "createacct-benefit-body1": "{{PLURAL:$1|mookkaus|mookhausta}}",
        "loginsuccesstitle": "Lokattu sisäle",
        "pt-login-button": "Lokkaa sisäle",
        "pt-createaccount": "Luo konttu",
        "pt-userlogout": "Lokkaa ulos",
+       "oldpassword": "Vanha salasana:",
        "botpasswords-label-cancel": "Lopeta",
        "botpasswords-label-delete": "Ota poies",
+       "resetpass-submit-loggedin": "Muuta salasana",
        "resetpass-submit-cancel": "Lopeta",
+       "passwordreset-username": "Käyttäjänimi:",
        "passwordreset-email": "E-postin atressi:",
+       "passwordreset-invalidemail": "Virheellinen e-postin atressi",
        "changeemail": "Muuta tai poista E-postin atressi",
        "changeemail-newemail": "Uusi E-postin atressi:",
+       "changeemail-password": "Sinun {{SITENAME}}-salasana:",
        "summary": "Yhteenveto",
        "minoredit": "Tämä on pieni muutos",
        "watchthis": "Valvo tätä sivua",
        "savearticle": "Säästä sivu",
        "savechanges": "Säästä muutokset",
+       "publishpage": "Anna ulos sivu",
+       "publishchanges": "Anna ulos muutokset",
        "savearticle-start": "Säästä sivu...",
        "savechanges-start": "Säästä muutokset...",
+       "publishpage-start": "Anna ulos sivu...",
+       "publishchanges-start": "Anna ulos muutokset...",
        "preview": "Esitarkastelu",
        "showpreview": "Näytä esitarkastelu",
        "showdiff": "Näytä muutokset",
        "newarticletext": "Linkki vei sinun sivule, joka ei vielä ole.\nSaatat luoa sivun kirjottamalla alla olehvaan kenthään (katto [$1 apusivu] lissää tietoja).\nJos et halua luoa sivua, käytä browserin <strong>takashii</strong> knappia.",
        "noarticletext": "Tällä hetkelä tällä sivula ei ole tekstiä.\nSaatat [[Special:Search/{{PAGENAME}}|hakea sivun nimelä]] muilta sivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheesheen liittyviä lokkia]\neli [{{fullurl:{{FULLPAGENAME}}|action=edit}} luoa tämä sivu]</span>.",
        "noarticletext-nopermission": "Tällä hetkelä tällä sivula ei ole tekstiä.\nSaatat [[Special:Search/{{PAGENAME}}|hakea sivun nimelä]] muilta sivuilta,\neli <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea relevantista lokista]\neli [{{fullurl:{{FULLPAGENAME}}|action=edit}} mookata tätä sivua]</span>.",
-       "previewnote": "'''Tämä on vasta sivun etukattelu. Sivua ei ole vielä säästetty!'''",
+       "previewnote": "<strong>Tämä on vasta sivun esitarkastelu.</strong>\nSivua ei ole vielä säästetty!",
+       "continue-editing": "Siirry mookkauskenthään",
        "editing": "Mookathaan sivua $1",
        "editingsection": "Mookathaan $1 (seksuuni)",
        "templatesused": "Tällä sivula {{PLURAL:$1|käytetty malli|käytetyt mallit}}:",
        "histlegend": "Eron valinta: markkeeraa klikkiruuissa ette pääset vertaamhaan versuunia, ja paina enter eli knaphiin kaikhiin alla. \nMerkinät: (nyk.) = eroavaisuuet nykyisheen versuunhiin, (eel.) = eroavaisuuet eelisheen versuunhiin, <span class=\"minor\">p</span> = pieni muutos",
        "history-fieldset-title": "Plaavaa muutoshistuuriaa",
        "history-show-deleted": "Vain poistetut",
-       "histfirst": "Ensimäiset",
-       "histlast": "Viimisimät",
+       "histfirst": "vanhimat",
+       "histlast": "uusimat",
        "history-feed-item-nocomment": "$1 ($2)",
        "rev-delundel": "näytä/piilota",
        "revdel-restore": "muuta näkyvyyttä",
        "preferences": "Inställninkit",
        "mypreferences": "Inställninkit",
        "prefs-watchlist": "Valvontalista",
+       "prefs-editwatchlist": "Mookkaa valvontalistaa",
+       "prefs-resetpass": "Muuta salasana",
        "saveprefs": "Säästä",
        "prefs-editing": "Mookkaus",
        "timezoneregion-america": "Ameriika",
        "rcnotefrom": "Alla on {{PLURAL:$5|muutos|muutokset}} <strong>$3, $4</strong> lähtien. (korkeinthaans <strong>$1</strong> näytethään).",
        "rclistfrom": "Näytä uuet muutokset jälkhiin $3 $2",
        "rcshowhideminor": "$1 pienet muutokset",
+       "rcshowhideminor-hide": "Piilota",
        "rcshowhidebots": "$1 ropootit",
+       "rcshowhidebots-show": "Näytä",
        "rcshowhideliu": "$1 rekisteröityneihtä käyttäjiä",
+       "rcshowhideliu-show": "Näytä",
+       "rcshowhideliu-hide": "Piilota",
        "rcshowhideanons": "$1 anonyymit käyttäjät",
+       "rcshowhideanons-hide": "Piilota",
        "rcshowhidepatr": "$1 tarkistetut muutokset",
        "rcshowhidemine": "$1 omat muutokset",
+       "rcshowhidemine-hide": "Piilota",
        "rclinks": "Näytä $1 verestä muutosta viimisitten $2 päivitten aikana.",
        "diff": "ero",
        "hist": "histuuria",
        "filedelete-submit": "Ota poies",
        "randompage": "Satunhainen sivu",
        "randomincategory-category": "Katekuuri:",
+       "randomredirect": "Satunhainen ohjaus",
        "statistics": "Statistiikkaa",
        "brokenredirects-delete": "ota poies",
        "nbytes": "$1 {{PLURAL:$1|tavu|tavua}}",
        "allarticles": "Kaikki sivut",
        "allpagessubmit": "Mene",
        "categories": "Katekuurit",
+       "categoriesfrom": "Näytä alkaen katekuurista:",
        "linksearch-ns": "Nimityhjyys:",
        "linksearch-line": "$1 on linkattu sivulta $2",
        "listgrouprights-members": "(jäsenlista)",
        "listgrouprights-namespaceprotection-namespace": "Nimityhjyys",
        "emailuser": "Lähätä e-posti tälle käyttäjälle",
+       "emailsend": "Lähätä",
        "watchlist": "Valvontalista",
        "mywatchlist": "Valvontalista",
        "watchlistfor2": "Käyttäjälle $1 $2",
        "rollbacklink": "rullaa takashiin",
        "protectlogpage": "Suojausloki",
        "protectedarticle": "suojasi sivun [[$1]]",
-       "restriction-edit": "Mookkaa",
+       "restriction-edit": "Mookkaus",
        "restriction-move": "Siirä",
        "restriction-upload": "Lattaa ylös",
        "undeletelink": "näytä/ota takashiin",
        "movelogpage": "Siirtoloki",
        "revertmove": "siirä takashiin",
        "export": "Eksporteeraa sivuja",
+       "export-addcat": "Lissää",
+       "export-addns": "Lissää",
        "allmessagesname": "Nimi",
        "allmessagesdefault": "Stantartiteksti",
        "thumbnail-more": "Isona",
        "monthsall": "kaikki",
        "imgmultigoto": "Mene sivule $1",
        "autoredircomment": "Ohjattu sivule [[$1]]",
+       "watchlistedit-normal-title": "Valvontalistan mookkaus",
+       "watchlistedit-raw-title": "Valvontalistan mookkaus raakamuodossa",
        "watchlisttools-view": "Näytä muutokset",
        "watchlisttools-edit": "Näytä ja mookkaa valvontalistaa",
        "watchlisttools-raw": "Mookkaa valvontalistaa raakamuoossa",
        "tag-filter": "[[Special:Tags|Merkki]] filtteri:",
        "tags-delete": "ota poies",
        "restore-count-files": "{{PLURAL:$1|1 fiili|$1 fiilit}}",
+       "logentry-newusers-create": "Käyttäjäkonttu $1 {{GENDER:$2|luotiin}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ylöslattasi}} $3",
-       "searchsuggest-search": "Hae {{SITENAME}}",
+       "searchsuggest-search": "Hae {{GRAMMAR:elative|{{SITENAME}}}}",
        "mediastatistics-header-total": "Kaikki fiilit",
        "mw-widgets-categoryselector-add-category-placeholder": "Lissää katekuuri...",
        "authmanager-email-label": "E-posti",
index 9faf2b1..634164d 100644 (file)
        "version-poweredby-credits": "Ce wiki fonctionne grâce à <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "autres",
        "version-poweredby-translators": "traducteurs de translatewiki.net",
+       "version-poweredby-various": "Divers auteurs",
        "version-credits-summary": "Nous tenons à remercier les personnes suivantes pour leur contribution à  [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki est un logiciel libre, vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.\n\nMediaWiki est distribué dans l’espoir qu'il sera utile, mais <em>SANS AUCUNE GARANTIE</em>, sans même la garantie implicite de <strong>COMMERCIALISABILITÉ</strong> ou <strong>D’ADÉQUATION À UN USAGE PARTICULIER</strong>. Voir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licence Publique Générale GNU] avec ce programme, sinon, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, États-Unis ou [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lisez-la en ligne].",
        "version-software": "Logiciels installés",
index cdbb2f4..bac3550 100644 (file)
        "version-poweredby-credits": "Questo wiki è realizzato con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "altri",
        "version-poweredby-translators": "traduttori di translatewiki.net",
+       "version-poweredby-various": "Autori vari",
        "version-credits-summary": "Siamo lieti di riconoscere le seguenti persone per aver contribuito a [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.\n\nMediaWiki è distribuito nella speranza che sia utile, ma <em>SENZA ALCUNA GARANZIA</em>; senza neppure la garanzia implicita di <strong>NEGOZIABILITÀ</strong> o di <strong>APPLICABILITÀ PER UN PARTICOLARE SCOPO</strong>. Si veda la GNU General Public License per maggiori dettagli.\n\nQuesto programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia della GNU General Public License]; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [http://www.softwarelibero.it/gnudoc/gpl.it.txt leggerla in rete].",
        "version-software": "Software installato",
index 4ec93d5..26bb7c6 100644 (file)
        "history": "Amezruy n usebter",
        "history_short": "Amazray",
        "history_small": "amazray",
-       "updatedmarker": "yettubeddel segmi tarzeft taneggarut inu",
+       "updatedmarker": "Ibeddel seg tirza-ik taneggarut",
        "printableversion": "Lqem n usiggez",
        "permalink": "Azday ur yettbeddil ara",
        "print": "Siggez",
        "previousdiff": "← Amgirred ssabeq",
        "nextdiff": "Amgirred ameḍfir →",
        "mediawarning": "'''Ɣuṛ-wet''': tawsit agi n ufaylu tezmer at sɛu angal aḥraymi.\nLukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
-       "imagemaxsize": "Tiddi tafellayt n tugniwin :<br />''(i isebtar n weglam ufaylu)''",
+       "imagemaxsize": "Talast n teɣzi n tugna deg yisebtar n useglem n ufaylu:",
        "thumbsize": "Tiddi n tugna tamecṭuḥt:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|asebtar|isebtar}}",
        "file-info": "tiddi n ufaylu: $1, anaw n MIME: $2",
        "expandtemplates": "Aderrec n talɣiwin",
        "expand_templates_intro": "Asebtar agi uslig yeqbel aḍris wiki dɣa i tɛemmed ad xeddemeḍ aderrec n talɣiwin yellan deg-es.\nYetexddem daɣen aderrec n tiseɣnin n parser am\n<code><nowiki>{{</nowiki>#language:...}}</code> dɣa imuttiyen am\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nYetexddem aderrec n akkw ayen yella yesegrer s <nowiki>'''{{ }}'''</nowiki>.",
        "expand_templates_title": "Azwel n usebtar, ma angal yetseqdac {{FULLPAGENAME}}, etc. :",
-       "expand_templates_input": "Aḍris wiki source :",
+       "expand_templates_input": "Aḍris n uwiki i ikecmen:",
        "expand_templates_output": "Aḍris wiki id yefka sakin aderrec",
        "expand_templates_xml_output": "Agemmuḍ agrawan n tasleṭ, deg umasal XML",
        "expand_templates_html_output": "Asuffeɣ s HTML aneṣli",
index 7a7b9d5..b0991f2 100644 (file)
        "version-poweredby-credits": "이 위키는 '''[https://www.mediawiki.org/ MediaWiki]'''(미디어위키)를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
        "version-poweredby-others": "그 외 다른 개발자",
        "version-poweredby-translators": "translatewiki.net 번역자",
+       "version-poweredby-various": "여러 개발자",
        "version-credits-summary": "[[Special:Version|미디어위키]]에 기여한 다음 사람에게 감사드립니다.",
        "version-license-info": "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.\n\n미디어위키가 유용하게 사용될 수 있기를 바라지만 <em>상용으로 사용</em>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참조하십시오.\n\n당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
        "version-software": "설치된 소프트웨어",
index dc132bb..07f68dd 100644 (file)
        "version-poweredby-credits": "Ова вики работи на '''[https://www.mediawiki.org/ МедијаВики]''', авторски права © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преведувачи на translatewiki.net",
+       "version-poweredby-various": "Разни автори",
        "version-credits-summary": "Би сакале да им се заблагодариме на следниве лица за нивните придонеси кон [[Special:Version|МедијаВики]].",
        "version-license-info": "МедијаВики е слободна програмска опрема; можете да ја редистрибуирате и/или менувате под условите на ГНУ-овата општа јавна лиценца на Фондацијата за слободна програмска опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).\n\nМедијаВики се нуди со надеж дека ќе биде од корист, но БЕЗ <em>БИЛО КАКВА ГАРАНЦИЈА</em>; дури и без подразбраната гаранција за <strong>ПРОДАЖНА ВРЕДНОСТ</strong> или <strong>ПОГОДНОСТ ЗА ДАДЕНА ЦЕЛ</strong>. За повеќе информации, погледајте ја ГНУ-овата општа јавна лиценца.\n\nЗаедно со програмов треба да имате добиено [{{SERVER}}{{SCRIPTPATH}}/COPYING примерок од ГНУ-овата општа јавна лиценца]; ако немате добиено примерок, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте ја тука].",
        "version-software": "Воспоставена програмска опрема",
index ecf4a40..9d9a61f 100644 (file)
        "tmp-create-error": "ယာယီဖိုင် မဖန်တီးနိုင်ပါ။",
        "tmp-write-error": "ယာယီဖိုင်ရေးသားရာတွင် အမှားဖြစ်ပေါ်နေသည်။",
        "largefileserver": "ဤဖိုင်သည် ဆာဗာတွင် ခွင့်ပြုရန်သတ်မှတ်ထားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်။",
+       "fileexists": "ဤအမည်ဖြင့် ဖိုင်တစ်ခု ရှိနှင့်ပြီး ဖြစ်သဖြင့် {{GENDER:|သင့်}}အနေဖြင့် ယင်းဖိုင်အား ပြောင်းလဲရန် မသေချာပါက ကျေးဇူးပြု၍ <strong>[[:$1]]</strong> ကို စစ်ဆေးပါ။\n[[$1|thumb]]",
        "file-exists-duplicate": "ဤဖိုင်သည် အောက်ပါ {{PLURAL:$1|ဖိုင်|ဖိုင်များ}}၏ ထပ်တူပုံပွား ဖြစ်သည် -",
        "uploadwarning": "Upload တင်ရာတွင် သတိပေးချက်",
        "uploadwarning-text": "ဖိုင်ဖော်ပြချက်ကို အောက်တွင် ပြုပြင်ပြီး ထပ်မံကြိုးစားပါ။",
index 76e678e..6800427 100644 (file)
        "category-file-count-limited": "In disse kategory {{PLURAL:$1|steyt et volgende bestand|stån de volgende $1 bestanden}}.",
        "listingcontinuesabbrev": "(vervolg)",
        "index-category": "Te indekseren syden",
-       "noindex-category": "Syden dee neet indexeerd binnen",
+       "noindex-category": "Neet-indekseerde syden",
        "broken-file-category": "Syden mid verkeyrde bestandsverwysingen",
        "about": "Informaty",
        "article": "Artikel",
        "savechanges": "Wysigingen uutgeaven",
        "publishpage": "Zied uutbrengen",
        "publishchanges": "Wysigingen uutgeaven",
+       "publishchanges-start": "Wysigingen uutgeaven...",
        "preview": "Nåkyken",
        "showpreview": "Bewarking nåkyken",
        "showdiff": "Verskil bekyken",
        "cascadeprotectedwarning": "'''Waorschuwing:''' disse zied is beveiligd, zodat allinnig beheerders disse zied bewarken kunnen, dit wörden edaon umdat disse zied veurkömp in de volgende {{PLURAL:$1|kaskade-beveiligden zied|kaskade-beveiligden ziejen}}:",
        "titleprotectedwarning": "'''Waorschuwing: disse zied is beveiligd. Je hebben [[Special:ListGroupRights|bepaolde rechten]] neudig um t an te kunnen maken.'''\nDe leste logboekregel steet hieronder:",
        "templatesused": "{{PLURAL:$1|Mal|Mallen}} dee up disse syde gebruked wörden:",
-       "templatesusedpreview": "{{PLURAL:$1|Mal|Mallen}} die in disse bewarking gebruukt wörden:",
+       "templatesusedpreview": "{{PLURAL:$1|Mal|Mallen}} dee in disse bewarking gebruked wördet:",
        "templatesusedsection": "{{PLURAL:$1|Mal|Mallen}} die in dit subkopjen gebruukt wörden:",
        "template-protected": "(beveiligd)",
        "template-semiprotected": "(halv-beveiligd)",
        "nocreate-loggedin": "Je hebben gien toestemming um nieje ziejen an te maken.",
        "sectioneditnotsupported-title": "t Bewarken van seksies wörden niet ondersteund",
        "sectioneditnotsupported-text": "Je kunnen op disse zied gien seksies bewarken.",
-       "permissionserrors": "Gien toestemming",
+       "permissionserrors": "Fauten in rechten",
        "permissionserrorstext": "Je maggen of kunnen dit niet doon. De {{PLURAL:$1|reden|redens}} daorveur {{PLURAL:$1|is|bin}}:",
        "permissionserrorstext-withaction": "Jy hebbet geen rechten üm $2, mid de volgende {{PLURAL:$1|readen|readenen}}:",
-       "recreate-moveddeleted-warn": "'''Waorschuwing: je maken n zied an die eerder al vortedaon is.'''\n\nBedenk eerst of t neudig is um disse zied veerder te bewarken.\nVeur de dudelikheid steet hieronder  t vortdologboek en t herneumlogboek veur disse zied:",
+       "recreate-moveddeleted-warn": "<strong>Wårsküwing: jy stellet een syde up dee eyrer al vordsmeaten is.</strong>\n\nBedenk eyrst of et passend is üm disse syde wyder te bewarken.\nVöär et gemak steyt hyrunder et vordsmytlogbook en et hernöömlogbook vöär disse syde:",
        "moveddeleted-notice": "Disse syde is vordsmeaten.\nHyrunder steyt de informaty uut et vortsmytlogbook, et beveiligingslogbook, en et hernöömlogbook.",
        "log-fulllog": "t Hele logboek bekieken",
        "edit-hook-aborted": "De bewarking is aofebreuken deur n hook.\nDer is gien reden op-egeven.",
        "invalid-content-data": "Ongeldige inhoudsgegevens",
        "content-not-allowed-here": "De inhoud \"$1\" is niet toe-estaan op de zied [[:$2]].",
        "editwarning-warning": "A'j disse zied verlaoten dan bi'j de wieziging die'j emaakt hebben waorschienlik kwiet.\nA'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"{{int:prefs-editing}}\" in joew veurkeuren.",
-       "content-model-wikitext": "wikitekste",
+       "content-model-wikitext": "wikitekst",
        "content-model-text": "tekste zonder opmaak",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "unstrip-depth-warning": "De rekursielimiet ($1) veur \"unstrip\" is overschrejen",
        "converter-manual-rule-error": "Der is n fout evunnen in n haandmaotig in-evoegden taalkonversieregel.",
        "undo-success": "De bewarking kan weerummedreid wörden. Kiek de vergelieking hieronder nao um der wisse van de ween dat alles goed is, en slao de de zied op um de bewarking weerumme te dreien.",
-       "undo-failure": "De wieziging kon niet weerummedreid wörden umdat t ondertussen awweer ewiezigd is.",
+       "undo-failure": "De wysiging kun neet weaderümmedraid wörden ümdat et undertüsken alweader wysigd is.",
        "undo-norev": "De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.",
        "undo-nochange": "Et likt derup dat de bewarking al weaderümmedraid is.",
        "undo-summary": "Versy $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|oaverleg]]) weaderümmedraid",
        "histlast": "nyste",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "historyempty": "leadig",
-       "history-feed-title": "Wiezigingsoverzichte",
-       "history-feed-description": "Wiezigingsoverzichte veur disse zied op de wiki",
+       "history-feed-title": "Wysigingsoaversicht",
+       "history-feed-description": "Wysigingsoaversicht vöär disse syde up de wiki",
        "history-feed-item-nocomment": "$1 op $2",
        "history-feed-empty": "De op-evreugen zied besteet niet. t Kan ween dat disse zied vortedaon is of dat t herneumd is. Probeer te [[Special:Search|zeuken]] naor soortgelieke nieje ziejen.",
        "rev-deleted-comment": "(bewarkingsopmarking vortedaon)",
        "mergehistory-comment": "[[:$1]] samenevoegd naor [[:$2]]: $3",
        "mergehistory-same-destination": "De bronzied en doelzied kunnen niet t zelfde ween",
        "mergehistory-reason": "Reden:",
-       "mergelog": "Samenvoegingslogboek",
+       "mergelog": "Samenvogingslogbook",
        "revertmerge": "Samenvoeging weerummedreien",
        "mergelogpagetext": "Hieronder zie'j n lieste van de leste samenvoegingen van n ziedgeschiedenisse naor n aandere.",
        "history-title": "Versygeskydenisse van \"$1\"",
        "compareselectedversions": "Vergelyk de köäsen versys",
        "showhideselectedversions": "Ekeuzen versies bekieken/verbargen",
        "editundo": "weaderümmedraien",
-       "diff-empty": "(Gien verschil)",
+       "diff-empty": "(Geen verskil)",
        "diff-multi-sameuser": "({{PLURAL:$1|Eyn tüskenliggende versy|$1 tüskenliggende versys}} döär deselvde gebruker is verbörgen)",
        "diff-multi-otherusers": "({{PLURAL:$1|Eyn tüskenliggende versy|$1 tüskenliggende versys}} döär {{PLURAL:$2|eyn andere gebruker|$2 gebrukers}} neet weadergeaven)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)",
        "notextmatches": "Gien overeenstemming",
        "prevn": "vöärige {{PLURAL:$1|$1}}",
        "nextn": "volgende {{PLURAL:$1|$1}}",
-       "prevn-title": "{{PLURAL:$1|Veurig resultaot|Veurige $1 resultaoten}}",
+       "prevn-title": "{{PLURAL:$1|Vöärig resultaat|Vöärige $1 resultaten}}",
        "nextn-title": "{{PLURAL:$1|Volgend resultaat|Volgende $1 resultaten}}",
        "shown-title": "Låt $1 {{PLURAL:$1|resultaat|resultaten}} per syde seen",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bekyken.",
        "right-sendemail": "Bericht versturen naor aandere gebrukers",
        "newuserlogpage": "Logbook van nye gebrukers",
        "newuserlogpagetext": "Hieronder staon de niej in-eschreven gebrukers",
-       "rightslog": "Gebrukersrechtenlogboek",
+       "rightslog": "Gebrukersrechtenlogbook",
        "rightslogtext": "Dit is n logboek mit veraanderingen van gebrukersrechten",
        "action-read": "disse zied lezen",
        "action-edit": "disse syde bewarken",
        "rcshowhideanons": "$1 anonyme gebrukers",
        "rcshowhideanons-show": "bekyken",
        "rcshowhideanons-hide": "verbargen",
-       "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
+       "rcshowhidepatr": "$1 nåkeaken bewarkingen",
        "rcshowhidepatr-show": "Bekiek",
        "rcshowhidepatr-hide": "Verbarg",
        "rcshowhidemine": "$1 myn bewarkingen",
        "newsectionsummary": "Ny underwarp: /* $1 */",
        "rc-enhanced-expand": "Details bekieken",
        "rc-enhanced-hide": "Details verbargen",
-       "rc-old-title": "oorspronkelik an-emaakt as \"$1\"",
+       "rc-old-title": "oorsprungelik anmaked as \"$1\"",
        "recentchangeslinked": "Soortgelyke wysigingen",
        "recentchangeslinked-feed": "Volg verwysingen",
        "recentchangeslinked-toolbox": "Volg verwysingen",
        "listfiles-summary": "Op disse spesiale zied ku'j alle bestaanden bekieken die lestens op-estuurd bin.",
        "listfiles_search_for": "Zeuk naor bestaand:",
        "imgfile": "bestand",
-       "listfiles": "Bestaandslieste",
+       "listfiles": "Bestandslyste",
        "listfiles_thumb": "Miniatuuraofbeelding",
        "listfiles_date": "Daotum",
        "listfiles_name": "Naam",
        "filehist-datetime": "Dåtum/tyd",
        "filehist-thumb": "Miniatuurafbealding",
        "filehist-thumbtext": "Miniatuurafbealding vöär versy van $1",
-       "filehist-nothumb": "Gien miniatuuraofbeelding",
+       "filehist-nothumb": "Geen miniatuurafbealding",
        "filehist-user": "Gebruker",
        "filehist-dimensions": "Groutde",
        "filehist-filesize": "Bestaandsgrootte",
        "linkstoimage-more": "Meyr as $1 {{PLURAL:$1|syde gebruukt|syden gebruken}} dit bestand.\nDe volgende lyste givt allinnig de {{PLURAL:$1|eyrste syde|eyrste $1 syden}} weader dee dit bestand gebruukt.\nDe [[Special:WhatLinksHere/$2|heyle lyste]] is ouk beskikbår.",
        "nolinkstoimage": "Geen enkele syde gebruukt dit bestand.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Meer verwiezingen]] naor dit bestaand bekieken.",
-       "linkstoimage-redirect": "$1 (bestaandsdeurverwiezing) $2",
+       "linkstoimage-redirect": "$1 (bestandsdöärverwysing) $2",
        "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} gelieke an dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
        "sharedupload": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten.",
        "sharedupload-desc-there": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. Bekiek de [$2 beschrieving van t bestaand] veur meer informasie.",
        "sharedupload-desc-here": "Dit bestand kümt van $1 en kan ouk in andere projekten gebruked weasen. De [$2 syde mid de beskryving van et bestand] steyt hyrunder.",
        "sharedupload-desc-edit": "Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.\nJe kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.",
        "sharedupload-desc-create": "Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.\nJe kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.",
-       "filepage-nofile": "Der besteet gien bestaand mit disse naam.",
+       "filepage-nofile": "Der besteyt geen bestand mid disse name.",
        "filepage-nofile-link": "Der besteet gien bestaand mit disse naam, mer je kunnen t [$1 opsturen].",
        "uploadnewversion-linktext": "n Niejere versie van dit bestaand opsturen.",
        "shared-repo-from": "uut $1",
        "mimesearch-summary": "Op disse spesiale zied kunnen de bestaanden naor t MIME-type efiltreerd wörden. In de invoer mut altied t media- en subtype staon, bieveurbeeld: <code>aofbeelding/jpeg</code>.",
        "mimetype": "MIME-type:",
        "download": "neerlaojen",
-       "unwatchedpages": "Ziejen die niet evolgd wörden",
+       "unwatchedpages": "Syden dee neet volgd wörden",
        "listredirects": "Lieste van deurverwiezingen",
        "listduplicatedfiles": "Lieste mit bestaanden mit duplikaoten",
        "unusedtemplates": "Ongebruukten mallen",
        "randomincategory-nopages": "Der bin gien ziejen in [[:Category:$1]].",
        "randomredirect": "Netzelde welke deurverwiezing",
        "randomredirect-nopages": "Der staon gien deurverwiezingen in de naamruumte \"$1\".",
-       "statistics": "Staotistieken",
+       "statistics": "Ståtistiken",
        "statistics-header-pages": "Ziedstaotistieken",
        "statistics-header-edits": "Bewarkingsstaotistieken",
        "statistics-header-users": "Gebrukerstaotistieken",
        "doubleredirectstext": "Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.\nOp elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelzied van de tweede deurverwiezing.\nMeestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zol mutten liejen.",
        "double-redirect-fixed-move": "[[$1]] is herneumd en is noen n deurverwiezing naor [[$2]]",
        "double-redirect-fixed-maintenance": "Verbeteren van dubbele deurverwiezing van [[$1]] naor [[$2]].",
-       "double-redirect-fixer": "Deurverwiezingsverbeteraar",
+       "double-redirect-fixer": "Döärverwysingsverbeteraar",
        "brokenredirects": "Ebreuken deurverwiezingen",
        "brokenredirectstext": "Disse deurverwiezingen verwiezen naor n niet-bestaonde zied.",
        "brokenredirects-edit": "bewark",
        "withoutinterwiki-summary": "De volgende ziejen verwiezen niet naor versies in n aandere taal.",
        "withoutinterwiki-legend": "Veurvoegsel",
        "withoutinterwiki-submit": "Bekieken",
-       "fewestrevisions": "Artikels mit de minste bewarkingen",
+       "fewestrevisions": "Syden mid de minste bewarkingen",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|kategorie|kategorieën}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwikiverwiezing|interwikiverwiezingen}}",
        "lonelypagestext": "Naor disse ziejen wördt niet verwezen vanuut {{SITENAME}}, en ze bin oek nargens as mal op-eneumen.",
        "uncategorizedpages": "Ziejen zonder kategorie",
        "uncategorizedcategories": "Kategorieën zonder kategorie",
-       "uncategorizedimages": "Bestaanden zonder kategorie",
+       "uncategorizedimages": "Bestanden sunder kategory",
        "uncategorizedtemplates": "Mallen zonder kategorie",
        "unusedcategories": "Ongebruukten kategorieën",
        "unusedimages": "Ongebruukten bestaanden",
        "mostimages": "Meestgebruukten bestaanden",
        "mostinterwikis": "Ziejen mit de meeste interwikiverwiezingen",
        "mostrevisions": "Artikels mit de meeste bewarkingen",
-       "prefixindex": "Alle ziejen op veurvoegsel",
+       "prefixindex": "Alle syden up vöärvoogsel",
        "prefixindex-namespace": "Alle ziejen mit t veurvoegsel (naamruumte $1)",
        "prefixindex-strip": "Veurvoegsel in lieste vortdoon",
        "shortpages": "Korte artikels",
        "protectedpagesempty": "Der bin op t moment gien beveiligden ziejen",
        "protectedtitles": "Ziednamen die beveiligd bin",
        "protectedtitlesempty": "Der bin noen gien titels beveiligd die an disse veurweerden voldoon.",
-       "listusers": "Gebrukerslieste",
+       "listusers": "Gebrukerslyste",
        "listusers-editsonly": "Allinnig gebrukers mit bewarkingen laoten zien",
        "listusers-creationsort": "Sorteren op inschriefdaotum",
        "listusers-desc": "Sorteren in aoflopende volgorde",
        "newpages-username": "Gebrukersnaam:",
        "ancientpages": "Oudste artikels",
        "move": "Hernömen",
-       "movethispage": "Herneum",
+       "movethispage": "Disse syde hernömen",
        "unusedimagestext": "Vergeet niet dat aandere wiki's misschien oek n antal van disse bestaanden gebruken.\n\nDe volgende bestaanden bin op-estuurd mer niet in gebruuk.\nt Kan ween dat der drekt verwezen wörden naor n bestaand.\nn Bestaand kan hier dus verkeerd op-eneumen ween.",
        "unusedcategoriestext": "De onderstaonde kategorieën bin an-emaakt mer bin niet in gebruuk.",
        "notargettitle": "Gien zied op-egeven",
        "booksources-text": "Hieronder steet n lieste mit verwiezingen naor aandere websteeën die nieje of wat ouwere boeken verkopen, en daor hebben ze warschienlik meer informasie over t boek da'j zeuken:",
        "booksources-invalid-isbn": "De op-egeven ISBN klop niet; kiek effen nao o'j gien fout emaakt hebben bie de invoer.",
        "magiclink-tracking-isbn": "Ziejen die magiese ISBN-verwiezingen gebruken",
-       "specialloguserlabel": "Uutvoerende gebruker:",
+       "specialloguserlabel": "Uutvorende gebruker:",
        "speciallogtitlelabel": "Dool (sydname of {{ns:user}}:gebrükersname vöär gebrüker):",
        "log": "Logboken",
        "all-logs-page": "Alle publike logboken",
-       "alllogstext": "Dit is t kombinasielogboek van {{SITENAME}}.\nJe kunnen oek kiezen veur bepaolde logboeken en filteren op gebruker (heufdlettergeveulig) en titel (heufdlettergeveulig).",
-       "logempty": "Der steet gien passende informasie in t logboek.",
+       "alllogstext": "Dit is et kombinatylogbook van {{SITENAME}}.\nJy künnet ouk kesen vöär een bepåld logbooktype, filteren up gebrukersname (höyvdlettergevölig), of sydname (höyvdlettergevölig).",
+       "logempty": "Geen treffers in et logbook.",
        "log-title-wildcard": "Zeuk naor titels die beginnen mit disse tekste:",
        "showhideselectedlogentries": "Ekeuzen logboekregels laoten zien of verbargen",
        "allpages": "Alle syden",
        "allpagesprefix": "Ziejen bekieken die beginnen mit:",
        "allpagesbadtitle": "De op-egeven ziednaam is ongeldig of der steet n interwikiveurvoegsel in. Meugelikerwieze staon der karakters in de naam die niet gebruukt maggen wörden in ziednamen.",
        "allpages-bad-ns": "{{SITENAME}} hef gien \"$1\"-naamruumte.",
-       "allpages-hide-redirects": "Deurverwiezingen verbargen",
+       "allpages-hide-redirects": "Döärverwysingen verbargen",
        "cachedspecial-viewing-cached-ttl": "Je bekieken noen n versie uut t tussengeheugen van disse zied, die hooguut $1 oud is.",
        "cachedspecial-viewing-cached-ts": "Je bekieken noen n versie uut t tussengeheugen van disse zied, t kan ween dat t niet helemaole bie de tied is.",
        "cachedspecial-refresh-now": "Leste bekieken.",
        "deletedcontributions": "Vortedaone gebrukersbiedragen",
        "deletedcontributions-title": "Vortedaone gebrukersbiedragen",
        "sp-deletedcontributions-contribs": "bydragen",
-       "linksearch": "Uutgaonde verwiezingen zeuken",
+       "linksearch": "Uutgånde verwysingen söken",
        "linksearch-pat": "Zeukpetroon:",
        "linksearch-ns": "Naamruumte:",
        "linksearch-ok": "Zeuken",
        "listgrouprights-group": "Groep",
        "listgrouprights-rights": "Rechten",
        "listgrouprights-helppage": "Help:Gebrukersrechten",
-       "listgrouprights-members": "(lejenlieste)",
+       "listgrouprights-members": "(leadenlyste)",
        "listgrouprights-addgroup": "Kan gebrukers bie disse {{PLURAL:$2|groep|groepen}} zetten: $1",
        "listgrouprights-removegroup": "Kan gebrukers uut disse {{PLURAL:$2|groep|groepen}} haolen: $1",
        "listgrouprights-addgroup-all": "Kan gebrukers bie alle groepen zetten",
        "emailsenttext": "Bericht is verstuurd.",
        "emailuserfooter": "Dit bericht is verstuurd deur $1 an $2 deur de funksie \"n Bericht sturen\" van {{SITENAME}} te gebruken.",
        "usermessage-summary": "Systeemteksten achter-eleuten",
-       "usermessage-editor": "Systeemtekste",
-       "watchlist": "Volglieste",
+       "usermessage-editor": "Systeemboudskapper",
+       "watchlist": "Volglyste",
        "mywatchlist": "Volglyste",
-       "watchlistfor2": "Veur $1 ($2)",
+       "watchlistfor2": "Vöär $1 $2",
        "nowatchlist": "Gien artikels in volglieste.",
        "watchlistanontext": "$1 is verplicht um joew volglieste te bekieken of te wiezigen.",
        "watchnologin": "Neet an-emelded",
        "notvisiblerev": "Bewarking is vortedaon",
        "watchlist-details": "Der {{PLURAL:$1|steyt eyn syde|stån $1 syden}} up juw volglyste (plus oaverlegsyden).",
        "wlheader-enotif": "Je kriegen bericht per netpost",
-       "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin staon '''vet'''.",
+       "wlheader-showupdated": "Syden dee sinds juw lätste besöök bewarked binnet stån '''vet''' weadergeaven.",
        "wlnote": "Hyrunder {{PLURAL:$1|steyt de lätste wysiging|stån de lätste <strong>$1</strong> wysigingen}} in {{PLURAL:$2|et vöärbye ure|de vöärbye $2 uren}} vanaf $3 üm $4.",
        "watchlist-submit": "Bekiek",
        "wlshowhideminor": "kleine bewarkingen",
-       "watchlist-options": "Opsies veur de volglieste",
+       "watchlist-options": "Optys vöär de volglyste",
        "watching": "Volg...",
        "unwatching": "Niet volgen...",
        "watcherrortext": "Der is n fout op-etrejen tiejens t wiezigen van joew volgliesinstellingen veur \"$1\".",
-       "enotif_reset": "Markeer alle ziejen as bezöcht.",
+       "enotif_reset": "Markeer alle syden as besöcht.",
        "enotif_impersonal_salutation": "{{SITENAME}}-gebruker",
        "enotif_subject_deleted": "{{SITENAME}}: zied $1 is vortedaon deur {{GENDER:$2|$2}}",
        "enotif_subject_created": "{{SITENAME}}: zied $1 is an-emaakt deur {{GENDER:$2|$2}}",
        "protectlogpage": "Beveiligingslogbook",
        "protectlogtext": "Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en ziejen.\nZie de [[Special:ProtectedPages|lieste mit ziejen die beveiligd bin]] veur t hele overzicht.",
        "protectedarticle": "hevt [[$1]] beveiligd",
-       "modifiedarticleprotection": "beveiligingsnivo van \"[[$1]]\"  ewiezigd",
+       "modifiedarticleprotection": "hevt et beveiligingsnivo van \"[[$1]]\" wysigd",
        "unprotectedarticle": "hef de beveiliging van \"[[$1]]\" deraof ehaold",
        "movedarticleprotection": "hef de beveiligingsinstellingen over-ezet van \"[[$2]]\" naor \"[[$1]]\"",
        "protect-title": "Beveiligingsnivo instellen veur \"$1\"",
        "minimum-size": "Minimumgrootte (bytes)",
        "maximum-size": "Maximumgrootte",
        "pagesize": "(byte)",
-       "restriction-edit": "Bewark",
-       "restriction-move": "Herneum",
+       "restriction-edit": "Bewarken",
+       "restriction-move": "Hernömen",
        "restriction-create": "Upstellen",
        "restriction-upload": "Bestaand opsturen",
        "restriction-level-sysop": "helemaole beveiligd",
        "mycontris": "Bydragen",
        "anoncontribs": "Bydragen",
        "contribsub2": "Vöär {{GENDER:$3|$1}} ($2)",
-       "nocontribs": "Gien wiezigingen evunnen die an de estelde criteria voldoon.",
+       "nocontribs": "Geen wysigingen vünden dee an disse kriteria voldoot.",
        "uctop": "lätste wysiging",
        "month": "Månd:",
        "year": "Vanaf jår (en eyrer):",
        "whatlinkshere-hideredirs": "$1 döärverwysingen",
        "whatlinkshere-hidetrans": "$1 invoogde mallen",
        "whatlinkshere-hidelinks": "$1 verwysingen",
-       "whatlinkshere-hideimages": "$1 holderverwysingen",
+       "whatlinkshere-hideimages": "$1 bestandsverwysingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Automatiese blokkering #$1",
        "block": "Gebruker blokkeren",
        "ipblocklist-submit": "Zeuk",
        "ipblocklist-localblock": "Lokale blokkering",
        "ipblocklist-otherblocks": "Aandere {{PLURAL:$1|blokkering|blokkeringen}}",
-       "infiniteblock": "onbeparkt",
+       "infiniteblock": "unbegrensd",
        "expiringblock": "löp aof op $1 um $2",
        "anononlyblock": "allinnig anoniemen",
        "noautoblockblock": "autoblok niet aktief",
        "blocklog-showlog": "Disse gebruker is al eerder eblokkeerd.\nt Blokkeerlogboek steet hieronder as referensie:",
        "blocklog-showsuppresslog": "Disse gebruker is al eerder eblokkeerd en wele bewarkingen van disse gebruker bin verbörgen.\nt Logboek mit onderdrokten versies steet hieronder as referensie:",
        "blocklogentry": "hevt \"[[$1]]\" blokkeerd mid as vervaltyd $2 $3",
-       "reblock-logentry": "hef de instellingen veur de blokkering van [[$1]] ewiezigd t Löp noen of over $2 $3",
+       "reblock-logentry": "hevt de blokkade-instellingen vöär [[$1]] wysigd mid as vervaldåtum $2 $3",
        "blocklogtext": "Hier zie'j n lieste van de leste blokkeringen en deblokkeringen. Automatiese blokkeringen en deblokkeringen koemen niet in t logboek te staon. Zie de [[Special:BlockList|blokkeerlieste]] veur de lieste van adressen die noen eblokkeerd bin.",
        "unblocklogentry": "blokkering van $1 is op-eheven",
        "block-log-flags-anononly": "allinnig anoniemen",
-       "block-log-flags-nocreate": "anmaken van gebrukersprofielen uutezet",
+       "block-log-flags-nocreate": "anmaken van gebrukerskontos uutsetted",
        "block-log-flags-noautoblock": "autoblokkeren uutezet",
        "block-log-flags-noemail": "t versturen van berichten is eblokkeerd",
        "block-log-flags-nousertalk": "kan zien eigen overlegzied niet bewarken",
        "ipb_blocked_as_range": "Fout: t IP-adres $1 is niet drek eblokkeerd en de blokkering kan niet op-eheven wörden.\nDe blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven kan wörden.",
        "ip_range_invalid": "Ongeldige IP-reeks",
        "ip_range_toolarge": "Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.",
-       "proxyblocker": "Proxyblokker",
+       "proxyblocker": "Proksyblokker",
        "proxyblockreason": "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.",
        "sorbsreason": "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.",
        "sorbs_create_account_reason": "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken.\nJe kunnen gien gebrukerszied anmaken.",
        "import-options-wrong": "Verkeerde {{PLURAL:$2|opsie|opsies}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "De op-egeven baosiszied is ongeldig.",
        "import-rootpage-nosubpage": "In de naamruumte \"$1\" van de baosiszied is t anmaken van onderziejen niet meugelik.",
-       "importlogpage": "Invoerlogboek",
+       "importlogpage": "Importlogbook",
        "importlogpagetext": "Administratieve invoer van ziejen mit geschiedenisse van aandere wiki's.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versie|versies}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} van $2",
        "tooltip-ca-addsection": "Ny underwarp tovogen",
        "tooltip-ca-viewsource": "Disse syde is beveiligd. \nJy künnet wel de bronkode wel bekyken.",
        "tooltip-ca-history": "Oldere versys van disse syde",
-       "tooltip-ca-protect": "Beveilig disse ziede taegen veraanderen",
+       "tooltip-ca-protect": "Disse syde beveiligen",
        "tooltip-ca-unprotect": "De beveiliging vuur disse ziede wiezigen",
-       "tooltip-ca-delete": "Smiet disse ziede vort",
+       "tooltip-ca-delete": "Disse syde vordsmyten",
        "tooltip-ca-undelete": "Haal n inhoald van disse ziede oet n emmer",
        "tooltip-ca-move": "Disse syde hernömen",
        "tooltip-ca-watch": "Voog disse syde to an juw volglyste",
        "tooltip-ca-nstab-special": "Dit is een bysündere syde dee jy neet veranderen künt",
        "tooltip-ca-nstab-project": "Projektsyde bekyken",
        "tooltip-ca-nstab-image": "Låt de bestandssyde seen",
-       "tooltip-ca-nstab-mediawiki": "Loat de systeemtekstbladziede zeen",
+       "tooltip-ca-nstab-mediawiki": "Systeembericht bekyken",
        "tooltip-ca-nstab-template": "Mal bekyken",
        "tooltip-ca-nstab-help": "Loat de hölpbladziede zeen",
        "tooltip-ca-nstab-category": "Låt de kategorysyde seen",
        "pageinfo-title": "Informaty oaver \"$1\"",
        "pageinfo-not-current": "Disse gegevens bin allinnig beschikbaor veur disse versie.",
        "pageinfo-header-basic": "Basisinformaty",
-       "pageinfo-header-edits": "Bewarkingsgeschiedenisse",
+       "pageinfo-header-edits": "Bewarkingsgeskydenisse",
        "pageinfo-header-restrictions": "Sydbeveiliging",
-       "pageinfo-header-properties": "Ziedeigenschappen",
-       "pageinfo-display-title": "Weeregeven ziednaam",
-       "pageinfo-default-sort": "Standard sorteerwieze",
+       "pageinfo-header-properties": "Sydeigenskappen",
+       "pageinfo-display-title": "Weadergeaven sydname",
+       "pageinfo-default-sort": "Standard sorteerwyse",
        "pageinfo-length": "Sydlängde (in bytes)",
-       "pageinfo-article-id": "Zied-ID",
+       "pageinfo-article-id": "Sydnummer",
        "pageinfo-language": "Språke vöär de syde",
-       "pageinfo-content-model": "Ziedinhoudsmodel",
+       "pageinfo-content-model": "Sydinholdsmodel",
        "pageinfo-robot-policy": "Indeksering döär bots",
-       "pageinfo-robot-index": "Toe-estaon",
-       "pageinfo-robot-noindex": "Niet toe-estaon",
+       "pageinfo-robot-index": "Tostån",
+       "pageinfo-robot-noindex": "Neet tostån",
        "pageinfo-watchers": "Antal sydvolgers",
-       "pageinfo-few-watchers": "Minder as {{PLURAL:$1|één volger|$1 volgers}}",
+       "pageinfo-few-watchers": "Minder as {{PLURAL:$1|eyn volger|$1 volgers}}",
        "pageinfo-redirects-name": "Antal döärverwysingen nå disse syde",
-       "pageinfo-subpages-name": "Onderziejen van disse zied",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|deurverwiezing|deurverwiezingen}}; $3 {{PLURAL:$3|niet-deurverwiezing|niet-deurverwiezingen}})",
-       "pageinfo-firstuser": "Gebruker die de zied an-emaakt hef",
-       "pageinfo-firsttime": "Daotum waorop de zied an-emaakt is",
-       "pageinfo-lastuser": "Leste bewarker",
-       "pageinfo-lasttime": "Daotum van leste bewarking",
+       "pageinfo-subpages-name": "Antal deylsyden van disse syde",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|döärverwysing|döärverwysingen}}; $3 {{PLURAL:$3|neet-döärverwysing|neet-döärverwysingen}})",
+       "pageinfo-firstuser": "Gebruker dee de syde upsteld hevt",
+       "pageinfo-firsttime": "Dåtum wårup de syde upsteld is",
+       "pageinfo-lastuser": "Lätste bewarker",
+       "pageinfo-lasttime": "Dåtum lätste bewarking",
        "pageinfo-edits": "Totaal antal bewarkingen",
-       "pageinfo-authors": "Totaal antal verschillende auteurs",
-       "pageinfo-recent-edits": "Antal nieje bewarkingen (in de veurbieje $1).",
-       "pageinfo-recent-authors": "Leste antal van verschillende auteurs",
-       "pageinfo-magic-words": "{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)",
-       "pageinfo-hidden-categories": "Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)",
-       "pageinfo-templates": "{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)",
+       "pageinfo-authors": "Totaal antal verskillende autöörs",
+       "pageinfo-recent-edits": "Antal nye bewarkingen (in de vöärbye $1)",
+       "pageinfo-recent-authors": "Recente autöörs",
+       "pageinfo-magic-words": "{{PLURAL:$1|Magisk woord|Magiske woorden}} ($1)",
+       "pageinfo-hidden-categories": "Verbörgen {{PLURAL:$1|kategory|kategoryen}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Gebrukede mal|Gebrukede mallen}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Zied|Ziejen}} in-evoegd op ($1)",
        "pageinfo-toolboxlink": "Sydgegeavens",
        "pageinfo-redirectsto": "Verwis deur naor",
        "pageinfo-redirectsto-info": "informasie",
-       "pageinfo-contentpage": "Eteld as zied mit inhoud",
+       "pageinfo-contentpage": "Teld as syde mid inhold",
        "pageinfo-contentpage-yes": "Ja",
        "pageinfo-protect-cascading": "Beveiligingen warken vanaof hier deur",
        "pageinfo-protect-cascading-yes": "Ja",
        "markedaspatrollederror-noautopatrol": "Je maggen joew eigen bewarkingen niet op nao-ekeken zetten.",
        "markedaspatrollednotify": "Disse bewarking op $1 is emarkeerd as nao-ekeken.",
        "markedaspatrollederrornotify": "Markeren as nao-ekeken is mislokt.",
-       "patrol-log-page": "Markeerlogboek",
+       "patrol-log-page": "Markeerlogbook",
        "patrol-log-header": "In dit logboek staon de versies die op nao-ekeken ezet bin.",
        "deletedrevision": "Vortedaone ouwe versie $1.",
        "filedeleteerror-short": "Faut by et vordsmyten van bestand: $1",
        "mediawarning": "'''Waorschuwing:''' in dit bestaand zit misschien kodering die slicht is veur t systeem.",
        "imagemaxsize": "Maximale aofmetingen van aofbeeldingen:<br />\n''(veur op de beschrievingszied)''",
        "thumbsize": "Grootte van de miniatuuraofbeelding:",
-       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|zied|ziejen}}",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|syde|syden}}",
        "file-info": "Bestaandsgrootte: $1, MIME-type: $2",
        "file-info-size": "$1 × $2 bealdpunten, bestandsgroutde: $3, MIME-type: $4",
-       "file-info-size-pages": "$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|zied|ziejen}}",
+       "file-info-size-pages": "$1 × $2 bealdpunten, bestandsgroutde: $3, MIME-type: $4, $5 {{PLURAL:$5|syde|syden}}",
        "file-nohires": "Geen hougere resoluty beskikbår.",
        "svg-long-desc": "SVG-bestand, uutgangsgroutde $1 × $2 bealdpunten, bestandsgroutde: $3",
        "svg-long-desc-animated": "Bewegend SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← veurige",
        "imgmultipagenext": "volgende →",
-       "imgmultigo": "Oké",
-       "imgmultigoto": "Gao naor de zied $1",
+       "imgmultigo": "Låt gån!",
+       "imgmultigoto": "Gå nå de syde $1",
        "table_pager_next": "Volgende",
        "table_pager_prev": "Veurige",
        "table_pager_first": "Eerste zied",
        "watchlistedit-raw-added": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} bie edaon:",
        "watchlistedit-raw-removed": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} vortedaon:",
        "watchlistedit-clear-done": "Juw volglyste is eleadigd.",
-       "watchlisttools-clear": "Volglieste leegmaken",
-       "watchlisttools-view": "Wiezigingen bekieken",
-       "watchlisttools-edit": "Volglieste bekieken en bewarken",
-       "watchlisttools-raw": "Volglieste as tekstlieste bewarken",
+       "watchlisttools-clear": "Volglyste leadigen",
+       "watchlisttools-view": "Relevante wysigingen bekyken",
+       "watchlisttools-edit": "Volglyste bekyken en bewarken",
+       "watchlisttools-raw": "Ruwe volglyste bewarken",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|oaverleg]])",
        "duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
        "version": "Versie",
        "version-entrypoints": "Webadressen veur ingangen",
        "version-entrypoints-header-entrypoint": "Ingang",
        "version-entrypoints-header-url": "Webadres",
-       "redirect": "Deurverwiezen op bestaandsnaam, gebrukers-, zied-, versie- of logboekregelnummer",
+       "redirect": "Döärverwysen up bestandsname, gebrukers-, syd-, versy- of logbookregelnummer",
        "redirect-summary": "Disse speciale syde verwist döär nå een bestand (as de bestandsname upgeaven wördt), een syde (as een syd- of versynummer upgeaven wördt), een gebrukerssyde (as et gebrukersnummer upgeaven wördt) of een logbookinskryving (as een logbooknummer upgeaven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Vöärbeald.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] of [[{{#Special:Redirect}}/logid/186]].",
-       "redirect-submit": "Zeuk",
-       "redirect-lookup": "Opzeuken:",
-       "redirect-value": "Weerde:",
+       "redirect-submit": "Söken",
+       "redirect-lookup": "Upsöken:",
+       "redirect-value": "Waerde:",
        "redirect-user": "Gebrukersnummer",
-       "redirect-page": "Syde-ID",
-       "redirect-revision": "Ziedversie",
-       "redirect-file": "Bestaandsnaam",
+       "redirect-page": "Sydnummer",
+       "redirect-revision": "Sydversy",
+       "redirect-file": "Bestandsname",
        "redirect-not-exists": "Weerde niet evunnen",
        "fileduplicatesearch": "Dubbele bestaanden zeuken",
        "fileduplicatesearch-summary": "Dubbele bestaanden zeuken op baosis van de hashweerde.",
        "tags-active-header": "Aktief?",
        "tags-hitcount-header": "Emarkeerde wysigingen",
        "tags-active-yes": "Ja",
-       "tags-active-no": "Nee",
+       "tags-active-no": "Ney",
        "tags-edit": "bewarking",
-       "tags-hitcount": "$1 {{PLURAL:$1|wieziging|wiezigingen}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|wysiging|wysigingen}}",
        "tags-create-submit": "Upstellen",
        "comparepages": "Ziejen vergelieken",
        "compare-page1": "Zied 1",
        "htmlform-chosen-placeholder": "Kies n opsie",
        "logentry-delete-delete": "$1 hevt de syde $3 {{GENDER:$2|vordsmeaten}}",
        "logentry-delete-delete_redir": "$1 hevt de döärverwysing $3 {{GENDER:$2|vordsmeaten}} döär et te oaverskryven",
-       "logentry-delete-restore": "$1 {{GENDER:$2|hevt}} de syde $3 ($4) weaderümmesetted",
+       "logentry-delete-restore": "$1 {{GENDER:$2|hevt}} de syde $3 ($4) weaderümmeplaatsd",
        "logentry-delete-event": "$1 hef de zichtbaorheid van {{PLURAL:$5|n logboekregel|$5 logboekregels}} van $3 {{GENDER:$2|ewiezigd}}: $4",
-       "logentry-delete-revision": "$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 {{GENDER:$2|ewiezigd}}: $4",
+       "logentry-delete-revision": "$1 hevt de sichtbårheid van {{PLURAL:$5|eyn versy|$5 versys}} van de syde $3 {{GENDER:$2|wysigd}}: $4",
        "logentry-delete-event-legacy": "$1 hef de zichtbaorheid van logboekregels van $3 {{GENDER:$2|ewiezigd}}",
        "logentry-delete-revision-legacy": "$1 hef de zichtbaorheid van versies van de zied $3 {{GENDER:$2|ewiezigd}}.",
        "logentry-suppress-delete": "$1 hef de zied $3 {{GENDER:$2|onderdrokt}}",
        "logentry-suppress-revision": "$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 sluuksem {{GENDER:$2|ewiezigd}}: $4",
        "logentry-suppress-event-legacy": "$1 hef de zichtbaorheid van logboekregels van $3 sluuksem {{GENDER:$2|ewiezigd}}",
        "logentry-suppress-revision-legacy": "$1 hef de zichtbaorheid van versies van de zied $3 sluuksem {{GENDER:$2|ewiezigd}}.",
-       "revdelete-content-hid": "inhoud verbörgen",
+       "revdelete-content-hid": "inhold verbörgen",
        "revdelete-summary-hid": "bewarkingssamenvatting verbörgen",
        "revdelete-uname-hid": "gebrukersnaam verbörgen",
        "revdelete-content-unhid": "inhoud zichtbaor emaakt",
        "logentry-newusers-create": "Brukerskonto $1 is {{GENDER:$2|anmaked}}",
        "logentry-newusers-create2": "Gebruker $3 is {{GENDER:$2|an-emaakt}} an-emaakt deur $1",
        "logentry-newusers-byemail": "Gebruker $3 {{GENDER:$2|is}} an-emaakt deur $1 en t wachtwoord is per netpost verstuurd",
-       "logentry-newusers-autocreate": "De gebruker $1 is automaties {{GENDER:$2|an-emaakt}}",
+       "logentry-newusers-autocreate": "De gebrukerskonto $1 is automatisk {{GENDER:$2|anmaked}}",
        "logentry-rights-rights": "$1 {{GENDER:$2|hef}} groepslidmaotschap veur $3 ewiezigd van $4 naor $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hef}} t groepslidmaotschap ewiezigd veur $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automaties bevorderd van $4 tot $5",
        "logentry-upload-upload": "$1 hevt $3 {{GENDER:$2|upladen}}",
-       "logentry-upload-overwrite": "$1 {{GENDER:$2|hef}} n nieje versie van $3 op-elaojen",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|hevt}} een nye versy van $3 upladen",
        "rightsnone": "(gien)",
        "feedback-adding": "Joew kommentaar wörden op de zied ezet...",
        "feedback-bugcheck": "Mooi! Kiek nao of t niet al één van de [$1 bekende problemen] is.",
index 6594f93..aec63e1 100644 (file)
        "perfcached": "Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.",
        "perfcachedts": "Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.",
        "querypage-no-updates": "Deze pagina wordt niet bijgewerkt.\nGegevens op deze pagina worden niet ververst.",
+       "querypage-updates-periodical": "Gegevens op deze pagina worden periodiek bijgewerkt.",
        "viewsource": "Brontekst bekijken",
        "viewsource-title": "Brontekst bekijken van $1",
        "actionthrottled": "Handeling tegengehouden",
index 0642995..3f09c07 100644 (file)
        "botpasswords-label-cancel": "ߊ߬ ߘߐߛߊ߬",
        "botpasswords-label-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
        "botpasswords-label-resetpassword": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "botpasswords-label-grants": "ߓߊ߲߬ߘߊ߬ߡߌ߬ߘߊ߬ ߞߙߍߞߙߍߣߍ߲ ߠߎ߬:",
        "botpasswords-label-grants-column": "ߘߌ߬ߢߍ߬ ߓߘߊ߫ ߞߍ߫",
        "botpasswords-bad-appid": "ߓߏߕ ߕߐ߮  \"$1\" ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫.",
        "botpasswords-insert-failed": "ߓߏߕ ߕߐ߮ ߟߊߘߏ߲߬ߠߌ߲ ߓߘߊ߫ ߗߌߙߏ߲߫  \"$1\" ߊ߬ ߕߎ߲߬ ߓߘߊ߫ ߟߊߘߏ߲߭ ߠߋ߬ ߓߊ߬؟",
        "grant-blockusers": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߓߊ߬ߟߌ ߣߴߊ߬ߟߎ߬ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐߟߌ",
        "grant-createaccount": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߛߌ߲ߘߌ߫",
        "grant-createeditmovepage": "ߞߐߜߍ ߛߌ߲ߘߌ߫߸ ߡߊߦߟߍ߬ߡߊ߲߫߸ ߊ߬ ߣߌ߫ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫",
+       "grant-delete": "ߞߐߜߍ ߟߎ߬ ߖߏ߬ߛߌ߬߸ ߟߢߊ߬ߟߌ ߟߎ߬߸ ߊ߬ ߣߌ߫ ߘߊ߲ߖߐ߫ ߟߊߘߏ߲߬ߣߍ߲",
        "grant-editinterface": "MediaWiki ߕߐ߯ߛߓߍ ߞߣߍ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ ߣߌ߫ ߞߍߦߙߐ ߞߣߍ/ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ JSON",
        "grant-editmycssjs": "ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ CSS/JSON/JavaScript ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-editmyoptions": "ߌ ߟߊ߫ ߟߊ߬ߝߌ߬ߛߦߊ߬ߟߌ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߣߌ߫ JSON ߛߏ߯ߙߏߟߌ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-basic": "ߤߊߞߍ ߓߊߖߎߟߞߊ",
        "grant-viewdeleted": "ߞߐߜߍ ߣߌ߫ ߞߐߕߐ߮ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߦߋ߫",
        "grant-viewmywatchlist": "ߌ ߟߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߦߋ߫",
+       "grant-viewrestrictedlogs": "ߘߊ߲ߖߐ ߜߍ߬ߙߍ߲߬ߘߍ߬ߣߍ߲ ߟߊߘߏ߲߬ߣߍ߲ ߠߎ߬ ߘߐߜߍ߫",
        "newuserlogpage": "ߖߊ߬ߕߋ߬ߘߊ߬ ߓߘߊ߫ ߟߊߞߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬",
        "newuserlogpagetext": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߘߎ߲ߛߓߍ߫ ߛߌ߲ߘߌߣߍ߲ ߘߏ߫ ߟߋ߬ ߦߋ߫ ߣߌ߲߬.",
        "rightslog": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߜߊ߲߬ߞߎ߲߬ ߢߊ߬ ߓߘߍ",
        "rcfilters-liveupdates-button-title-off": "ߡߝߊ߬ߟߋ߲߬ߠߌ߲߬ ߞߎߘߊ߫ ߞߎߘߊ߫ ߟߊߓߊ߯ߙߊ߫ ߊ߬ߟߎ߬ ߞߍߢߊ ߡߊ߬",
        "rcfilters-watchlist-markseen-button": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߓߍ߯ ߣߐ߬ߣߐ߬ ߦߋߣߍ߲ ߘߌ߫",
        "rcfilters-watchlist-edit-watchlist-button": "ߌ ߟߊ߫ ߞߐߜߍ߫ ߡߊߝߟߍߣߍ߲ ߠߎ߬ ߛߙߍߘߍ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "rcfilters-preference-label": "ߡߍ߲ ߠߎ߬ ߕߍ߫ JavaScript ߢߐ߲߯ߕߍߞߣߍ ߏ߬ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫.",
+       "rcfilters-watchlist-preference-label": "ߢߐ߲߯ߕߍߞߣߍ ߡߍ߲ ߕߍ߫ JavaScript ߝߋ߲߫ ߘߌ߫ ߏ߬ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫.",
        "rcfilters-filter-showlinkedfrom-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߦߌ߬ߘߊ߬ ߞߐߜߍ ߟߎ߬ ߘߐ߫ ߡߍ߲ ߠߎ߬ ߜߋ߲߬ߞߘߎ߬ߢߐ߲߰ߦߊ ߝߘߊߣߍ߲߫",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߛߘߌ߬ߜߋ߲ ߝߘߊߣߍ߲߫</strong> ߞߐߜߍ߫ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߠߎ߬ ߟߊ߫.",
        "rcfilters-filter-showlinkedto-label": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߦߌ߬ߘߊ߬ ߞߐߜߍ ߘߐ߫ ߡߍ߲ ߠߎ߬ ߛߘߌ߬ߜߋ߲ ߦߋ߫",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߛߘߌ߬ߜߋ߲ ߦߋ߫</strong> ߞߐߜߍ߫ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߘߐ߫.",
        "rcfilters-target-page-placeholder": "ߞߐߜߍ ߕߐ߮ ߟߊߘߏ߲߬ (ߥߟߊ߫ ߦߌߟߡߊ)",
        "rcfilters-allcontents-label": "ߞߣߐߘߐ ߟߎ߬ ߓߍ߯",
        "rcfilters-alldiscussions-label": "ߘߊߘߐߖߊߥߏ ߟߎ߬ ߓߍ߯",
        "upload": "ߞߐߕߐ߮ ߟߊߦߟߍ",
        "uploadbtn": "ߞߐߕߐ߮ ߟߊߦߟߍ߬",
        "reuploaddesc": "ߟߊ߬ߦߟߍ߬ߟߌ ߘߐߛߊ߬ ߊ߬ ߣߌ߫ ߞߵߌ ߞߐߛߊ߬ߦߌ߬ ߟߊ߬ߦߟߍ߬ߟߌ ߖߙߎߡߎ߲ ߘߐ߫",
+       "upload-tryagain": "ߞߐߕߐ߯ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߞߊ߲߬ߛߓߍߟߌ ߟߊߘߏ߲߬.",
+       "upload-tryagain-nostash": "ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߣߌ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߊ߲߬ߛߓߍߟߌ ߟߎ߬ ߟߊߘߏ߲߬.",
        "uploadnologin": "ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫",
        "uploadnologintext": "ߖߊ߰ߣߌ߲߫ $1 ߞߊ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߦߟߍ߬.",
+       "upload_directory_missing": "ߢߌ߬ߣߊ߬ ߓߘߊ߫ ߞߍ߫ ߟߊ߬ߦߟߍ߬ߟߌ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ($1) ߞߐ߫߸ ߊ߬ ߣߴߊ߬ ߕߍ߫ ߛߐ߲߬ ߛߌ߲ߘߌ߫ ߟߊ߫ ߓߟߐߟߐ ߡߊߛߐߓߊ߮ ߓߟߏ߫.",
+       "upload_directory_read_only": "ߟߊ߬ߦߟߍ߬ߟߌ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ($1) ߕߍ߫ ߛߓߍߕߊ߫ ߘߌ߫ ߓߟߐߟߐ ߡߊߛߐߓߊ߮ ߓߟߏ߫.",
        "uploaderror": "ߟߊ߬ߦߟߍ߬ߟߌ ߝߎ߬ߕߎ߲߬ߕߌ",
        "upload-recreate-warning": "<strong>ߖߊ߬ߛߙߋ߬ߡߊ߬ߟߊ: ߞߐߕߐ߮ ߡߍ߲ ߕߘߍ߬ ߦߋ߫ ߕߐ߮ ߏ߬ ߟߊ߫߸ ߏ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬ ߥߟߊ߫ ߞߵߊ߬ ߛߋ߲߬ߓߐ߫.</strong>\n\nߞߐߜߍ ߣߌ߲߬ ߖߏ߰ߛߌ߬ߟߌ ߣߴߊ߬ ߛߋ߲߬ߓߐ߬ߟߌ ߟߎ߬ ߡߊߛߐߣߍ߲߫ ߦߋ߫ ߦߊ߲߬ ߟߊ߬ߘߐ߰ߦߊ߬ߟߌ ߟߋ߬ ߞߏߛߐ߲߬:",
        "uploadtext": "ߘߎ߰ߟߊ߬ߘߐ߫ ߖߙߎߡߎ߲ ߣߌ߲߬ ߠߊߓߊ߯ߙߊ߫ ߞߊ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߦߟߍ߬.\nߖߐ߲߬ߛߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲߬ ߞߎߘߊ ߟߎ߬ ߦߋ߫ ߥߟߊ߫ ߞߵߊ߬ ߢߌߣߌ߲߫߸ ߕߊ߯ ߓߐ߫  [[Special:FileList|list of uploaded files]]߸ ߞߐߕߐ߯ ߟߊߛߊ߬ߦߌ߲߬ߣߍ߲ ߠߎ߬ ߝߣߊ߫ ߟߊߦߟߍ߬ߣߍ߲߬ ߦߋ߫ [[Special:Log/upload|upload log]] ߘߐ߫߸ ߖߏ߰ߛߌ߬ߟߌ ߦߋ߫ [[Special:Log/delete|deletion log]] ߟߋ߬ ߘߐ߫.\n\nߖߐ߲߬ߛߊ߫ ߞߊ߬ ߞߐߕߐ߮ ߟߊߘߏ߲߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߛߘߌ߬ߜߋ߲ ߖߙߎߡߎ߲ ߢߌ߲߬ ߠߎ߬ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫: \n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> ߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߞߐߕߐ߮ ߦߌߟߡߊ ߘߝߊߣߍ߲ ߠߊߓߊ߯ߙߊ߫.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> ߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ ߂߀߀ ߞߣߍ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߏ߲߬ߘߏ߬ ߞߋߟߋ߲߫ ߘߐ߫ ߣߎߡߊ߲߫ ߝߍ߫ ߓߌߟߊߢߐ߲߮ߡߊ ߘߐ߫߸ alt ߛߓߍߟߌ ߘߌ߫ ߞߊ߲߬ߛߓߍߟߌ ߘߐ߫. \n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> ߛߘߌ߬ߜߋ߲ ߞߎ߲߬ߕߋ߬ߟߋ߲߬ߡߊ ߟߥߊ ߞߐߕߐ߯ ߘߐ߫ ߞߵߊ߬ ߕߘߍ߬ ߞߐߕߐ߮ ߡߊ߫ ߦߋ߫.",
        "illegalfilename": "ߞߟߏ ߘߏ߫ ߦߋ߫ ߞߐߕߐ߮ ߕߐ߮  \"$1\" ߘߐ߫ ߡߍ߲ ߠߊߘߤߊ߬ߣߍ߲߬ ߕߍ߫ ߞߐߜߍ ߞߎ߲߬ߕߐ߰ ߞߏ ߘߐ߫. \nߕߐ߯ ߜߘߍ߫ ߟߊ߫ ߞߐߕߐ߮ ߟߊ߫ ߖߊ߰ߣߌ߲߬ ߞߣߊ߬ ߕߴߊ߬ ߟߊߦߟߍ߬ߟߌ ߡߊߝߍߣߍ߲߫ ߠߊ߫ ߕߎ߲߯.",
        "filename-toolong": "ߞߐߕߐ߮ ߕߐ߮ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ ߝߙߐ߬ߢߐ ߂߀߀ ߞߊ߲߬.",
        "badfilename": "ߞߐߕߐ߮ ߕߐ߮ ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߞߍ߫ \"$1\" ߘߌ߫",
+       "filetype-mime-mismatch": "ߞߐߕߐ߮ ߘߐߥߙߊ߬ߟߌ  \"$1\" ߡߊ߫ ߛߐ߲߬ ߟߊߕߊ߯ߡߊ߫ ߟߊ߫ MIME ߛߎ߯ߦߊ ߖߏ߰ߛߌ߬ߟߌ ߘߐ߫ ߞߐߕߐ߮ ($2) ߞߊ߲߬.",
+       "filetype-badmime": "ߞߐߕߐ߮ ߡߍ߲ ߠߎ߬ ߦߋ߫ MIME ߛߎ߯ߦߊ \"$1\" ߘߌ߫߸ ߏ߬ ߟߎ߬ ߟߊ߫ ߥߟߌ߬ߟߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
+       "filetype-bad-ie-mime": "ߊ߬ ߕߍ߫ ߣߊ߬ ߞߐߕߐ߮ ߣߌ߲߬ ߠߊߦߟߍ߬ ߟߊ߫߸ ߓߊߏ߬ ߓߟߐߟߐ ߛߏ߲߯ߓߊߟߊ߲ ߞߍ߫ ߕߐ߫ ߊ߬ ߖߌ߰ ߟߊ߫  \"$1\" ߟߋ߬ ߘߌ߫߸ ߏ߬ ߡߍ߲ ߠߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߊ߬ ߣߴߊ߬ ߦߋ߫ ߞߐߕߐ߯ ߛߎ߯ߦߊ߫ ߖߎ߮ ߟߋ߬ ߘߌ߫.",
+       "filetype-unwanted-type": "<strong>\"$1\"</strong> ߦߋ߫ ߞߐߕߐ߯ ߛߎ߯ߦߊ߫ ߞߊ߬ߣߌ߲߬ߓߊߟߌ ߟߋ߬ ߘߌ߫.\nߝߌ߬ߛߊ߬ߡߊ߲߬ߕߋ ߟߎ߬ {{PLURAL:|ߞߐߕߐ߮ ߛߎ߯ߦߊ $3 ߦߋ߫|ߞߐߕߐ߮ ߛߎ߮ߦߊ ߟߎ߬ ߦߋ߫}} $2.",
        "filetype-missing": "ߘߐ߬ߝߎ߬ߟߋ߲߬ߠߌ߲߬ߢ ߛߌ߫ߢ ߕߍ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫ (ߦߏ߫ \".jpg\")",
        "empty-file": "ߌ ߣߊ߬ ߞߐߕߐ߮ ߡߍ߲ ߞߙߊߓߊ߫ ߟߊ߫߸ ߊ߬ ߘߐߞߏߟߏ߲ ߠߋ߬ ߕߘߍ߬.",
        "file-too-large": "ߌ ߟߊ߫ ߞߐߕߐ߮ ߞߙߊߓߊߣߍ߲ ߓߏ߲߬ߓߊ߫ ߕߘߍ߬ ߞߏߖߎ߰߹",
        "upload-file-error": "ߞߣߐߟߊߘߐ߫ ߝߎߕߎ߲ߕߌ",
        "upload-misc-error": "ߟߊ߬ߦߟߍ߬ߟߌ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ",
        "upload-misc-error-text": "ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ ߟߊ߬ߦߟߍ߬ߟߌ ߞߎ߲߬ߕߊ߮ ߞߘߐ߫. ߊ߬ ߝߛߍ߬ߝߛߍ߬ߟߌ ߞߍ߫ ߞߵߊ߬ ߟߐ߲߫ ߣߌ߫ URL ߓߍ߲߬ߣߍ߲߬ ߊ߬ ߣߴߊ߬ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߞߣߊ߬ ߕߴߊ߬ ߡߊߝߍߣߍ߲߫ ߣߴߏ߬ ߞߐ߫.\nߣߌ߫ ߝߙߋߞߋ ߘߏ߲߬ ߠߊߝߛߊ߬ ߘߊ߫߸ ߓߌ߬ߟߊ߬ߢߐ߲߰ߡߊ ߢߌߣߌ߲߫ [[Special:ListUsers/sysop|administrator]] ߝߍ߬.",
+       "upload-too-many-redirects": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߦߙߌߞߊߖߊ߲ ߦߋ߫ URL ߘߐ߫ ߞߏߖߎ߰.",
        "upload-http-error": "HTTP ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫: $1",
+       "upload-copy-upload-invalid-domain": "ߟߊ߬ߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߊߓߌߟߊߟߌ ߕߍ߫ ߘߊߞߎ߲ ߣߌ߲߬ ߘߐ߫ ߦߊ߲߬.",
        "upload-dialog-title": "ߞߐߕߐ߮ ߟߊߦߟߍ߬",
        "upload-dialog-button-cancel": "ߊ߬ ߘߐߛߊ߬",
        "upload-dialog-button-back": "ߌ ߞߐߛߊ߬ߦߌ߬",
index 5d631a7..09c1201 100644 (file)
        "policy-url": "Project:Zasady",
        "portal": "Portal społeczności",
        "portal-url": "Project:Portal społeczności",
-       "privacy": "Polityka ochrony prywatności",
+       "privacy": "Polityka prywatności",
        "privacypage": "Project:Polityka ochrony prywatności",
        "badaccess": "Błąd uprawnień",
        "badaccess-group0": "Nie masz uprawnień wymaganych do wykonania tej operacji.",
        "version-poweredby-credits": "Ta wiki korzysta z oprogramowania '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
        "version-poweredby-others": "inni",
        "version-poweredby-translators": "tłumacze translatewiki.net",
+       "version-poweredby-various": "Liczni autorzy",
        "version-credits-summary": "Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.\n\nMediaWiki jest dystrybuowane w nadziei, że okaże się użyteczne ale <em>BEZ JAKIEJKOLWIEK GWARANCJI</em> – nawet bez domyślnej gwarancji <strong>PRZYDATNOŚCI HANDLOWEJ</strong> lub <strong>PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ</strong>. Więcej szczegółów znajdziesz w treści licencji GNU General Public License.\n\nPowinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU General Public License] wraz z niniejszym oprogramowaniem. Jeśli tak się nie stało, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, USA lub [//www.gnu.org/licenses/old-licenses/gpl-2.0.html przeczytaj licencję w Internecie].",
        "version-software": "Zainstalowane oprogramowanie",
index fdd95e8..62c8ef7 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-actor-table.sql
 --
--- T167246. Add an `actor` table and various columns (and temporary tables) to reference it.
+-- T167246. Add an `actor` table.
 
 CREATE TABLE /*_*/actor (
   actor_id bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
@@ -10,48 +10,3 @@ CREATE TABLE /*_*/actor (
 ) /*$wgDBTableOptions*/;
 CREATE UNIQUE INDEX /*i*/actor_user ON /*_*/actor (actor_user);
 CREATE UNIQUE INDEX /*i*/actor_name ON /*_*/actor (actor_name);
-
-CREATE TABLE /*_*/revision_actor_temp (
-  revactor_rev int unsigned NOT NULL,
-  revactor_actor bigint unsigned NOT NULL,
-  revactor_timestamp binary(14) NOT NULL default '',
-  revactor_page int unsigned NOT NULL,
-  PRIMARY KEY (revactor_rev, revactor_actor)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/revactor_rev ON /*_*/revision_actor_temp (revactor_rev);
-CREATE INDEX /*i*/actor_timestamp ON /*_*/revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX /*i*/page_actor_timestamp ON /*_*/revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
-ALTER TABLE /*_*/archive
-  ALTER COLUMN ar_user_text SET DEFAULT '',
-  ADD COLUMN ar_actor bigint unsigned NOT NULL DEFAULT 0 AFTER ar_user_text;
-CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-
-ALTER TABLE /*_*/ipblocks
-  ADD COLUMN ipb_by_actor bigint unsigned NOT NULL DEFAULT 0 AFTER ipb_by_text;
-
-ALTER TABLE /*_*/image
-  ALTER COLUMN img_user_text SET DEFAULT '',
-  ADD COLUMN img_actor bigint unsigned NOT NULL DEFAULT 0 AFTER img_user_text;
-CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor, img_timestamp);
-
-ALTER TABLE /*_*/oldimage
-  ALTER COLUMN oi_user_text SET DEFAULT '',
-  ADD COLUMN oi_actor bigint unsigned NOT NULL DEFAULT 0 AFTER oi_user_text;
-CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
-
-ALTER TABLE /*_*/filearchive
-  ALTER COLUMN fa_user_text SET DEFAULT '',
-  ADD COLUMN fa_actor bigint unsigned NOT NULL DEFAULT 0 AFTER fa_user_text;
-CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
-
-ALTER TABLE /*_*/recentchanges
-  ALTER COLUMN rc_user_text SET DEFAULT '',
-  ADD COLUMN rc_actor bigint unsigned NOT NULL DEFAULT 0 AFTER rc_user_text;
-CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
-CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
-
-ALTER TABLE /*_*/logging
-  ADD COLUMN log_actor bigint unsigned NOT NULL DEFAULT 0 AFTER log_user_text;
-CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
-CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
diff --git a/maintenance/archives/patch-archive-ar_actor.sql b/maintenance/archives/patch-archive-ar_actor.sql
new file mode 100644 (file)
index 0000000..0e5837f
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/archive
+  ALTER COLUMN ar_user_text SET DEFAULT '',
+  ADD COLUMN ar_actor bigint unsigned NOT NULL DEFAULT 0 AFTER ar_user_text;
+CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
diff --git a/maintenance/archives/patch-filearchive-fa_actor.sql b/maintenance/archives/patch-filearchive-fa_actor.sql
new file mode 100644 (file)
index 0000000..c2e879b
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/filearchive
+  ALTER COLUMN fa_user_text SET DEFAULT '',
+  ADD COLUMN fa_actor bigint unsigned NOT NULL DEFAULT 0 AFTER fa_user_text;
+CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
diff --git a/maintenance/archives/patch-image-img_actor.sql b/maintenance/archives/patch-image-img_actor.sql
new file mode 100644 (file)
index 0000000..7042a02
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/image
+  ALTER COLUMN img_user_text SET DEFAULT '',
+  ADD COLUMN img_actor bigint unsigned NOT NULL DEFAULT 0 AFTER img_user_text;
+CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor, img_timestamp);
diff --git a/maintenance/archives/patch-ipblocks-ipb_by_actor.sql b/maintenance/archives/patch-ipblocks-ipb_by_actor.sql
new file mode 100644 (file)
index 0000000..c2c0f8a
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/ipblocks
+  ADD COLUMN ipb_by_actor bigint unsigned NOT NULL DEFAULT 0 AFTER ipb_by_text;
diff --git a/maintenance/archives/patch-logging-log_actor.sql b/maintenance/archives/patch-logging-log_actor.sql
new file mode 100644 (file)
index 0000000..d348698
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/logging
+  ADD COLUMN log_actor bigint unsigned NOT NULL DEFAULT 0 AFTER log_user_text;
+CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
+CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
diff --git a/maintenance/archives/patch-oldimage-oi_actor.sql b/maintenance/archives/patch-oldimage-oi_actor.sql
new file mode 100644 (file)
index 0000000..1fefb7b
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/oldimage
+  ALTER COLUMN oi_user_text SET DEFAULT '',
+  ADD COLUMN oi_actor bigint unsigned NOT NULL DEFAULT 0 AFTER oi_user_text;
+CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
diff --git a/maintenance/archives/patch-recentchanges-rc_actor.sql b/maintenance/archives/patch-recentchanges-rc_actor.sql
new file mode 100644 (file)
index 0000000..70c7b7f
--- /dev/null
@@ -0,0 +1,5 @@
+ALTER TABLE /*_*/recentchanges
+  ALTER COLUMN rc_user_text SET DEFAULT '',
+  ADD COLUMN rc_actor bigint unsigned NOT NULL DEFAULT 0 AFTER rc_user_text;
+CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
+CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
diff --git a/maintenance/archives/patch-revision_actor_temp-table.sql b/maintenance/archives/patch-revision_actor_temp-table.sql
new file mode 100644 (file)
index 0000000..ff08d45
--- /dev/null
@@ -0,0 +1,10 @@
+CREATE TABLE /*_*/revision_actor_temp (
+  revactor_rev int unsigned NOT NULL,
+  revactor_actor bigint unsigned NOT NULL,
+  revactor_timestamp binary(14) NOT NULL default '',
+  revactor_page int unsigned NOT NULL,
+  PRIMARY KEY (revactor_rev, revactor_actor)
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/revactor_rev ON /*_*/revision_actor_temp (revactor_rev);
+CREATE INDEX /*i*/actor_timestamp ON /*_*/revision_actor_temp (revactor_actor,revactor_timestamp);
+CREATE INDEX /*i*/page_actor_timestamp ON /*_*/revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
index d767df0..bb600bf 100644 (file)
@@ -74,10 +74,22 @@ if ( $ext == 'php' ) {
        } else {
                header( "Content-Type: $mime" );
        }
-       header( "Content-Length: " . filesize( $file ) );
-       // Stream that out to the browser
-       $f = fopen( $file, 'rb' );
-       fpassthru( $f );
+
+       $content = file_get_contents( $file );
+
+       header( 'Vary: Accept-Encoding' );
+       $acceptGzip = preg_match( '/\bgzip\b/', $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '' );
+       if ( $acceptGzip &&
+               // Don't compress binary static files (e.g. png)
+               preg_match( '/text|javascript|json|css|xml|svg/', $mime ) &&
+               // Tiny files tend to grow instead of shrink. – <https://gerrit.wikimedia.org/r/537974>
+               strlen( $content ) > 150
+       ) {
+               $content = gzencode( $content, 9 );
+               header( 'Content-Encoding: gzip' );
+       }
+       header( "Content-Length: " . strlen( $content ) );
+       echo $content;
 
        return true;
 }
index 68e5d26..78f990f 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-actor-table.sql
 --
--- T167246. Add an `actor` table and various columns (and temporary tables) to reference it.
+-- T167246. Add an `actor` table.
 
 CREATE SEQUENCE actor_actor_id_seq;
 CREATE TABLE actor (
@@ -11,14 +11,3 @@ CREATE TABLE actor (
 );
 CREATE UNIQUE INDEX actor_user ON actor (actor_user);
 CREATE UNIQUE INDEX actor_name ON actor (actor_name);
-
-CREATE TABLE revision_actor_temp (
-  revactor_rev INTEGER NOT NULL,
-  revactor_actor INTEGER NOT NULL,
-  revactor_timestamp TIMESTAMPTZ  NOT NULL,
-  revactor_page INTEGER          NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-  PRIMARY KEY (revactor_rev, revactor_actor)
-);
-CREATE UNIQUE INDEX revactor_rev ON revision_actor_temp (revactor_rev);
-CREATE INDEX rev_actor_timestamp ON revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX rev_page_actor_timestamp ON revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
diff --git a/maintenance/postgres/archives/patch-revision_actor_temp-table.sql b/maintenance/postgres/archives/patch-revision_actor_temp-table.sql
new file mode 100644 (file)
index 0000000..34cd71c
--- /dev/null
@@ -0,0 +1,10 @@
+CREATE TABLE revision_actor_temp (
+  revactor_rev INTEGER NOT NULL,
+  revactor_actor INTEGER NOT NULL,
+  revactor_timestamp TIMESTAMPTZ  NOT NULL,
+  revactor_page INTEGER          NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  PRIMARY KEY (revactor_rev, revactor_actor)
+);
+CREATE UNIQUE INDEX revactor_rev ON revision_actor_temp (revactor_rev);
+CREATE INDEX rev_actor_timestamp ON revision_actor_temp (revactor_actor,revactor_timestamp);
+CREATE INDEX rev_page_actor_timestamp ON revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
diff --git a/maintenance/sqlite/archives/patch-actor-table.sql b/maintenance/sqlite/archives/patch-actor-table.sql
deleted file mode 100644 (file)
index 8350cfa..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
---
--- patch-actor-table.sql
---
--- T167246. Add an `actor` table and various columns (and temporary tables) to reference it.
--- Sigh, sqlite, such trouble just to change the default value of a column.
-
-CREATE TABLE /*_*/actor (
-  actor_id bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  actor_user int unsigned,
-  actor_name varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/actor_user ON /*_*/actor (actor_user);
-CREATE UNIQUE INDEX /*i*/actor_name ON /*_*/actor (actor_name);
-
-CREATE TABLE /*_*/revision_actor_temp (
-  revactor_rev int unsigned NOT NULL,
-  revactor_actor bigint unsigned NOT NULL,
-  revactor_timestamp binary(14) NOT NULL default '',
-  revactor_page int unsigned NOT NULL,
-  PRIMARY KEY (revactor_rev, revactor_actor)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/revactor_rev ON /*_*/revision_actor_temp (revactor_rev);
-CREATE INDEX /*i*/actor_timestamp ON /*_*/revision_actor_temp (revactor_actor,revactor_timestamp);
-CREATE INDEX /*i*/page_actor_timestamp ON /*_*/revision_actor_temp (revactor_page,revactor_actor,revactor_timestamp);
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/archive_tmp;
-CREATE TABLE /*_*/archive_tmp (
-  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ar_namespace int NOT NULL default 0,
-  ar_title varchar(255) binary NOT NULL default '',
-  ar_comment varbinary(767) NOT NULL default '',
-  ar_comment_id bigint unsigned NOT NULL DEFAULT 0,
-  ar_user int unsigned NOT NULL default 0,
-  ar_user_text varchar(255) binary NOT NULL DEFAULT '',
-  ar_actor bigint unsigned NOT NULL DEFAULT 0,
-  ar_timestamp binary(14) NOT NULL default '',
-  ar_minor_edit tinyint NOT NULL default 0,
-  ar_rev_id int unsigned,
-  ar_text_id int unsigned NOT NULL default 0,
-  ar_deleted tinyint unsigned NOT NULL default 0,
-  ar_len int unsigned,
-  ar_page_id int unsigned,
-  ar_parent_id int unsigned default NULL,
-  ar_sha1 varbinary(32) NOT NULL default '',
-  ar_content_model varbinary(32) DEFAULT NULL,
-  ar_content_format varbinary(64) DEFAULT NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/archive_tmp (
-       ar_id, ar_namespace, ar_title, ar_comment, ar_user, ar_user_text,
-       ar_timestamp, ar_minor_edit, ar_rev_id, ar_text_id, ar_deleted, ar_len,
-       ar_page_id, ar_parent_id, ar_sha1, ar_content_model, ar_content_format)
-  SELECT
-       ar_id, ar_namespace, ar_title, ar_comment, ar_user, ar_user_text,
-       ar_timestamp, ar_minor_edit, ar_rev_id, ar_text_id, ar_deleted, ar_len,
-       ar_page_id, ar_parent_id, ar_sha1, ar_content_model, ar_content_format
-  FROM /*_*/archive;
-
-DROP TABLE /*_*/archive;
-ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
-CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS ipblocks_tmp;
-CREATE TABLE /*_*/ipblocks_tmp (
-  ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ipb_address tinyblob NOT NULL,
-  ipb_user int unsigned NOT NULL default 0,
-  ipb_by int unsigned NOT NULL default 0,
-  ipb_by_text varchar(255) binary NOT NULL default '',
-  ipb_by_actor bigint unsigned NOT NULL DEFAULT 0,
-  ipb_reason varbinary(767) NOT NULL default '',
-  ipb_reason_id bigint unsigned NOT NULL DEFAULT 0,
-  ipb_timestamp binary(14) NOT NULL default '',
-  ipb_auto bool NOT NULL default 0,
-  ipb_anon_only bool NOT NULL default 0,
-  ipb_create_account bool NOT NULL default 1,
-  ipb_enable_autoblock bool NOT NULL default '1',
-  ipb_expiry varbinary(14) NOT NULL default '',
-  ipb_range_start tinyblob NOT NULL,
-  ipb_range_end tinyblob NOT NULL,
-  ipb_deleted bool NOT NULL default 0,
-  ipb_block_email bool NOT NULL default 0,
-  ipb_allow_usertalk bool NOT NULL default 0,
-  ipb_parent_block_id int default NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/ipblocks_tmp (
-       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
-       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
-       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
-       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id)
-  SELECT
-       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
-       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
-       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
-       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id
-  FROM /*_*/ipblocks;
-
-DROP TABLE /*_*/ipblocks;
-ALTER TABLE /*_*/ipblocks_tmp RENAME TO /*_*/ipblocks;
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/image_tmp;
-CREATE TABLE /*_*/image_tmp (
-  img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
-  img_size int unsigned NOT NULL default 0,
-  img_width int NOT NULL default 0,
-  img_height int NOT NULL default 0,
-  img_metadata mediumblob NOT NULL,
-  img_bits int NOT NULL default 0,
-  img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
-  img_minor_mime varbinary(100) NOT NULL default "unknown",
-  img_description varbinary(767) NOT NULL default '',
-  img_description_id bigint unsigned NOT NULL DEFAULT 0,
-  img_user int unsigned NOT NULL default 0,
-  img_user_text varchar(255) binary NOT NULL DEFAULT '',
-  img_actor bigint unsigned NOT NULL DEFAULT 0,
-  img_timestamp varbinary(14) NOT NULL default '',
-  img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/image_tmp (
-       img_name, img_size, img_width, img_height, img_metadata, img_bits,
-       img_media_type, img_major_mime, img_minor_mime, img_description,
-       img_description_id, img_user, img_user_text, img_timestamp, img_sha1)
-  SELECT
-       img_name, img_size, img_width, img_height, img_metadata, img_bits,
-       img_media_type, img_major_mime, img_minor_mime, img_description,
-       img_description_id, img_user, img_user_text, img_timestamp, img_sha1
-  FROM /*_*/image;
-
-DROP TABLE /*_*/image;
-ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
-CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
-CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/oldimage_tmp;
-CREATE TABLE /*_*/oldimage_tmp (
-  oi_name varchar(255) binary NOT NULL default '',
-  oi_archive_name varchar(255) binary NOT NULL default '',
-  oi_size int unsigned NOT NULL default 0,
-  oi_width int NOT NULL default 0,
-  oi_height int NOT NULL default 0,
-  oi_bits int NOT NULL default 0,
-  oi_description varbinary(767) NOT NULL default '',
-  oi_description_id bigint unsigned NOT NULL DEFAULT 0,
-  oi_user int unsigned NOT NULL default 0,
-  oi_user_text varchar(255) binary NOT NULL DEFAULT '',
-  oi_actor bigint unsigned NOT NULL DEFAULT 0,
-  oi_timestamp binary(14) NOT NULL default '',
-  oi_metadata mediumblob NOT NULL,
-  oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
-  oi_minor_mime varbinary(100) NOT NULL default "unknown",
-  oi_deleted tinyint unsigned NOT NULL default 0,
-  oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/oldimage_tmp (
-       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
-       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
-       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1)
-  SELECT
-       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
-       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
-       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1
-  FROM /*_*/oldimage;
-
-DROP TABLE /*_*/oldimage;
-ALTER TABLE /*_*/oldimage_tmp RENAME TO /*_*/oldimage;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
-CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
-
-COMMIT;
-
--- filearchive is done in patch-filearchive-fa_actor.sql
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/logging_tmp;
-CREATE TABLE /*_*/logging_tmp (
-  log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  log_type varbinary(32) NOT NULL default '',
-  log_action varbinary(32) NOT NULL default '',
-  log_timestamp binary(14) NOT NULL default '19700101000000',
-  log_user int unsigned NOT NULL default 0,
-  log_user_text varchar(255) binary NOT NULL default '',
-  log_actor bigint unsigned NOT NULL DEFAULT 0,
-  log_namespace int NOT NULL default 0,
-  log_title varchar(255) binary NOT NULL default '',
-  log_page int unsigned NULL,
-  log_comment varbinary(767) NOT NULL default '',
-  log_comment_id bigint unsigned NOT NULL DEFAULT 0,
-  log_params blob NOT NULL,
-  log_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/logging_tmp (
-       log_id, log_type, log_action, log_timestamp, log_user, log_user_text,
-       log_namespace, log_title, log_page, log_comment, log_comment_id,
-       log_params, log_deleted)
-  SELECT
-       log_id, log_type, log_action, log_timestamp, log_user, log_user_text,
-       log_namespace, log_title, log_page, log_comment, log_comment_id,
-       log_params, log_deleted
-  FROM /*_*/logging;
-
-DROP TABLE /*_*/logging;
-ALTER TABLE /*_*/logging_tmp RENAME TO /*_*/logging;
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
-CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
-CREATE INDEX /*i*/log_type_action ON /*_*/logging (log_type, log_action, log_timestamp);
-CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
-CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/recentchanges_tmp;
-CREATE TABLE /*_*/recentchanges_tmp (
-  rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  rc_timestamp varbinary(14) NOT NULL default '',
-  rc_user int unsigned NOT NULL default 0,
-  rc_user_text varchar(255) binary NOT NULL DEFAULT '',
-  rc_actor bigint unsigned NOT NULL DEFAULT 0,
-  rc_namespace int NOT NULL default 0,
-  rc_title varchar(255) binary NOT NULL default '',
-  rc_comment varbinary(767) NOT NULL default '',
-  rc_comment_id bigint unsigned NOT NULL DEFAULT 0,
-  rc_minor tinyint unsigned NOT NULL default 0,
-  rc_bot tinyint unsigned NOT NULL default 0,
-  rc_new tinyint unsigned NOT NULL default 0,
-  rc_cur_id int unsigned NOT NULL default 0,
-  rc_this_oldid int unsigned NOT NULL default 0,
-  rc_last_oldid int unsigned NOT NULL default 0,
-  rc_type tinyint unsigned NOT NULL default 0,
-  rc_source varchar(16) binary not null default '',
-  rc_patrolled tinyint unsigned NOT NULL default 0,
-  rc_ip varbinary(40) NOT NULL default '',
-  rc_old_len int,
-  rc_new_len int,
-  rc_deleted tinyint unsigned NOT NULL default 0,
-  rc_logid int unsigned NOT NULL default 0,
-  rc_log_type varbinary(255) NULL default NULL,
-  rc_log_action varbinary(255) NULL default NULL,
-  rc_params blob NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/recentchanges_tmp (
-       rc_id, rc_timestamp, rc_user, rc_user_text, rc_namespace, rc_title,
-       rc_comment, rc_comment_id, rc_minor, rc_bot, rc_new, rc_cur_id,
-       rc_this_oldid, rc_last_oldid, rc_type, rc_source, rc_patrolled, rc_ip,
-       rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action,
-       rc_params)
-  SELECT
-       rc_id, rc_timestamp, rc_user, rc_user_text, rc_namespace, rc_title,
-       rc_comment, rc_comment_id, rc_minor, rc_bot, rc_new, rc_cur_id,
-       rc_this_oldid, rc_last_oldid, rc_type, rc_source, rc_patrolled, rc_ip,
-       rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action,
-       rc_params
-  FROM /*_*/recentchanges;
-
-DROP TABLE /*_*/recentchanges;
-ALTER TABLE /*_*/recentchanges_tmp RENAME TO /*_*/recentchanges;
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
-CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
-
-COMMIT;
diff --git a/maintenance/sqlite/archives/patch-archive-ar_actor.sql b/maintenance/sqlite/archives/patch-archive-ar_actor.sql
new file mode 100644 (file)
index 0000000..936e48f
--- /dev/null
@@ -0,0 +1,43 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+CREATE TABLE /*_*/archive_tmp (
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ar_namespace int NOT NULL default 0,
+  ar_title varchar(255) binary NOT NULL default '',
+  ar_comment varbinary(767) NOT NULL default '',
+  ar_comment_id bigint unsigned NOT NULL DEFAULT 0,
+  ar_user int unsigned NOT NULL default 0,
+  ar_user_text varchar(255) binary NOT NULL DEFAULT '',
+  ar_actor bigint unsigned NOT NULL DEFAULT 0,
+  ar_timestamp binary(14) NOT NULL default '',
+  ar_minor_edit tinyint NOT NULL default 0,
+  ar_rev_id int unsigned,
+  ar_text_id int unsigned NOT NULL default 0,
+  ar_deleted tinyint unsigned NOT NULL default 0,
+  ar_len int unsigned,
+  ar_page_id int unsigned,
+  ar_parent_id int unsigned default NULL,
+  ar_sha1 varbinary(32) NOT NULL default '',
+  ar_content_model varbinary(32) DEFAULT NULL,
+  ar_content_format varbinary(64) DEFAULT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+       ar_id, ar_namespace, ar_title, ar_comment, ar_user, ar_user_text,
+       ar_timestamp, ar_minor_edit, ar_rev_id, ar_text_id, ar_deleted, ar_len,
+       ar_page_id, ar_parent_id, ar_sha1, ar_content_model, ar_content_format)
+  SELECT
+       ar_id, ar_namespace, ar_title, ar_comment, ar_user, ar_user_text,
+       ar_timestamp, ar_minor_edit, ar_rev_id, ar_text_id, ar_deleted, ar_len,
+       ar_page_id, ar_parent_id, ar_sha1, ar_content_model, ar_content_format
+  FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-image-img_actor.sql b/maintenance/sqlite/archives/patch-image-img_actor.sql
new file mode 100644 (file)
index 0000000..a2506f6
--- /dev/null
@@ -0,0 +1,43 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/image_tmp;
+CREATE TABLE /*_*/image_tmp (
+  img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
+  img_size int unsigned NOT NULL default 0,
+  img_width int NOT NULL default 0,
+  img_height int NOT NULL default 0,
+  img_metadata mediumblob NOT NULL,
+  img_bits int NOT NULL default 0,
+  img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+  img_minor_mime varbinary(100) NOT NULL default "unknown",
+  img_description varbinary(767) NOT NULL default '',
+  img_description_id bigint unsigned NOT NULL DEFAULT 0,
+  img_user int unsigned NOT NULL default 0,
+  img_user_text varchar(255) binary NOT NULL DEFAULT '',
+  img_actor bigint unsigned NOT NULL DEFAULT 0,
+  img_timestamp varbinary(14) NOT NULL default '',
+  img_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/image_tmp (
+       img_name, img_size, img_width, img_height, img_metadata, img_bits,
+       img_media_type, img_major_mime, img_minor_mime, img_description,
+       img_description_id, img_user, img_user_text, img_timestamp, img_sha1)
+  SELECT
+       img_name, img_size, img_width, img_height, img_metadata, img_bits,
+       img_media_type, img_major_mime, img_minor_mime, img_description,
+       img_description_id, img_user, img_user_text, img_timestamp, img_sha1
+  FROM /*_*/image;
+
+DROP TABLE /*_*/image;
+ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+CREATE INDEX /*i*/img_actor_timestamp ON /*_*/image (img_actor,img_timestamp);
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-ipblocks-ipb_by_actor.sql b/maintenance/sqlite/archives/patch-ipblocks-ipb_by_actor.sql
new file mode 100644 (file)
index 0000000..5bf7c11
--- /dev/null
@@ -0,0 +1,48 @@
+BEGIN;
+
+DROP TABLE IF EXISTS ipblocks_tmp;
+CREATE TABLE /*_*/ipblocks_tmp (
+  ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ipb_address tinyblob NOT NULL,
+  ipb_user int unsigned NOT NULL default 0,
+  ipb_by int unsigned NOT NULL default 0,
+  ipb_by_text varchar(255) binary NOT NULL default '',
+  ipb_by_actor bigint unsigned NOT NULL DEFAULT 0,
+  ipb_reason varbinary(767) NOT NULL default '',
+  ipb_reason_id bigint unsigned NOT NULL DEFAULT 0,
+  ipb_timestamp binary(14) NOT NULL default '',
+  ipb_auto bool NOT NULL default 0,
+  ipb_anon_only bool NOT NULL default 0,
+  ipb_create_account bool NOT NULL default 1,
+  ipb_enable_autoblock bool NOT NULL default '1',
+  ipb_expiry varbinary(14) NOT NULL default '',
+  ipb_range_start tinyblob NOT NULL,
+  ipb_range_end tinyblob NOT NULL,
+  ipb_deleted bool NOT NULL default 0,
+  ipb_block_email bool NOT NULL default 0,
+  ipb_allow_usertalk bool NOT NULL default 0,
+  ipb_parent_block_id int default NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/ipblocks_tmp (
+       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
+       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
+       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
+       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id)
+  SELECT
+       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
+       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
+       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
+       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id
+  FROM /*_*/ipblocks;
+
+DROP TABLE /*_*/ipblocks;
+ALTER TABLE /*_*/ipblocks_tmp RENAME TO /*_*/ipblocks;
+CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
+CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
+CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
+CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
+CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-logging-log_actor.sql b/maintenance/sqlite/archives/patch-logging-log_actor.sql
new file mode 100644 (file)
index 0000000..01f5552
--- /dev/null
@@ -0,0 +1,45 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/logging_tmp;
+CREATE TABLE /*_*/logging_tmp (
+  log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  log_type varbinary(32) NOT NULL default '',
+  log_action varbinary(32) NOT NULL default '',
+  log_timestamp binary(14) NOT NULL default '19700101000000',
+  log_user int unsigned NOT NULL default 0,
+  log_user_text varchar(255) binary NOT NULL default '',
+  log_actor bigint unsigned NOT NULL DEFAULT 0,
+  log_namespace int NOT NULL default 0,
+  log_title varchar(255) binary NOT NULL default '',
+  log_page int unsigned NULL,
+  log_comment varbinary(767) NOT NULL default '',
+  log_comment_id bigint unsigned NOT NULL DEFAULT 0,
+  log_params blob NOT NULL,
+  log_deleted tinyint unsigned NOT NULL default 0
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/logging_tmp (
+       log_id, log_type, log_action, log_timestamp, log_user, log_user_text,
+       log_namespace, log_title, log_page, log_comment, log_comment_id,
+       log_params, log_deleted)
+  SELECT
+       log_id, log_type, log_action, log_timestamp, log_user, log_user_text,
+       log_namespace, log_title, log_page, log_comment, log_comment_id,
+       log_params, log_deleted
+  FROM /*_*/logging;
+
+DROP TABLE /*_*/logging;
+ALTER TABLE /*_*/logging_tmp RENAME TO /*_*/logging;
+CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
+CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
+CREATE INDEX /*i*/actor_time ON /*_*/logging (log_actor, log_timestamp);
+CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
+CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
+CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
+CREATE INDEX /*i*/log_actor_type_time ON /*_*/logging (log_actor, log_type, log_timestamp);
+CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
+CREATE INDEX /*i*/log_type_action ON /*_*/logging (log_type, log_action, log_timestamp);
+CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-oldimage-oi_actor.sql b/maintenance/sqlite/archives/patch-oldimage-oi_actor.sql
new file mode 100644 (file)
index 0000000..ab1b7db
--- /dev/null
@@ -0,0 +1,43 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/oldimage_tmp;
+CREATE TABLE /*_*/oldimage_tmp (
+  oi_name varchar(255) binary NOT NULL default '',
+  oi_archive_name varchar(255) binary NOT NULL default '',
+  oi_size int unsigned NOT NULL default 0,
+  oi_width int NOT NULL default 0,
+  oi_height int NOT NULL default 0,
+  oi_bits int NOT NULL default 0,
+  oi_description varbinary(767) NOT NULL default '',
+  oi_description_id bigint unsigned NOT NULL DEFAULT 0,
+  oi_user int unsigned NOT NULL default 0,
+  oi_user_text varchar(255) binary NOT NULL DEFAULT '',
+  oi_actor bigint unsigned NOT NULL DEFAULT 0,
+  oi_timestamp binary(14) NOT NULL default '',
+  oi_metadata mediumblob NOT NULL,
+  oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+  oi_minor_mime varbinary(100) NOT NULL default "unknown",
+  oi_deleted tinyint unsigned NOT NULL default 0,
+  oi_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/oldimage_tmp (
+       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
+       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
+       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1)
+  SELECT
+       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
+       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
+       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1
+  FROM /*_*/oldimage;
+
+DROP TABLE /*_*/oldimage;
+ALTER TABLE /*_*/oldimage_tmp RENAME TO /*_*/oldimage;
+CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
+CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
+CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
+CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-recentchanges-rc_actor.sql b/maintenance/sqlite/archives/patch-recentchanges-rc_actor.sql
new file mode 100644 (file)
index 0000000..079dac2
--- /dev/null
@@ -0,0 +1,61 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/recentchanges_tmp;
+CREATE TABLE /*_*/recentchanges_tmp (
+  rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  rc_timestamp varbinary(14) NOT NULL default '',
+  rc_user int unsigned NOT NULL default 0,
+  rc_user_text varchar(255) binary NOT NULL DEFAULT '',
+  rc_actor bigint unsigned NOT NULL DEFAULT 0,
+  rc_namespace int NOT NULL default 0,
+  rc_title varchar(255) binary NOT NULL default '',
+  rc_comment varbinary(767) NOT NULL default '',
+  rc_comment_id bigint unsigned NOT NULL DEFAULT 0,
+  rc_minor tinyint unsigned NOT NULL default 0,
+  rc_bot tinyint unsigned NOT NULL default 0,
+  rc_new tinyint unsigned NOT NULL default 0,
+  rc_cur_id int unsigned NOT NULL default 0,
+  rc_this_oldid int unsigned NOT NULL default 0,
+  rc_last_oldid int unsigned NOT NULL default 0,
+  rc_type tinyint unsigned NOT NULL default 0,
+  rc_source varchar(16) binary not null default '',
+  rc_patrolled tinyint unsigned NOT NULL default 0,
+  rc_ip varbinary(40) NOT NULL default '',
+  rc_old_len int,
+  rc_new_len int,
+  rc_deleted tinyint unsigned NOT NULL default 0,
+  rc_logid int unsigned NOT NULL default 0,
+  rc_log_type varbinary(255) NULL default NULL,
+  rc_log_action varbinary(255) NULL default NULL,
+  rc_params blob NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/recentchanges_tmp (
+       rc_id, rc_timestamp, rc_user, rc_user_text, rc_namespace, rc_title,
+       rc_comment, rc_comment_id, rc_minor, rc_bot, rc_new, rc_cur_id,
+       rc_this_oldid, rc_last_oldid, rc_type, rc_source, rc_patrolled, rc_ip,
+       rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action,
+       rc_params)
+  SELECT
+       rc_id, rc_timestamp, rc_user, rc_user_text, rc_namespace, rc_title,
+       rc_comment, rc_comment_id, rc_minor, rc_bot, rc_new, rc_cur_id,
+       rc_this_oldid, rc_last_oldid, rc_type, rc_source, rc_patrolled, rc_ip,
+       rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action,
+       rc_params
+  FROM /*_*/recentchanges;
+
+DROP TABLE /*_*/recentchanges;
+ALTER TABLE /*_*/recentchanges_tmp RENAME TO /*_*/recentchanges;
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_ns_actor ON /*_*/recentchanges (rc_namespace, rc_actor);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
+CREATE INDEX /*i*/rc_actor ON /*_*/recentchanges (rc_actor, rc_timestamp);
+CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
+
+COMMIT;
+
index 0b49359..5f89276 100644 (file)
@@ -3,47 +3,63 @@
   "lockfileVersion": 1,
   "dependencies": {
     "@babel/code-frame": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
-      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
       "dev": true,
       "requires": {
         "@babel/highlight": "^7.0.0"
       }
     },
     "@babel/core": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
-      "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.4.4",
-        "@babel/helpers": "^7.4.4",
-        "@babel/parser": "^7.4.5",
-        "@babel/template": "^7.4.4",
-        "@babel/traverse": "^7.4.5",
-        "@babel/types": "^7.4.4",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz",
+      "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "@babel/generator": "^7.6.2",
+        "@babel/helpers": "^7.6.2",
+        "@babel/parser": "^7.6.2",
+        "@babel/template": "^7.6.0",
+        "@babel/traverse": "^7.6.2",
+        "@babel/types": "^7.6.0",
         "convert-source-map": "^1.1.0",
         "debug": "^4.1.0",
         "json5": "^2.1.0",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.13",
         "resolve": "^1.3.2",
         "semver": "^5.4.1",
         "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
     "@babel/generator": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
-      "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz",
+      "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.4.4",
+        "@babel/types": "^7.6.0",
         "jsesc": "^2.5.1",
-        "lodash": "^4.17.11",
-        "source-map": "^0.5.0",
-        "trim-right": "^1.0.1"
+        "lodash": "^4.17.13",
+        "source-map": "^0.5.0"
       }
     },
     "@babel/helper-function-name": {
       }
     },
     "@babel/helpers": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz",
-      "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz",
+      "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.4.4",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/template": "^7.6.0",
+        "@babel/traverse": "^7.6.2",
+        "@babel/types": "^7.6.0"
       }
     },
     "@babel/highlight": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
-      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.0",
       }
     },
     "@babel/parser": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
-      "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz",
+      "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==",
       "dev": true
     },
     "@babel/template": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
-      "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
+      "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/parser": "^7.6.0",
+        "@babel/types": "^7.6.0"
       }
     },
     "@babel/traverse": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
-      "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
+      "version": "7.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz",
+      "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.4.4",
+        "@babel/code-frame": "^7.5.5",
+        "@babel/generator": "^7.6.2",
         "@babel/helper-function-name": "^7.1.0",
         "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/parser": "^7.4.5",
-        "@babel/types": "^7.4.4",
+        "@babel/parser": "^7.6.2",
+        "@babel/types": "^7.6.0",
         "debug": "^4.1.0",
         "globals": "^11.1.0",
-        "lodash": "^4.17.11"
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
     "@babel/types": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
-      "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
+      "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
       "dev": true,
       "requires": {
         "esutils": "^2.0.2",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.13",
         "to-fast-properties": "^2.0.0"
       }
     },
       "dev": true
     },
     "@types/node": {
-      "version": "12.0.7",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.7.tgz",
-      "integrity": "sha512-1YKeT4JitGgE4SOzyB9eMwO0nGVNkNEsm9qlIt1Lqm/tG2QEiSMTD4kS3aO6L+w5SClLVxALmIBESK6Mk5wX0A==",
+      "version": "12.7.8",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.8.tgz",
+      "integrity": "sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==",
       "dev": true
     },
     "@types/q": {
         "@types/unist": "*"
       }
     },
+    "@wdio/cli": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-5.13.2.tgz",
+      "integrity": "sha512-2vGm/QH+n//Nc87De6UO8BwlfvC4GqvW0HJc/eah2010ZpYvD5kmR6oDDouNDsBTAXMFQlyC/q9yHxexraCv+Q==",
+      "dev": true,
+      "requires": {
+        "@wdio/config": "5.13.2",
+        "@wdio/logger": "5.13.2",
+        "@wdio/utils": "5.13.2",
+        "async-exit-hook": "^2.0.1",
+        "chalk": "^2.3.2",
+        "chokidar": "^3.0.0",
+        "cli-spinners": "^2.1.0",
+        "ejs": "^2.5.7",
+        "fs-extra": "^8.0.1",
+        "inquirer": "^7.0.0",
+        "lodash.flattendeep": "^4.4.0",
+        "lodash.pickby": "^4.6.0",
+        "lodash.union": "^4.6.0",
+        "log-update": "^3.2.0",
+        "webdriverio": "5.13.2",
+        "yargs": "^14.0.0",
+        "yarn-install": "^1.0.0"
+      }
+    },
+    "@wdio/config": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/config/-/config-5.13.2.tgz",
+      "integrity": "sha512-TbkcAcVlEZ5l08jFO6QGKQNB/Lo8SYmQyNYhnA4MxFnhEboOgZamR+kpSN7H0oOt9Q6/pGoFP2Q1NOCxoYrlsQ==",
+      "dev": true,
+      "requires": {
+        "@wdio/logger": "5.13.2",
+        "deepmerge": "^4.0.0",
+        "glob": "^7.1.2"
+      }
+    },
+    "@wdio/devtools-service": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/devtools-service/-/devtools-service-5.13.2.tgz",
+      "integrity": "sha512-Q9e9q82mGfMyF33q6UF3HowuHCshlyfhfLnRqNijWE9io5nGhzQ/9Ep/xVahr4k0PCpTojrlIATwWdafAVTziw==",
+      "dev": true,
+      "requires": {
+        "@wdio/logger": "5.13.2",
+        "chrome-remote-interface": "^0.28.0",
+        "core-js": "~3.2.0",
+        "lighthouse": "^5.1.0",
+        "puppeteer-core": "^1.15.0",
+        "speedline": "^1.4.1",
+        "stable": "^0.1.8",
+        "weighted-mean": "^1.0.2"
+      }
+    },
+    "@wdio/dot-reporter": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/dot-reporter/-/dot-reporter-5.13.2.tgz",
+      "integrity": "sha512-BeyWBigwsn02xzMtEZkPFKb9skBZcfazPWW42PuMIp6N6yde8HAMeyihJ//ms+ouz5lzJ3vZ4/RmSR2LMXr0Qw==",
+      "dev": true,
+      "requires": {
+        "@wdio/reporter": "5.13.2",
+        "chalk": "^2.3.0"
+      }
+    },
+    "@wdio/junit-reporter": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/junit-reporter/-/junit-reporter-5.13.2.tgz",
+      "integrity": "sha512-iRvQcF7Y0Iu2qFxNPmoxPeGoPIwK8j8xGHlqj6Fgrcs6qn12w1kGqc6bly5OHOACzFWwZNCr5tHrUxe3dQEu0Q==",
+      "dev": true,
+      "requires": {
+        "@wdio/reporter": "5.13.2",
+        "json-stringify-safe": "^5.0.1",
+        "junit-report-builder": "^1.3.0",
+        "validator": "^11.0.0"
+      }
+    },
+    "@wdio/local-runner": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-5.13.2.tgz",
+      "integrity": "sha512-1w+hR1ZsaBWEDQqUeTHbKpYX3HxYPKkCnCBmcLjUPq9Na/TeCXkRuoRoIn0MV7RhcLbbrZdeaRZTW7Ttn4SUEw==",
+      "dev": true,
+      "requires": {
+        "@wdio/logger": "5.13.2",
+        "@wdio/repl": "5.13.2",
+        "@wdio/runner": "5.13.2",
+        "async-exit-hook": "^2.0.1",
+        "stream-buffers": "^3.0.2"
+      }
+    },
+    "@wdio/logger": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-5.13.2.tgz",
+      "integrity": "sha512-F8NlP+AoN0zKv8+0iDAJxdbb488kk5LlPA6U6XPgTT/1xxPgpM4MVQoiCGtLOU9UNPX9XLfgoCXyYWMxp96Ncg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "loglevel": "^1.6.0",
+        "loglevel-plugin-prefix": "^0.8.4",
+        "strip-ansi": "^5.2.0"
+      }
+    },
+    "@wdio/mocha-framework": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-5.13.2.tgz",
+      "integrity": "sha512-R/i8M+4aXf3NIAwoIgY5p2uiAEDc447gnEvkwCWW9+EVNAZNLm1n+UgTaNjHFNBByFhgKyPAJZb2CpuBIjxKew==",
+      "dev": true,
+      "requires": {
+        "@wdio/config": "5.13.2",
+        "@wdio/logger": "5.13.2",
+        "mocha": "^6.1.0"
+      }
+    },
+    "@wdio/protocols": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-5.13.2.tgz",
+      "integrity": "sha512-R6QJaa8gSew50LWrGcy/kO01xzDx4fpSoX25GYvLc/Q7gEYyDwdfiB7vIPWnKR7pHjBujNDt100ACSA3Aen/gw==",
+      "dev": true
+    },
+    "@wdio/repl": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-5.13.2.tgz",
+      "integrity": "sha512-mNGj+UcodJTQa4Ecb30iItdcRHrB7GhC+DT0+/J/cO2MQPIf3ZlcpsBGTXZL8ZHcpOUYm0nLt2vKchdRPGVRtw==",
+      "dev": true,
+      "requires": {
+        "@wdio/config": "5.13.2"
+      }
+    },
+    "@wdio/reporter": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-5.13.2.tgz",
+      "integrity": "sha512-oHKlsNw1vcw6k7HZvww3hhmyuDpBrlSK7mneHkqv/hg/oOnsDDxbY3RZzyquni+ZVMUHnnlQ/8YxforVMCt1aA==",
+      "dev": true,
+      "requires": {
+        "fs-extra": "^8.0.1"
+      }
+    },
+    "@wdio/runner": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-5.13.2.tgz",
+      "integrity": "sha512-9X7krISsMJI3nk7zJQ+3OVSJAl4DL3Z2bwQNNhAK8O+HsI361gPk1UGBRFlWoFZ0plQt5okVF8KJYblV90BMyg==",
+      "dev": true,
+      "requires": {
+        "@wdio/config": "5.13.2",
+        "@wdio/logger": "5.13.2",
+        "@wdio/utils": "5.13.2",
+        "deepmerge": "^4.0.0",
+        "gaze": "^1.1.2",
+        "webdriverio": "5.13.2"
+      }
+    },
+    "@wdio/sauce-service": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-5.13.2.tgz",
+      "integrity": "sha512-JfHO27nyMFV4g3UQzcNRdLcwc400E6/Fql5DJnZYL52zinL2xkC/uNRLiQ3tu0psy986gxI+zlywkzmr/vEQzA==",
+      "dev": true,
+      "requires": {
+        "@wdio/logger": "5.13.2",
+        "sauce-connect-launcher": "^1.2.3",
+        "saucelabs": "^2.1.4"
+      }
+    },
+    "@wdio/sync": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/sync/-/sync-5.13.2.tgz",
+      "integrity": "sha512-3XMoSqQoudlKdSXUwVn2Gau6TlvDppVh6Vvxxlz8Id1/vmvWg0izwE+W4TlnoCiNeCtjLr2IpOXoJtKtUqeOJQ==",
+      "dev": true,
+      "requires": {
+        "@wdio/config": "5.13.2",
+        "@wdio/logger": "5.13.2",
+        "@wdio/utils": "5.13.2",
+        "fibers": "^4.0.1",
+        "fibers_node_v8": "^3.1.2"
+      }
+    },
+    "@wdio/utils": {
+      "version": "5.13.2",
+      "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-5.13.2.tgz",
+      "integrity": "sha512-DGwoZZKpGo6BkLOIXnBHu+9mg0RABq0Sh9cb1GLOAeBeIEW7efCDYqT9+rczEJSgHKnKJra1+T8I4IfoxyUX/w==",
+      "dev": true,
+      "requires": {
+        "@wdio/logger": "5.13.2",
+        "deepmerge": "^4.0.0"
+      }
+    },
+    "JSV": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
+      "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
+      "dev": true
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
       "requires": {
         "mime-types": "~2.1.24",
         "negotiator": "0.6.2"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "1.40.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
-          "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
-          "dev": true
-        },
-        "mime-types": {
-          "version": "2.1.24",
-          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
-          "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
-          "dev": true,
-          "requires": {
-            "mime-db": "1.40.0"
-          }
-        }
       }
     },
     "acorn": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
-      "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
+      "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
       "dev": true
     },
     "acorn-jsx": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
-      "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz",
+      "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==",
       "dev": true
     },
     "adm-zip": {
       }
     },
     "ajv": {
-      "version": "6.10.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
-      "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+      "version": "6.10.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "uri-js": "^4.2.2"
       }
     },
-    "ansi-escapes": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
-      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+    "ansi-align": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+      "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+      "dev": true,
+      "requires": {
+        "string-width": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "ansi-colors": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
       "dev": true
     },
+    "ansi-escapes": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+      "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.5.2"
+      }
+    },
     "ansi-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
       "dev": true
     },
     "ansi-styles": {
       }
     },
     "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz",
+      "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==",
       "dev": true,
       "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-          "dev": true,
-          "requires": {
-            "remove-trailing-separator": "^1.0.1"
-          }
-        }
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       }
     },
     "archiver": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
-      "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz",
+      "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==",
       "dev": true,
       "requires": {
-        "archiver-utils": "^1.3.0",
-        "async": "^2.0.0",
+        "archiver-utils": "^2.1.0",
+        "async": "^2.6.3",
         "buffer-crc32": "^0.2.1",
-        "glob": "^7.0.0",
-        "lodash": "^4.8.0",
-        "readable-stream": "^2.0.0",
-        "tar-stream": "^1.5.0",
-        "zip-stream": "^1.2.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
-          "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.11"
-          }
-        }
+        "glob": "^7.1.4",
+        "readable-stream": "^3.4.0",
+        "tar-stream": "^2.1.0",
+        "zip-stream": "^2.1.2"
       }
     },
     "archiver-utils": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
-      "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
       "dev": true,
       "requires": {
-        "glob": "^7.0.0",
-        "graceful-fs": "^4.1.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
         "lazystream": "^1.0.0",
-        "lodash": "^4.8.0",
-        "normalize-path": "^2.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
         "readable-stream": "^2.0.0"
       },
       "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "remove-trailing-separator": "^1.0.1"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         }
       }
       "dev": true
     },
     "async": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-      "dev": true
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.14"
+      }
     },
     "async-each": {
       "version": "1.0.3",
       "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
       "dev": true
     },
+    "async-exit-hook": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+      "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+      "dev": true
+    },
     "async-limiter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
-      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
       "dev": true
     },
     "asynckit": {
       "dev": true
     },
     "autoprefixer": {
-      "version": "9.6.0",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz",
-      "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==",
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
+      "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.1",
-        "caniuse-lite": "^1.0.30000971",
+        "browserslist": "^4.6.3",
+        "caniuse-lite": "^1.0.30000980",
         "chalk": "^2.4.2",
         "normalize-range": "^0.1.2",
         "num2fraction": "^1.2.2",
-        "postcss": "^7.0.16",
-        "postcss-value-parser": "^3.3.1"
+        "postcss": "^7.0.17",
+        "postcss-value-parser": "^4.0.0"
       },
       "dependencies": {
         "postcss": {
-          "version": "7.0.17",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz",
-          "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==",
+          "version": "7.0.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz",
+          "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==",
           "dev": true,
           "requires": {
             "chalk": "^2.4.2",
             "supports-color": "^6.1.0"
           }
         },
+        "postcss-value-parser": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
+          "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
       "dev": true
     },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+    "axe-core": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.3.0.tgz",
+      "integrity": "sha512-54XaTd2VB7A6iBnXMUG2LnBOI7aRbnrVxC5Tz+rVUwYl9MX/cIJc/Ll32YUoFIE/e9UKWMZoQenQu9dFrQyZCg==",
+      "dev": true
+    },
+    "babar": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/babar/-/babar-0.2.0.tgz",
+      "integrity": "sha512-bH01czBTWEbf7Q6qje/4raQEG14jhPTQJmpj1Uxzw92VCr9yQcCWN+SbKTg34aOvWDs6wrhjfr6SGC8AaeSzaA==",
       "dev": true,
       "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
+        "colors": "~0.6.2"
       }
     },
     "backo2": {
       "dev": true
     },
     "base64-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
-      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
       "dev": true
     },
     "base64id": {
       }
     },
     "binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
+      "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
       "dev": true
     },
     "bl": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
-      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz",
+      "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==",
       "dev": true,
       "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
+        "readable-stream": "^3.0.1"
       }
     },
     "blob": {
       "dev": true
     },
     "bluebird": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
-      "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
+      "version": "3.5.5",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
+      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
       "dev": true
     },
     "body": {
           "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
           "dev": true
         },
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
           "dev": true
         },
         "raw-body": {
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
       "dev": true
     },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+    "boxen": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+      "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
       "dev": true,
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
+        "ansi-align": "^2.0.0",
+        "camelcase": "^4.0.0",
+        "chalk": "^2.0.1",
+        "cli-boxes": "^1.0.0",
+        "string-width": "^2.0.0",
+        "term-size": "^1.2.0",
+        "widest-line": "^2.0.0"
       },
       "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "browser-stdout": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
       "dev": true
     },
     "browserslist": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.2.tgz",
-      "integrity": "sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q==",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
+      "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30000974",
-        "electron-to-chromium": "^1.3.150",
-        "node-releases": "^1.1.23"
+        "caniuse-lite": "^1.0.30000989",
+        "electron-to-chromium": "^1.3.247",
+        "node-releases": "^1.1.29"
       }
     },
     "buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
-      "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
+      "version": "5.4.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
+      "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
       "dev": true,
       "requires": {
         "base64-js": "^1.0.2",
       "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
       "dev": true
     },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "dev": true
+    },
     "bytes": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
       "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
       "dev": true
     },
+    "cac": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz",
+      "integrity": "sha1-bSTO7Dcu/lybeYgIvH9JtHJCpO8=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "^3.0.0",
+        "chalk": "^1.1.3",
+        "indent-string": "^3.0.0",
+        "minimist": "^1.2.0",
+        "read-pkg-up": "^1.0.1",
+        "suffix": "^0.1.0",
+        "text-table": "^0.2.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
     "cache-base": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
       "dev": true
     },
     "callsites": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz",
-      "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true
     },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "^2.2.0",
+        "upper-case": "^1.1.1"
+      }
+    },
     "camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
       "dev": true
     },
     "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz",
+      "integrity": "sha1-/AxsNgNj9zd+N5O5oWvM8QcMHKQ=",
       "dev": true,
       "requires": {
-        "camelcase": "^2.0.0",
+        "camelcase": "^3.0.0",
         "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        }
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30000974",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz",
-      "integrity": "sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww==",
+      "version": "1.0.30000997",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000997.tgz",
+      "integrity": "sha512-BQLFPIdj2ntgBNWp9Q64LGUIEmvhKkzzHhUHR3CD5A9Lb7ZKF20/+sgadhFap69lk5XmK1fTUleDclaRFvgVUA==",
+      "dev": true
+    },
+    "canonicalize": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.1.tgz",
+      "integrity": "sha512-N3cmB3QLhS5TJ5smKFf1w42rJXWe6C1qP01z4dxJiI5v269buii4fLHWETDyf7yEd0azGLNC63VxNMiPd2u0Cg==",
+      "dev": true
+    },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
       "dev": true
     },
     "caseless": {
         "supports-color": "^5.3.0"
       }
     },
+    "change-case": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz",
+      "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==",
+      "dev": true,
+      "requires": {
+        "camel-case": "^3.0.0",
+        "constant-case": "^2.0.0",
+        "dot-case": "^2.1.0",
+        "header-case": "^1.0.0",
+        "is-lower-case": "^1.1.0",
+        "is-upper-case": "^1.1.0",
+        "lower-case": "^1.1.1",
+        "lower-case-first": "^1.0.0",
+        "no-case": "^2.3.2",
+        "param-case": "^2.1.0",
+        "pascal-case": "^2.0.0",
+        "path-case": "^2.1.0",
+        "sentence-case": "^2.1.0",
+        "snake-case": "^2.1.0",
+        "swap-case": "^1.1.0",
+        "title-case": "^2.1.0",
+        "upper-case": "^1.1.1",
+        "upper-case-first": "^1.1.0"
+      }
+    },
     "character-entities": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz",
       "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
       "dev": true
     },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+      "dev": true
+    },
     "chokidar": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz",
-      "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.1.tgz",
+      "integrity": "sha512-df4o16uZmMHzVQwECZRHwfguOt5ixpuQVaZHjYMvYisgKhE+JXwcj/Tcr3+3bu/XeOJQ9ycYmzu7Mv8XrGxJDQ==",
       "dev": true,
       "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "fsevents": "^1.2.7",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
+        "anymatch": "^3.1.0",
+        "braces": "^3.0.2",
+        "fsevents": "^2.0.6",
+        "glob-parent": "^5.0.0",
+        "is-binary-path": "^2.1.0",
+        "is-glob": "^4.0.1",
         "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
+        "readdirp": "^3.1.1"
+      }
+    },
+    "chrome-launcher": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.11.2.tgz",
+      "integrity": "sha512-jx0kJDCXdB2ARcDMwNCtrf04oY1Up4rOmVu+fqJ5MTPOOIG8EhRcEU9NZfXZc6dMw9FU8o1r21PNp8V2M0zQ+g==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "is-wsl": "^2.1.0",
+        "lighthouse-logger": "^1.0.0",
+        "mkdirp": "0.5.1",
+        "rimraf": "^2.6.1"
+      }
+    },
+    "chrome-remote-interface": {
+      "version": "0.28.0",
+      "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.28.0.tgz",
+      "integrity": "sha512-md2qSn6rc/fADlN+Blk2UWNg0SGPYjH2s68piaPN9e62HItKm6uWeXXHh0+28Bq10oaWw8fzNAm1itDFJ+nS4w==",
+      "dev": true,
+      "requires": {
+        "commander": "2.11.x",
+        "ws": "^6.1.0"
+      }
+    },
+    "chromedriver": {
+      "version": "73.0.0",
+      "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-73.0.0.tgz",
+      "integrity": "sha512-RnZOTgAa3prPmA1QDHtrsEhppDGiosND5O/0ukWwGuU+EglCBHvYl1x3Mh/YypMIkmydRyq50XPrNYZadsM6rQ==",
+      "dev": true,
+      "requires": {
+        "del": "^3.0.0",
+        "extract-zip": "^1.6.7",
+        "mkdirp": "^0.5.1",
+        "request": "^2.88.0",
+        "tcp-port-used": "^1.0.1"
       }
     },
+    "ci-info": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+      "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+      "dev": true
+    },
     "circular-json": {
       "version": "0.5.9",
       "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
         }
       }
     },
+    "cli-boxes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+      "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+      "dev": true
+    },
     "cli-cursor": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
-      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "dev": true,
       "requires": {
-        "restore-cursor": "^2.0.0"
+        "restore-cursor": "^3.1.0"
       }
     },
+    "cli-spinners": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz",
+      "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==",
+      "dev": true
+    },
     "cli-width": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
       "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
       "dev": true
     },
+    "cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "dev": true,
+      "requires": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        }
+      }
+    },
     "clone-regexp": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz",
         "q": "^1.1.2"
       }
     },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
     "coffeescript": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
       "dev": true
     },
     "colors": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
-      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+      "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
       "dev": true
     },
     "combine-lists": {
       }
     },
     "combined-stream": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
-      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
     },
     "commander": {
-      "version": "2.12.2",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
-      "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+      "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
       "dev": true
     },
     "component-bind": {
       "dev": true
     },
     "compress-commons": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
-      "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
+      "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
       "dev": true,
       "requires": {
-        "buffer-crc32": "^0.2.1",
-        "crc32-stream": "^2.0.0",
-        "normalize-path": "^2.0.0",
-        "readable-stream": "^2.0.0"
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^3.0.1",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.3.6"
       },
       "dependencies": {
-        "normalize-path": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "remove-trailing-separator": "^1.0.1"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
         }
       }
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
       "dev": true
     },
-    "connect": {
-      "version": "3.6.6",
-      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
-      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
       "dev": true,
       "requires": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.0",
-        "parseurl": "~1.3.2",
-        "utils-merge": "1.0.1"
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
       },
       "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+        "readable-stream": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
         }
       }
     },
+    "configstore": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+      "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+      "dev": true,
+      "requires": {
+        "dot-prop": "^4.1.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^1.0.0",
+        "unique-string": "^1.0.0",
+        "write-file-atomic": "^2.0.0",
+        "xdg-basedir": "^3.0.0"
+      }
+    },
+    "connect": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.2",
+        "parseurl": "~1.3.3",
+        "utils-merge": "1.0.1"
+      }
+    },
+    "constant-case": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
+      "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
+      "dev": true,
+      "requires": {
+        "snake-case": "^2.1.0",
+        "upper-case": "^1.1.1"
+      }
+    },
     "content-type": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
       "dev": true
     },
     "core-js": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
-      "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
+      "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==",
       "dev": true
     },
     "core-util-is": {
             "resolve-from": "^3.0.0"
           }
         },
-        "js-yaml": {
-          "version": "3.13.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-          "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
         "parse-json": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
       }
     },
     "crc32-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
-      "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
+      "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
       "dev": true,
       "requires": {
         "crc": "^3.4.4",
-        "readable-stream": "^2.0.0"
+        "readable-stream": "^3.4.0"
       }
     },
-    "cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
       "dev": true,
       "requires": {
-