merged master
authordaniel <daniel.kinzler@wikimedia.de>
Tue, 18 Sep 2012 15:43:20 +0000 (17:43 +0200)
committerdaniel <daniel.kinzler@wikimedia.de>
Wed, 19 Sep 2012 10:34:10 +0000 (12:34 +0200)
Change-Id: I0ef7c7f33a5dc5855f38b20c03ddc5306f38ec66

193 files changed:
RELEASE-NOTES-1.20
docs/doxygen_first_page.php
docs/hooks.txt
includes/Article.php
includes/CategoryViewer.php
includes/ChangesList.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Html.php
includes/ImagePage.php
includes/Revision.php
includes/SkinLegacy.php
includes/Title.php
includes/WikiError.php
includes/WikiPage.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/api/ApiParse.php
includes/api/ApiQueryLogEvents.php
includes/diff/DifferenceEngine.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/FSLockManager.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filerepo/file/File.php
includes/installer/WebInstallerOutput.php
includes/objectcache/SqlBagOStuff.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/Preprocessor_DOM.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserrights.php
includes/upload/UploadStash.php
languages/Language.php
languages/classes/LanguageHsb.php
languages/classes/LanguageLn.php [deleted file]
languages/classes/LanguageMo.php [deleted file]
languages/classes/LanguageRo.php [deleted file]
languages/classes/LanguageSe.php [deleted file]
languages/classes/LanguageSma.php [deleted file]
languages/data/plurals-mediawiki.xml
languages/messages/MessagesAce.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAst.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEu.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGl.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLb.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMs.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSh.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesTa.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesUk.php
languages/messages/MessagesVi.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
maintenance/Maintenance.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/benchmarkHooks.php
resources/jquery/jquery.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.placeholder.js
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/mediawiki.language/languages/am.js [deleted file]
resources/mediawiki.language/languages/bat-smg.js [deleted file]
resources/mediawiki.language/languages/be-tarask.js [deleted file]
resources/mediawiki.language/languages/be.js [deleted file]
resources/mediawiki.language/languages/bh.js [deleted file]
resources/mediawiki.language/languages/bs.js
resources/mediawiki.language/languages/cs.js [deleted file]
resources/mediawiki.language/languages/cu.js [deleted file]
resources/mediawiki.language/languages/cy.js [deleted file]
resources/mediawiki.language/languages/dsb.js
resources/mediawiki.language/languages/fr.js [deleted file]
resources/mediawiki.language/languages/ga.js
resources/mediawiki.language/languages/gd.js [deleted file]
resources/mediawiki.language/languages/gv.js [deleted file]
resources/mediawiki.language/languages/hr.js [deleted file]
resources/mediawiki.language/languages/hsb.js
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/ksh.js [deleted file]
resources/mediawiki.language/languages/ln.js [deleted file]
resources/mediawiki.language/languages/lt.js [deleted file]
resources/mediawiki.language/languages/lv.js [deleted file]
resources/mediawiki.language/languages/mg.js [deleted file]
resources/mediawiki.language/languages/mk.js [deleted file]
resources/mediawiki.language/languages/mo.js [deleted file]
resources/mediawiki.language/languages/mt.js [deleted file]
resources/mediawiki.language/languages/nso.js [deleted file]
resources/mediawiki.language/languages/pl.js [deleted file]
resources/mediawiki.language/languages/ro.js [deleted file]
resources/mediawiki.language/languages/ru.js
resources/mediawiki.language/languages/se.js [deleted file]
resources/mediawiki.language/languages/sh.js [deleted file]
resources/mediawiki.language/languages/sk.js [deleted file]
resources/mediawiki.language/languages/sl.js
resources/mediawiki.language/languages/sma.js [deleted file]
resources/mediawiki.language/languages/sr-ec.js [deleted file]
resources/mediawiki.language/languages/sr-el.js [deleted file]
resources/mediawiki.language/languages/sr.js [deleted file]
resources/mediawiki.language/languages/ti.js [deleted file]
resources/mediawiki.language/languages/tl.js [deleted file]
resources/mediawiki.language/languages/uk.js
resources/mediawiki.language/languages/wa.js [deleted file]
resources/mediawiki.language/mediawiki.language.init.js
resources/mediawiki.libs/CLDRPluralRuleParser.js
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.jqueryMsg.js
skins/CologneBlue.php
skins/Standard.php
skins/common/commonPrint.css
skins/common/config.js
skins/common/shared.css
skins/common/wikibits.js
tests/TestsAutoLoader.php
tests/jasmine/spec_makers/makeJqueryMsgSpec.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/TestUser.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestUser.php [deleted file]
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/languages/LanguageHuTest.php [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
thumb.php

index ce40066..b28cc70 100644 (file)
@@ -27,6 +27,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   different timezone than the wiki timezone set by $wgLocaltimezone.
 * New variables $wgDBssl and $wgDBcompress to enable SSL and compression for database
   connections, if either are available for the selected DB type.
+* $wgUseCombinedLoginLink now defaults to false, making MediaWiki output separate
+  login and create account links by default.
 
 === New features in 1.20 ===
 * Added TitleIsAlwaysKnown hook which gets called when determining if a page exists.
@@ -65,7 +67,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35685) api.php URL and other entry point URLs are now listed on
   Special:Version
 * Edit notices can now be translated.
-* jQuery upgraded to 1.7.2
+* jQuery upgraded to 1.8.1
 * jQuery UI upgraded to 1.8.23.
 * QUnit upgraded from v1.2.0 to v1.10.0.
 * (bug 37604) jquery.cookie upgraded to 2011 version.
@@ -143,7 +145,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   with auto-hide, multi-message support, and message replacement tags.
 * jquery.messageBox which appears to be unused by both core and extensions has
   been removed.
-* (bug 34939) made link parsking insensitive ([HttP://])
+* (bug 34939) Made link parsing insensitive ([HttP://])
+* (bug 40072) Add CSS classes to items in output of ChangesList pages.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -240,6 +243,9 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
 * (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
 * (bug 32552) Drop unused database field cat_hidden from table category.
+* (bug 40214) Category pages no longer use deprecated "width" HTML attribute.
+* (bug 39941) Add missing stylesheets to the installer pages
+* In HTML5 mode, allow new input element types values (such as color, range..)
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
index 11db1f5..9949d13 100644 (file)
@@ -13,7 +13,7 @@ die("Not a valid entry point\n");
  * Welcome on MediaWiki autogenerated documentation system.
  *
  * If you are looking to use, install or configure your wiki, you probably
- * want to look at the main site: http://www.mediawiki.org/
+ * want to look at the main site: https://www.mediawiki.org/
  *
  * @note this page is generated from docs/doxygen_first_page.php
  */
index 5cf1129..9b8d3a9 100644 (file)
@@ -325,12 +325,13 @@ $body: Body of the message
 Use this to extend core API modules.
 &$module: Module object
 
-'APICheckCanExecute': Called during ApiMain::checkCanExecute. Use to
+'ApiCheckCanExecute': Called during ApiMain::checkCanExecute. Use to
 further authenticate and authorize API clients before executing the
 module. Return false and set a message to cancel the request.
 $module: Module object
 $user: Current user
-&$message: API usage message to die with
+&$message: API usage message to die with, as a message key or array
+as accepted by ApiBase::dieUsageMsg.
 
 'APIEditBeforeSave': before saving a page with api.php?action=edit,
 after processing request parameters. Return false to let the request
index 555849c..93e1dbf 100644 (file)
@@ -1722,8 +1722,11 @@ class Article extends Page {
        public function getParserOutput( $oldid = null, User $user = null ) {
                //XXX: bypasses mParserOptions and thus setParserOptions()
 
-               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
-               $parserOptions = $this->mPage->makeParserOptions( $user );
+               if ( $user === null ) {
+                       $parserOptions = $this->getParserOptions();
+               } else {
+                       $parserOptions = $this->mPage->makeParserOptions( $user );
+               }
 
                return $this->mPage->getParserOutput( $parserOptions, $oldid );
        }
@@ -1749,7 +1752,7 @@ class Article extends Page {
         */
        public function getParserOptions() {
                if ( !$this->mParserOptions ) {
-                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext()->getUser() );
+                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
                }
                // Clone to allow modifications of the return value without affecting cache
                return clone $this->mParserOptions;
index 5f4aaea..3bb2bc9 100644 (file)
@@ -504,11 +504,11 @@ class CategoryViewer extends ContextSource {
                # Split into three columns
                $columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
 
-               $ret = '<table width="100%"><tr style="vertical-align: top;">';
+               $ret = '<table style="width: 100%;"><tr style="vertical-align: top;">';
                $prevchar = null;
 
                foreach ( $columns as $column ) {
-                       $ret .= '<td width="33.3%">';
+                       $ret .= '<td style="width: 33.3%;">';
                        $colContents = array();
 
                        # Kind of like array_flip() here, but we keep duplicates in an
index 8cca4bb..8467712 100644 (file)
@@ -345,7 +345,7 @@ class ChangesList extends ContextSource {
                                'action' => 'history'
                        )
                );
-               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' . . ';
+               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
        }
 
        /**
@@ -366,7 +366,7 @@ class ChangesList extends ContextSource {
                $articlelink = Linker::linkKnown(
                        $rc->getTitle(),
                        null,
-                       array(),
+                       array( 'class' => 'mw-changeslist-title' ),
                        $params
                );
                if( $this->isDeleted($rc,Revision::DELETED_TEXT) ) {
@@ -388,8 +388,8 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         */
        public function insertTimestamp( &$s, $rc ) {
-               $s .= $this->message['semicolon-separator'] .
-                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . ';
+               $s .= $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
        }
 
        /**
@@ -628,7 +628,7 @@ class OldChangesList extends ChangesList {
                if ( $wgRCShowChangedSize ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $s .= "$cd  . . ";
+                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
@@ -994,7 +994,7 @@ class EnhancedChangesList extends ChangesList {
                        $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
                }
 
-               $r .= ' . . ';
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                # Character difference (does not apply if only log items)
                if( $wgRCShowChangedSize && !$allLogs ) {
@@ -1013,7 +1013,7 @@ class EnhancedChangesList extends ChangesList {
                        if( $chardiff == '' ) {
                                $r .= ' ';
                        } else {
-                               $r .= ' ' . $chardiff. ' . . ';
+                               $r .= ' ' . $chardiff. ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
@@ -1066,13 +1066,13 @@ class EnhancedChangesList extends ChangesList {
                        if ( !$type == RC_LOG || $type == RC_NEW ) {
                                $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
                        }
-                       $r .= ' . . ';
+                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                        # Character diff
                        if ( $wgRCShowChangedSize ) {
                                $cd = $this->formatCharacterDifference( $rcObj );
                                if ( $cd !== '' ) {
-                                       $r .= "$cd . . ";
+                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
                                }
                        }
 
@@ -1202,12 +1202,12 @@ class EnhancedChangesList extends ChangesList {
                                $query
                        ) )->escaped();
                }
-               $r .= ' . . ';
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
                # Character diff
                if ( $wgRCShowChangedSize ) {
                        $cd = $this->formatCharacterDifference( $rcObj );
                        if ( $cd !== '' ) {
-                               $r .= "$cd . . ";
+                               $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
index c155a82..da4d0ed 100644 (file)
@@ -2721,7 +2721,7 @@ $wgFooterIcons = array(
  *  - true = use a combined login / create account link
  *  - false = split login and create account into two separate links
  */
-$wgUseCombinedLoginLink = true;
+$wgUseCombinedLoginLink = false;
 
 /**
  * Search form behavior for Vector skin only.
@@ -3228,10 +3228,18 @@ $wgParserConf = array(
 $wgMaxTocLevel = 999;
 
 /**
- * A complexity limit on template expansion
+ * A complexity limit on template expansion: the maximum number of nodes visited
+ * by PPFrame::expand()
  */
 $wgMaxPPNodeCount = 1000000;
 
+/**
+ * A complexity limit on template expansion: the maximum number of nodes 
+ * generated by Preprocessor::preprocessToObj()
+ */
+$wgMaxGeneratedPPNodeCount = 1000000;
+
+
 /**
  * Maximum recursion depth for templates within templates.
  * The current parser adds two levels to the PHP call stack for each template,
index 5102f7a..fe0e95e 100644 (file)
@@ -1420,7 +1420,7 @@ class EditPage {
                                                $this->isConflict = false;
                                                wfDebug( __METHOD__ . ": conflict suppressed; new section\n" );
                                        }
-                               } elseif ( $this->section == '' && $this->userWasLastToEdit( $wgUser->getId(), $this->edittime ) ) {
+                               } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER,  $this->mTitle->getArticleID(), $wgUser->getId(), $this->edittime ) ) {
                                        # Suppress edit conflict with self, except for section edits where merging is required.
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
                                        $this->isConflict = false;
@@ -1625,35 +1625,6 @@ class EditPage {
                }
        }
 
-       /**
-        * Check if no edits were made by other users since
-        * the time a user started editing the page. Limit to
-        * 50 revisions for the sake of performance.
-        *
-        * @param $id int
-        * @param $edittime string
-        *
-        * @return bool
-        */
-       protected function userWasLastToEdit( $id, $edittime ) {
-               if ( !$id ) return false;
-               $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( 'revision',
-                       'rev_user',
-                       array(
-                               'rev_page' => $this->mTitle->getArticleID(),
-                               'rev_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $edittime ) )
-                       ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 50 ) );
-               foreach ( $res as $row ) {
-                       if ( $row->rev_user != $id ) {
-                               return false;
-                       }
-               }
-               return true;
-       }
-
        /**
         * @private
         * @todo document
@@ -2880,6 +2851,7 @@ HTML
                        if ( $this->mTriedSave && !$this->mTokenOk ) {
                                if ( $this->mTokenOkExceptSuffix ) {
                                        $note = wfMessage( 'token_suffix_mismatch' )->plain() ;
+
                                } else {
                                        $note = wfMessage( 'session_fail_preview' )->plain() ;
                                }
@@ -2890,7 +2862,7 @@ HTML
                                        ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
                        }
 
-                       $parserOptions = ParserOptions::newFromUser( $wgUser );
+                       $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
                        $parserOptions->setEditSection( false );
                        $parserOptions->setTidy( true );
                        $parserOptions->setIsPreview( true );
@@ -2926,7 +2898,6 @@ HTML
                        }
 
                        $rt = $content->getRedirectChain();
-
                        if ( $rt ) {
                                $previewHTML = $this->mArticle->viewRedirect( $rt, false );
                        } else {
index e6fda96..d310879 100644 (file)
@@ -2372,8 +2372,13 @@ define( 'TS_ISO_8601_BASIC', 9 );
  * @return Mixed: String / false The same date in the format specified in $outputtype or false
  */
 function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
-       $timestamp = new MWTimestamp( $ts );
-       return $timestamp->getTimestamp( $outputtype );
+       try {
+               $timestamp = new MWTimestamp( $ts );
+               return $timestamp->getTimestamp( $outputtype );
+       } catch( TimestampException $e ) {
+               wfDebug("wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n");
+               return false;
+       }
 }
 
 /**
index d4d0203..dfd081f 100644 (file)
@@ -191,12 +191,8 @@ class Html {
                        return '';
                }
 
-               # Remove HTML5-only attributes if we aren't doing HTML5, and disable
-               # form validation regardless (see bug 23769 and the more detailed
-               # comment in expandAttributes())
+               # Remove invalid input types
                if ( $element == 'input' ) {
-                       # Whitelist of types that don't cause validation.  All except
-                       # 'search' are valid in XHTML1.
                        $validTypes = array(
                                'hidden',
                                'text',
@@ -208,18 +204,30 @@ class Html {
                                'image',
                                'reset',
                                'button',
-                               'search',
                        );
 
+                       # Allow more input types in HTML5 mode
+                       if( $wgHtml5 ) {
+                               $validTypes = array_merge( $validTypes, array(
+                                       'datetime',
+                                       'datetime-local',
+                                       'date',
+                                       'month',
+                                       'time',
+                                       'week',
+                                       'number',
+                                       'range',
+                                       'email',
+                                       'url',
+                                       'search',
+                                       'tel',
+                                       'color',
+                               ) );
+                       }
                        if ( isset( $attribs['type'] )
                        && !in_array( $attribs['type'], $validTypes ) ) {
                                unset( $attribs['type'] );
                        }
-
-                       if ( isset( $attribs['type'] ) && $attribs['type'] == 'search'
-                       && !$wgHtml5 ) {
-                               unset( $attribs['type'] );
-                       }
                }
 
                if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
@@ -286,6 +294,8 @@ class Html {
                        return $attribs;
                }
 
+               # Whenever altering this array, please provide a covering test case
+               # in HtmlTest::provideElementsWithAttributesHavingDefaultValues
                static $attribDefaults = array(
                        'area' => array( 'shape' => 'rect' ),
                        'button' => array(
@@ -306,7 +316,6 @@ class Html {
                        'input' => array(
                                'formaction' => 'GET',
                                'type' => 'text',
-                               'value' => '',
                        ),
                        'keygen' => array( 'keytype' => 'rsa' ),
                        'link' => array( 'media' => 'all' ),
@@ -347,6 +356,29 @@ class Html {
                && strval( $attribs['type'] ) == 'text/css' ) {
                        unset( $attribs['type'] );
                }
+               if ( $element === 'input' ) {
+                       $type = isset( $attribs['type'] ) ? $attribs['type'] : null;
+                       $value = isset( $attribs['value'] ) ? $attribs['value'] : null;
+                       if ( $type === 'checkbox' || $type === 'radio' ) {
+                               // The default value for checkboxes and radio buttons is 'on'
+                               // not ''. By stripping value="" we break radio boxes that
+                               // actually wants empty values.
+                               if ( $value === 'on' ) {
+                                       unset( $attribs['value'] );
+                               }
+                       } elseif ( $type === 'submit' ) {
+                               // The default value for submit appears to be "Submit" but
+                               // let's not bother stripping out localized text that matches
+                               // that.
+                       } else {
+                               // The default value for nearly every other field type is ''
+                               // The 'range' and 'color' types use different defaults but
+                               // stripping a value="" does not hurt them.
+                               if ( $value === '' ) {
+                                       unset( $attribs['value'] );
+                               }
+                       }
+               }
                if ( $element === 'select' && isset( $attribs['size'] ) ) {
                        if ( in_array( 'multiple', $attribs )
                                || ( isset( $attribs['multiple'] ) && $attribs['multiple'] !== false )
index e79c760..316e1c9 100644 (file)
@@ -385,6 +385,9 @@ class ImagePage extends Article {
                                        # Some sort of audio file that doesn't have dimensions
                                        # Don't output a no hi res message for such a file
                                        $msgsmall = '';
+                               } elseif ( $this->displayImg->isVectorized() ) {
+                                       # For vectorized images, full size is just the frame size
+                                       $msgsmall = '';
                                } else {
                                        # Image is small enough to show full size on image page
                                        $msgsmall = wfMessage( 'file-nohires' )->parse();
index 1a6a76e..31a96ad 100644 (file)
@@ -1286,7 +1286,13 @@ class Revision implements IDBAccessObject {
                        $model = $this->getContentModel();
                        $format = $this->getContentFormat();
 
-                       $defaultModel = ContentHandler::getDefaultModelFor( $this->getTitle() );
+                       $title = $this->getTitle();
+
+                       if ( $title === null ) {
+                               throw new MWException( "Insufficient information to determine the title of the revision's page!" );
+                       }
+
+                       $defaultModel = ContentHandler::getDefaultModelFor( $title );
                        $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
 
                        $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
@@ -1580,4 +1586,42 @@ class Revision implements IDBAccessObject {
                }
                return 0;
        }
+
+       /**
+        * Check if no edits were made by other users since
+        * the time a user started editing the page. Limit to
+        * 50 revisions for the sake of performance.
+        *
+        * @since 1.20
+        *
+        * @param DatabaseBase|int $db the Database to perform the check on. May be given as a Database object or
+        *        a database identifier usable with wfGetDB.
+        * @param int $pageId the ID of the page in question
+        * @param int $userId the ID of the user in question
+        * @param string $since look at edits since this time
+        *
+        * @return bool True if the given user was the only one to edit since the given timestamp
+        */
+       public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
+               if ( !$userId ) return false;
+
+               if ( is_int( $db ) ) {
+                       $db = wfGetDB( $db );
+               }
+
+               $res = $db->select( 'revision',
+                       'rev_user',
+                       array(
+                               'rev_page' => $pageId,
+                               'rev_timestamp > ' . $db->addQuotes( $db->timestamp( $since ) )
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 50 ) );
+               foreach ( $res as $row ) {
+                       if ( $row->rev_user != $userId ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
 }
index 1ae1cb3..e695ba6 100644 (file)
@@ -120,7 +120,7 @@ class LegacyTemplate extends BaseTemplate {
                }
 
                $s .= "\n<div id='content'>\n<div id='topbar'>\n" .
-                 "<table border='0' cellspacing='0' width='100%'>\n<tr>\n";
+                 "<table cellspacing='0' width='100%'>\n<tr>\n";
 
                if ( $this->getSkin()->qbSetting() == 0 ) {
                        $s .= "<td class='top' style='text-align: left; vertical-align: top;' rowspan='{$rows}'>\n" .
index e6e45a8..b9f432f 100644 (file)
@@ -931,6 +931,8 @@ class Title {
         * @return Bool
         */
        public function isConversionTable() {
+               //@todo: ConversionTable should become a separate content model.
+
                return $this->getNamespace() == NS_MEDIAWIKI &&
                        strpos( $this->getText(), 'Conversiontable/' ) === 0;
        }
index 4b0e68c..45ee20c 100644 (file)
@@ -91,22 +91,22 @@ class WikiErrorMsg extends WikiError {
                wfDeprecated( __METHOD__, '1.17' );
                $args = func_get_args();
                array_shift( $args );
-               $this->mMessage = wfMsgReal( $message, $args, true );
+               $this->mMessage = wfMessage( $message )->rawParams( $args )->text();
                $this->mMsgKey = $message;
                $this->mMsgArgs = $args;
        }
-       
+
        function getMessageKey() {
                return $this->mMsgKey;
        }
-       
+
        function getMessageArgs() {
                return $this->mMsgArgs;
        }
 }
 
 /**
- * Error class designed to handle errors involved with 
+ * Error class designed to handle errors involved with
  * XML parsing
  * @ingroup Exception
  */
index 38a1cbd..a032028 100644 (file)
@@ -1893,18 +1893,35 @@ class WikiPage extends Page implements IDBAccessObject {
 
        /**
         * Get parser options suitable for rendering the primary article wikitext
-        * @param User|string $user User object or 'canonical'
+        *
+        * @param IContextSource|User|string $context One of the following:
+        *        - IContextSource: Use the User and the Language of the provided
+        *          context
+        *        - User: Use the provided User object and $wgLang for the language,
+        *          so use an IContextSource object if possible.
+        *        - 'canonical': Canonical options (anonymous user with default
+        *          preferences and content language).
         * @return ParserOptions
         */
-       public function makeParserOptions( $user ) {
+       public function makeParserOptions( $context ) {
                global $wgContLang;
-               if ( $user instanceof User ) { // settings per user (even anons)
-                       $options = ParserOptions::newFromUser( $user );
+
+               if ( $context instanceof IContextSource ) {
+                       $options = ParserOptions::newFromContext( $context );
+               } elseif ( $context instanceof User ) { // settings per user (even anons)
+                       $options = ParserOptions::newFromUser( $context );
                } else { // canonical settings
                        $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
                }
+
+               if ( $this->getTitle()->isConversionTable() ) {
+                       //@todo: ConversionTable should become a separate content model.
+                       $options->disableContentConversion();
+               }
+
                $options->enableLimitReport(); // show inclusion/loop reports
                $options->setTidy( true ); // fix bad HTML
+
                return $options;
        }
 
index 120312d..4a55d5e 100644 (file)
@@ -198,10 +198,11 @@ class Xml {
                } else {
                        $encYear = '';
                }
-               return Xml::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
-                       Xml::input( 'year', 4, $encYear, array('id' => 'year', 'maxlength' => 4) ) . ' '.
-                       Xml::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
-                       Xml::monthSelector( $encMonth, -1 );
+               $inputAttribs = array( 'id' => 'year', 'maxlength' => 4, 'size' => 7 );
+               return self::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
+                       Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' '.
+                       self::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
+                       self::monthSelector( $encMonth, -1 );
        }
 
        /**
index 1c57f25..dcd6fe5 100644 (file)
@@ -604,7 +604,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        : 0;
                $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
                $fSize = Linker::formatRevisionSize($rev->getSize());
-               $s .= " . . $fSize $sDiff";
+               $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
 
                # Text following the character difference is added just before running hooks
                $s2 = Linker::revComment( $rev, false, true );
@@ -658,7 +658,7 @@ class HistoryPager extends ReverseChronologicalPager {
 
                # Include separator between character difference and following text
                if ( $s2 !== '' ) {
-                       $s .= " . . $s2";
+                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
                }
 
                wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s, &$classes ) );
@@ -684,7 +684,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $link = Linker::linkKnown(
                                $this->getTitle(),
                                $date,
-                               array(),
+                               array( 'class' => 'mw-changeslist-date' ),
                                array( 'oldid' => $rev->getId() )
                        );
                } else {
index 9e5cd99..8f40f8b 100644 (file)
@@ -157,16 +157,18 @@ class InfoAction extends FormlessAction {
                                ->numParams( count( $title->getRedirectsHere() ) )->escaped()
                );
 
-               // Subpages of this page
-               $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
-               $table = $this->addRow( $table,
-                       Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ),
-                       $this->msg( 'pageinfo-subpages-value' )
-                               ->numParams(
-                                       $pageInfo['subpages']['total'],
-                                       $pageInfo['subpages']['redirects'],
-                                       $pageInfo['subpages']['nonredirects'] )->escaped()
-               );
+               // Subpages of this page, if subpages are enabled for the current NS
+               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                       $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
+                       $table = $this->addRow( $table,
+                               Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ),
+                               $this->msg( 'pageinfo-subpages-value' )
+                                       ->numParams(
+                                               $pageInfo['subpages']['total'],
+                                               $pageInfo['subpages']['redirects'],
+                                               $pageInfo['subpages']['nonredirects'] )->escaped()
+                       );
+               }
 
                // Page protection
                $content = $this->addTable( $content, $table );
@@ -404,28 +406,32 @@ class InfoAction extends FormlessAction {
                );
                $result['recent_authors'] = $authors;
 
-               $conds = array( 'page_namespace' => $title->getNamespace(), 'page_is_redirect' => 1 );
-               $conds[] = 'page_title ' . $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
-
-               // Subpages of this page (redirects)
-               $result['subpages']['redirects'] = (int) $dbr->selectField(
-                       'page',
-                       'COUNT(page_id)',
-                       $conds,
-                       __METHOD__ );
-
-               // Subpages of this page (non-redirects)
-               $conds['page_is_redirect'] = 0;
-               $result['subpages']['nonredirects'] = (int) $dbr->selectField(
-                       'page',
-                       'COUNT(page_id)',
-                       $conds,
-                       __METHOD__
-               );
+               // Subpages (if enabled)
+               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                       $conds = array( 'page_namespace' => $title->getNamespace() );
+                       $conds[] = 'page_title ' . $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
 
-               // Subpages of this page (total)
-               $result['subpages']['total'] = $result['subpages']['redirects']
-                       + $result['subpages']['nonredirects'];
+                       // Subpages of this page (redirects)
+                       $conds['page_is_redirect'] = 1;
+                       $result['subpages']['redirects'] = (int) $dbr->selectField(
+                               'page',
+                               'COUNT(page_id)',
+                               $conds,
+                               __METHOD__ );
+
+                       // Subpages of this page (non-redirects)
+                       $conds['page_is_redirect'] = 0;
+                       $result['subpages']['nonredirects'] = (int) $dbr->selectField(
+                               'page',
+                               'COUNT(page_id)',
+                               $conds,
+                               __METHOD__
+                       );
+
+                       // Subpages of this page (total)
+                       $result['subpages']['total'] = $result['subpages']['redirects']
+                               + $result['subpages']['nonredirects'];
+               }
 
                // Latest editor + date of latest edit
                $options = array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 );
index ca5fe7e..7c61291 100644 (file)
@@ -79,10 +79,6 @@ class ApiParse extends ApiBase {
                        $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
                }
 
-               $popts = ParserOptions::newFromContext( $this->getContext() );
-               $popts->setTidy( true );
-               $popts->enableLimitReport( !$params['disablepp'] );
-
                $redirValues = null;
 
                // Return result
@@ -100,14 +96,17 @@ class ApiParse extends ApiBase {
                                }
 
                                $titleObj = $rev->getTitle();
-
                                $wgTitle = $titleObj;
+                               $pageObj = WikiPage::factory( $titleObj );
+                               $popts = $pageObj->makeParserOptions( $this->getContext() );
+                               $popts->enableLimitReport( !$params['disablepp'] );
 
                                // If for some reason the "oldid" is actually the current revision, it may be cached
-                               if ( $titleObj->getLatestRevID() === intval( $oldid ) )  {
+                               if ( $rev->isCurrent() )  {
                                        // May get from/save to parser cache
                                        $pageObj = WikiPage::factory( $titleObj );
-                                       $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, isset( $prop['wikitext'] ) ) ;
+                                       $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, 
+                                               isset( $prop['wikitext'] ) ) ;
                                } else { // This is an old revision, so get the text differently
                                        $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
@@ -140,34 +139,28 @@ class ApiParse extends ApiBase {
                                        foreach ( (array)$redirValues as $r ) {
                                                $to = $r['to'];
                                        }
-                                       $titleObj = Title::newFromText( $to );
-                               } else {
-                                       if ( !is_null ( $pageid ) ) {
-                                               $reqParams['pageids'] = $pageid;
-                                               $titleObj = Title::newFromID( $pageid );
-                                       } else { // $page
-                                               $to = $page;
-                                               $titleObj = Title::newFromText( $to );
-                                       }
-                               }
-                               if ( !is_null ( $pageid ) ) {
-                                       if ( !$titleObj ) {
-                                               // Still throw nosuchpageid error if pageid was provided
-                                               $this->dieUsageMsg( array( 'nosuchpageid', $pageid ) );
-                                       }
-                               } elseif ( !$titleObj || !$titleObj->exists() ) {
-                                       $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+                                       $pageParams = array( 'title' => $to );
+                               } elseif ( !is_null( $pageid ) ) {
+                                       $pageParams = array( 'pageid' => $pageid );
+                               } else { // $page
+                                       $pageParams = array( 'title' => $page );
                                }
+
+                               $pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' );
+                               $titleObj = $pageObj->getTitle();
                                $wgTitle = $titleObj;
 
                                if ( isset( $prop['revid'] ) ) {
-                                       $oldid = $titleObj->getLatestRevID();
+                                       $oldid = $pageObj->getLatest();
                                }
 
-                               $pageObj = WikiPage::factory( $titleObj );
+
+                               $popts = $pageObj->makeParserOptions( $this->getContext() );
+                               $popts->enableLimitReport( !$params['disablepp'] );
 
                                // Potentially cached
-                               $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, isset( $prop['wikitext'] ) ) ;
+                               $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, 
+                                       isset( $prop['wikitext'] ) ) ;
                        }
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
@@ -175,6 +168,10 @@ class ApiParse extends ApiBase {
                                $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                        }
                        $wgTitle = $titleObj;
+                       $pageObj = WikiPage::factory( $titleObj );
+
+                       $popts = $pageObj->makeParserOptions( $this->getContext() );
+                       $popts->enableLimitReport( !$params['disablepp'] );
 
                        if ( is_null( $text ) ) {
                                $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
index f2fd425..5d85c22 100644 (file)
@@ -263,6 +263,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
                if ( !is_null( $params ) ) {
                        $result->setIndexedTagName( $params, 'param' );
+                       $result->setIndexedTagName_recursive( $params, 'param' );
                        $vals = array_merge( $vals, $params );
                }
                return $vals;
index 82a4afb..a275763 100644 (file)
@@ -557,9 +557,7 @@ class DifferenceEngine extends ContextSource {
        }
 
        protected function getParserOutput( WikiPage $page, Revision $rev ) {
-               $parserOptions = ParserOptions::newFromContext( $this->getContext() );
-               $parserOptions->enableLimitReport();
-               $parserOptions->setTidy( true );
+               $parserOptions = $page->makeParserOptions( $this->getContext() );
 
                if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( "edit" ) ) {
                        $parserOptions->setEditSection( false );
index 6b25982..523b859 100644 (file)
@@ -50,7 +50,7 @@
  * backends with virtual directories may not have this limitation. Callers should
  * store files in such a way that no files and directories are under the same path.
  *
- * Methods should avoid throwing exceptions at all costs.
+ * Methods of subclasses should avoid throwing exceptions at all costs.
  * As a corollary, external dependencies should be kept to a minimum.
  *
  * @ingroup FileBackend
@@ -249,13 +249,13 @@ abstract class FileBackend {
         *   - allowStale          : Don't require the latest available data.
         *                           This can increase performance for non-critical writes.
         *                           This has no effect unless the 'force' flag is set.
-        *   - preserveCache       : Don't clear the process cache before checking files.
-        *                           This should only be used if all entries in the process
-        *                           cache were added after the files were already locked.
         *   - nonJournaled        : Don't log this operation batch in the file journal.
         *                           This limits the ability of recovery scripts.
         *   - parallelize         : Try to do operations in parallel when possible.
         *   - bypassReadOnly      : Allow writes in read-only mode (since 1.20).
+        *   - preserveCache       : Don't clear the process cache before checking files.
+        *                           This should only be used if all entries in the process
+        *                           cache were added after the files were already locked (since 1.20).
         *
         * @remarks Remarks on locking:
         * File system paths given to operations should refer to files that are
@@ -676,7 +676,7 @@ abstract class FileBackend {
        /**
         * Delete a storage directory if it is empty.
         * Backends using key/value stores may do nothing unless the directory
-        * is that of an empty container, in which case it should be deleted.
+        * is that of an empty container, in which case it will be deleted.
         *
         * @param $params Array
         * $params include:
@@ -784,15 +784,15 @@ abstract class FileBackend {
 
        /**
         * Stream the file at a storage path in the backend.
-        * If the file does not exists, a 404 error will be given.
+        * If the file does not exists, an HTTP 404 error will be given.
         * Appropriate HTTP headers (Status, Content-Type, Content-Length)
-        * must be sent if streaming began, while none should be sent otherwise.
+        * will be sent if streaming began, while none will be sent otherwise.
         * Implementations should flush the output buffer before sending data.
         *
         * @param $params Array
         * $params include:
         *   - src     : source storage path
-        *   - headers : additional HTTP headers to send on success
+        *   - headers : list of additional HTTP headers to send on success
         *   - latest  : use the latest available data
         * @return Status
         */
@@ -850,10 +850,10 @@ abstract class FileBackend {
        /**
         * Get an iterator to list *all* directories under a storage directory.
         * If the directory is of the form "mwstore://backend/container",
-        * then all directories in the container should be listed.
+        * then all directories in the container will be listed.
         * If the directory is of form "mwstore://backend/container/dir",
-        * then all directories directly under that directory should be listed.
-        * Results should be storage directories relative to the given directory.
+        * then all directories directly under that directory will be listed.
+        * Results will be storage directories relative to the given directory.
         *
         * Storage backends with eventual consistency might return stale data.
         *
@@ -885,10 +885,10 @@ abstract class FileBackend {
        /**
         * Get an iterator to list *all* stored files under a storage directory.
         * If the directory is of the form "mwstore://backend/container",
-        * then all files in the container should be listed.
+        * then all files in the container will be listed.
         * If the directory is of form "mwstore://backend/container/dir",
-        * then all files under that directory should be listed.
-        * Results should be storage paths relative to the given directory.
+        * then all files under that directory will be listed.
+        * Results will be storage paths relative to the given directory.
         *
         * Storage backends with eventual consistency might return stale data.
         *
index 9efa0db..4be0323 100644 (file)
@@ -44,6 +44,8 @@ class FileBackendMultiWrite extends FileBackend {
        protected $backends = array(); // array of (backend index => backends)
        protected $masterIndex = -1; // integer; index of master backend
        protected $syncChecks = 0; // integer; bitfield
+       protected $autoResync = false; // boolean
+
        /** @var Array */
        protected $noPushDirConts = array();
        protected $noPushQuickOps = false; // boolean
@@ -70,6 +72,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                      Possible bits include the FileBackendMultiWrite::CHECK_* constants.
         *                      There are constants for SIZE, TIME, and SHA1.
         *                      The checks are done before allowing any file operations.
+        *   - autoResync     : Automatically resync the clone backends to the master backend
+        *                      when pre-operation sync checks fail. This should only be used
+        *                      if the master backend is stable and not missing any files.
         *   - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
         *   - noPushDirConts : (hack) Only apply directory functions to the master backend.
         *
@@ -81,6 +86,7 @@ class FileBackendMultiWrite extends FileBackend {
                $this->syncChecks = isset( $config['syncChecks'] )
                        ? $config['syncChecks']
                        : self::CHECK_SIZE;
+               $this->autoResync = !empty( $config['autoResync'] );
                $this->noPushQuickOps = isset( $config['noPushQuickOps'] )
                        ? $config['noPushQuickOps']
                        : false;
@@ -152,16 +158,30 @@ class FileBackendMultiWrite extends FileBackend {
                // Clear any cache entries (after locks acquired)
                $this->clearCache();
                $opts['preserveCache'] = true; // only locked files are cached
-               // Do a consistency check to see if the backends agree
-               $status->merge( $this->consistencyCheck( $this->fileStoragePathsForOps( $ops ) ) );
+               // Get the list of paths to read/write...
+               $relevantPaths = $this->fileStoragePathsForOps( $ops );
+               // Check if the paths are valid and accessible on all backends...
+               $status->merge( $this->accessibilityCheck( $relevantPaths ) );
                if ( !$status->isOK() ) {
                        return $status; // abort
                }
+               // Do a consistency check to see if the backends are consistent...
+               $syncStatus = $this->consistencyCheck( $relevantPaths );
+               if ( !$syncStatus->isOK() ) {
+                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                               " failed sync check: " . FormatJson::encode( $relevantPaths ) );
+                       // Try to resync the clone backends to the master on the spot...
+                       if ( !$this->autoResync || !$this->resyncFiles( $relevantPaths )->isOK() ) {
+                               $status->merge( $syncStatus );
+                               return $status; // abort
+                       }
+               }
                // Actually attempt the operation batch on the master backend...
                $masterStatus = $mbe->doOperations( $realOps, $opts );
                $status->merge( $masterStatus );
                // Propagate the operations to the clone backends if there were no fatal errors.
                // If $ops only had one operation, this might avoid backend inconsistencies.
+               // This also avoids inconsistency for expected errors (like "file already exists").
                if ( !count( $masterStatus->getErrorsArray() ) ) {
                        foreach ( $this->backends as $index => $backend ) {
                                if ( $index !== $this->masterIndex ) { // not done already
@@ -193,7 +213,7 @@ class FileBackendMultiWrite extends FileBackend {
                }
 
                $mBackend = $this->backends[$this->masterIndex];
-               foreach ( array_unique( $paths ) as $path ) {
+               foreach ( $paths as $path ) {
                        $params = array( 'src' => $path, 'latest' => true );
                        $mParams = $this->substOpPaths( $params, $mBackend );
                        // Stat the file on the 'master' backend
@@ -203,8 +223,7 @@ class FileBackendMultiWrite extends FileBackend {
                        } else {
                                $mSha1 = false;
                        }
-                       $mUsable = $mBackend->isPathUsableInternal( $mParams['src'] );
-                       // Check of all clone backends agree with the master...
+                       // Check if all clone backends agree with the master...
                        foreach ( $this->backends as $index => $cBackend ) {
                                if ( $index === $this->masterIndex ) {
                                        continue; // master
@@ -241,8 +260,29 @@ class FileBackendMultiWrite extends FileBackend {
                                                $status->fatal( 'backend-fail-synced', $path );
                                        }
                                }
-                               if ( $mUsable !== $cBackend->isPathUsableInternal( $cParams['src'] ) ) {
-                                       $status->fatal( 'backend-fail-synced', $path );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Check that a set of file paths are usable across all internal backends
+        *
+        * @param $paths Array List of storage paths
+        * @return Status
+        */
+       public function accessibilityCheck( array $paths ) {
+               $status = Status::newGood();
+               if ( count( $this->backends ) <= 1 ) {
+                       return $status; // skip checks
+               }
+
+               foreach ( $paths as $path ) {
+                       foreach ( $this->backends as $backend ) {
+                               $realPath = $this->substPaths( $path, $backend );
+                               if ( !$backend->isPathUsableInternal( $realPath ) ) {
+                                       $status->fatal( 'backend-fail-usable', $path );
                                }
                        }
                }
@@ -265,6 +305,10 @@ class FileBackendMultiWrite extends FileBackend {
                        $mPath  = $this->substPaths( $path, $mBackend );
                        $mSha1  = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
                        $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
+                       // Check if the master backend is available...
+                       if ( $mExist === null ) {
+                               $status->fatal( 'backend-fail-internal', $this->name );
+                       }
                        // Check of all clone backends agree with the master...
                        foreach ( $this->backends as $index => $cBackend ) {
                                if ( $index === $this->masterIndex ) {
@@ -307,7 +351,7 @@ class FileBackendMultiWrite extends FileBackend {
                                $paths[] = $op['dst'];
                        }
                }
-               return array_unique( $paths );
+               return array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) );
        }
 
        /**
index 204ca3b..a8fe258 100644 (file)
@@ -54,22 +54,22 @@ class DBLockManager extends QuorumLockManager {
         * Construct a new instance from configuration.
         *
         * $config paramaters include:
-        *     'dbServers'   : Associative array of DB names to server configuration.
-        *                     Configuration is an associative array that includes:
-        *                     'host'        - DB server name
-        *                     'dbname'      - DB name
-        *                     'type'        - DB type (mysql,postgres,...)
-        *                     'user'        - DB user
-        *                     'password'    - DB user password
-        *                     'tablePrefix' - DB table prefix
-        *                     'flags'       - DB flags (see DatabaseBase)
-        *     'dbsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
-        *                     each having an odd-numbered list of DB names (peers) as values.
-        *                     Any DB named 'localDBMaster' will automatically use the DB master
-        *                     settings for this wiki (without the need for a dbServers entry).
-        *     'lockExpiry'  : Lock timeout (seconds) for dropped connections. [optional]
-        *                     This tells the DB server how long to wait before assuming
-        *                     connection failure and releasing all the locks for a session.
+        *   - dbServers   : Associative array of DB names to server configuration.
+        *                   Configuration is an associative array that includes:
+        *                     - host        : DB server name
+        *                     - dbname      : DB name
+        *                     - type        : DB type (mysql,postgres,...)
+        *                     - user        : DB user
+        *                     - password    : DB user password
+        *                     - tablePrefix : DB table prefix
+        *                     - flags       : DB flags (see DatabaseBase)
+        *   - dbsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+        *                   each having an odd-numbered list of DB names (peers) as values.
+        *                   Any DB named 'localDBMaster' will automatically use the DB master
+        *                   settings for this wiki (without the need for a dbServers entry).
+        *   - lockExpiry  : Lock timeout (seconds) for dropped connections. [optional]
+        *                   This tells the DB server how long to wait before assuming
+        *                   connection failure and releasing all the locks for a session.
         *
         * @param Array $config
         */
index 53f3e9f..9a6206f 100644 (file)
@@ -50,7 +50,7 @@ class FSLockManager extends LockManager {
         * Construct a new instance from configuration.
         *
         * $config includes:
-        *     'lockDirectory' : Directory containing the lock files
+        *   - lockDirectory : Directory containing the lock files
         *
         * @param array $config
         */
index 9e81dbf..57c0463 100644 (file)
@@ -56,12 +56,12 @@ class MemcLockManager extends QuorumLockManager {
         * Construct a new instance from configuration.
         *
         * $config paramaters include:
-        *   - 'lockServers'  : Associative array of server names to "<IP>:<port>" strings.
-        *   - 'srvsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
-        *                      each having an odd-numbered list of server names (peers) as values.
-        *   - 'memcConfig'   : Configuration array for ObjectCache::newFromParams. [optional]
-        *                      If set, this must use one of the memcached classes.
-        *   - 'wikiId'       : Wiki ID string that all resources are relative to. [optional]
+        *   - lockServers  : Associative array of server names to "<IP>:<port>" strings.
+        *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+        *                    each having an odd-numbered list of server names (peers) as values.
+        *   - memcConfig   : Configuration array for ObjectCache::newFromParams. [optional]
+        *                    If set, this must use one of the memcached classes.
+        *   - wikiId       : Wiki ID string that all resources are relative to. [optional]
         *
         * @param Array $config
         */
index 3b0ea14..557609d 100644 (file)
@@ -68,6 +68,9 @@ abstract class File {
        const FOR_THIS_USER = 2;
        const RAW = 3;
 
+       // Options for File::thumbName()
+       const THUMB_FULL_NAME = 1;
+
        /**
         * Some member variables can be lazy-initialised using __get(). The
         * initialisation function for these variables is always a function named
@@ -759,15 +762,18 @@ abstract class File {
        }
 
        /**
-        * Return the file name of a thumbnail with the specified parameters
+        * Return the file name of a thumbnail with the specified parameters.
+        * Use File::THUMB_FULL_NAME to always get a name like "<params>-<source>".
+        * Otherwise, the format may be "<params>-<source>" or "<params>-thumbnail.<ext>".
         *
         * @param $params Array: handler-specific parameters
-        * @private -ish
-        *
+        * @param $flags integer Bitfield that supports THUMB_* constants
         * @return string
         */
-       function thumbName( $params ) {
-               $name = $this->repo ? $this->repo->nameForThumb( $this->getName() ) : $this->getName();
+       public function thumbName( $params, $flags = 0 ) {
+               $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
+                       ? $this->repo->nameForThumb( $this->getName() )
+                       : $this->getName();
                return $this->generateThumbName( $name, $params );
        }
 
@@ -779,7 +785,7 @@ abstract class File {
         *
         * @return string
         */
-       function generateThumbName( $name, $params ) {
+       public function generateThumbName( $name, $params ) {
                if ( !$this->getHandler() ) {
                        return null;
                }
index e440c6b..f3166c2 100644 (file)
@@ -118,6 +118,7 @@ class WebInstallerOutput {
                $cssFileNames = array(
 
                        // Basically the "skins.vector" ResourceLoader module styles
+                       'common/shared.css',
                        'common/commonElements.css',
                        'common/commonContent.css',
                        'common/commonInterface.css',
index a3d2d89..54051dc 100644 (file)
@@ -163,7 +163,7 @@ class SqlBagOStuff extends BagOStuff {
         */
        public function get( $key ) {
                $values = $this->getMulti( array( $key ) );
-               return $values[$key];
+               return array_key_exists( $key, $values ) ? $values[$key] : false;
        }
 
        /**
index bcf030f..61b4239 100644 (file)
@@ -163,7 +163,8 @@ class Parser {
        var $mLinkHolders;
 
        var $mLinkID;
-       var $mIncludeSizes, $mPPNodeCount, $mHighestExpansionDepth, $mDefaultSort;
+       var $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth;
+       var $mDefaultSort;
        var $mTplExpandCache; # empty-frame expansion cache
        var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
        var $mExpensiveFunctionCount; # number of expensive parser function calls
@@ -306,6 +307,7 @@ class Parser {
                        'arg' => 0,
                );
                $this->mPPNodeCount = 0;
+               $this->mGeneratedPPNodeCount = 0;
                $this->mHighestExpansionDepth = 0;
                $this->mDefaultSort = false;
                $this->mHeadings = array();
@@ -339,7 +341,7 @@ class Parser {
                 * to internalParse() which does all the real work.
                 */
 
-               global $wgUseTidy, $wgAlwaysUseTidy, $wgDisableLangConversion, $wgDisableTitleConversion;
+               global $wgUseTidy, $wgAlwaysUseTidy;
                $fname = __METHOD__.'-' . wfGetCaller();
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
@@ -392,9 +394,8 @@ class Parser {
                 * c) It's a conversion table
                 * d) it is an interface message (which is in the user language)
                 */
-               if ( !( $wgDisableLangConversion
-                               || isset( $this->mDoubleUnderscores['nocontentconvert'] )
-                               || $this->mTitle->isConversionTable() ) )
+               if ( !( $options->getDisableContentConversion()
+                               || isset( $this->mDoubleUnderscores['nocontentconvert'] ) ) )
                {
                        # Run convert unconditionally in 1.18-compatible mode
                        global $wgBug34832TransitionalRollback;
@@ -413,8 +414,7 @@ class Parser {
                 * {{DISPLAYTITLE:...}} is present. DISPLAYTITLE takes precedence over
                 * automatic link conversion.
                 */
-               if ( !( $wgDisableLangConversion
-                               || $wgDisableTitleConversion
+               if ( !( $options->getDisableTitleConversion()
                                || isset( $this->mDoubleUnderscores['nocontentconvert'] )
                                || isset( $this->mDoubleUnderscores['notitleconvert'] )
                                || $this->mOutput->getDisplayTitle() !== false ) )
@@ -482,7 +482,9 @@ class Parser {
                        $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
                        $limitReport =
                                "NewPP limit report\n" .
-                               "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
+                               "Preprocessor visited node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
+                               "Preprocessor generated node count: " .
+                                       "{$this->mGeneratedPPNodeCount}/{$this->mOptions->getMaxGeneratedPPNodeCount()}\n" .
                                "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
                                "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
                                "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n".
index 211fcd6..009b18a 100644 (file)
@@ -94,6 +94,11 @@ class ParserOptions {
         * Maximum number of nodes touched by PPFrame::expand()
         */
        var $mMaxPPNodeCount;
+
+       /**
+        * Maximum number of nodes generated by Preprocessor::preprocessToObj()
+        */
+       var $mMaxGeneratedPPNodeCount;
        
        /**
         * Maximum recursion depth in PPFrame::expand()
@@ -149,6 +154,16 @@ class ParserOptions {
         */
        var $mPreSaveTransform = true;
 
+       /**
+        * Whether content conversion should be disabled
+        */
+       var $mDisableContentConversion;
+
+       /**
+        * Whether title conversion should be disabled
+        */
+       var $mDisableTitleConversion;
+
        /**
         * Automatically number headings?
         */
@@ -219,6 +234,7 @@ class ParserOptions {
        function getTargetLanguage()                { return $this->mTargetLanguage; }
        function getMaxIncludeSize()                { return $this->mMaxIncludeSize; }
        function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
+       function getMaxGeneratedPPNodeCount()       { return $this->mMaxGeneratedPPNodeCount; }
        function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
        function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
        /* @since 1.20 */
@@ -228,6 +244,8 @@ class ParserOptions {
        function getEnableLimitReport()             { return $this->mEnableLimitReport; }
        function getCleanSignatures()               { return $this->mCleanSignatures; }
        function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
+       function getDisableContentConversion()      { return $this->mDisableContentConversion; }
+       function getDisableTitleConversion()        { return $this->mDisableTitleConversion; }
        function getMath()                          { $this->optionUsed( 'math' );
                                                                                                  return $this->mMath; }
        function getThumbSize()                     { $this->optionUsed( 'thumbsize' );
@@ -307,6 +325,7 @@ class ParserOptions {
        function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
        function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
        function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
+       function setMaxGeneratedPPNodeCount( $x )   { return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); }
        function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
        /* @since 1.20 */
        function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
@@ -316,6 +335,8 @@ class ParserOptions {
        function setTimestamp( $x )                 { return wfSetVar( $this->mTimestamp, $x ); }
        function setCleanSignatures( $x )           { return wfSetVar( $this->mCleanSignatures, $x ); }
        function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
+       function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
+       function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
        function setMath( $x )                      { return wfSetVar( $this->mMath, $x ); }
        function setUserLang( $x )                  {
                if ( is_string( $x ) ) {
@@ -404,7 +425,8 @@ class ParserOptions {
                global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
                        $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
                        $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
-                       $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit;
+                       $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit,
+                       $wgMaxGeneratedPPNodeCount, $wgDisableLangConversion, $wgDisableTitleConversion;
 
                wfProfileIn( __METHOD__ );
 
@@ -416,11 +438,14 @@ class ParserOptions {
                $this->mAllowSpecialInclusion = $wgAllowSpecialInclusion;
                $this->mMaxIncludeSize = $wgMaxArticleSize * 1024;
                $this->mMaxPPNodeCount = $wgMaxPPNodeCount;
+               $this->mMaxGeneratedPPNodeCount = $wgMaxGeneratedPPNodeCount;
                $this->mMaxPPExpandDepth = $wgMaxPPExpandDepth;
                $this->mMaxTemplateDepth = $wgMaxTemplateDepth;
                $this->mExpensiveParserFunctionLimit = $wgExpensiveParserFunctionLimit;
                $this->mCleanSignatures = $wgCleanSignatures;
                $this->mExternalLinkTarget = $wgExternalLinkTarget;
+               $this->mDisableContentConversion = $wgDisableLangConversion;
+               $this->mDisableTitleConversion = $wgDisableLangConversion || $wgDisableTitleConversion;
 
                $this->mUser = $user;
                $this->mNumberHeadings = $user->getOption( 'numberheadings' );
index e75237b..34de0ba 100644 (file)
@@ -162,6 +162,15 @@ class Preprocessor_DOM implements Preprocessor {
                        }
 
                }
+
+               // Fail if the number of elements exceeds acceptable limits
+               // Do not attempt to generate the DOM 
+               $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
+               $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
+               if ( $this->parser->mGeneratedPPNodeCount > $max ) {
+                       throw new MWException( __METHOD__.': generated node count limit exceeded' );
+               }
+
                wfProfileIn( __METHOD__.'-loadXML' );
                $dom = new DOMDocument;
                wfSuppressWarnings();
index aefa6cc..c5aa238 100644 (file)
@@ -94,8 +94,8 @@ class ActiveUsersPager extends UsersPager {
                $dbr = wfGetDB( DB_SLAVE );
                $conds = array( 'rc_user > 0' ); // Users - no anons
                $conds[] = 'ipb_deleted IS NULL'; // don't show hidden names
-               $conds[] = "rc_log_type IS NULL OR rc_log_type != 'newusers'";
-               $conds[] = "rc_timestamp >= '{$dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 )}'";
+               $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
+               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
 
                if( $this->requestedUser != '' ) {
                        $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
@@ -115,7 +115,11 @@ class ActiveUsersPager extends UsersPager {
                        ),
                        'join_conds' => array(
                                'user' => array( 'INNER JOIN', 'rc_user_text=user_name' ),
-                               'ipblocks' => array( 'LEFT JOIN', 'user_id=ipb_user AND ipb_auto=0 AND ipb_deleted=1' ),
+                               'ipblocks' => array( 'LEFT JOIN', array(
+                                       'user_id=ipb_user',
+                                       'ipb_auto' => 0,
+                                       'ipb_deleted' => 1
+                               )),
                        ),
                        'conds' => $conds
                );
index fc72610..0996de3 100644 (file)
@@ -151,7 +151,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $items = array(
                        array( 'wpName', 'username', 'text', $user->getName() ),
                        array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
-                       array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
+                       array( 'wpNewEmail', 'changeemail-newemail', 'email', $this->mNewEmail ),
                );
                if ( $wgRequirePasswordforEmailChange ) {
                        $items[] = array( 'wpPassword', 'yourpassword', 'password', $this->mPassword );
index fb94ff7..54f8e26 100644 (file)
@@ -841,7 +841,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        $link = Linker::link(
                                $page,
                                htmlspecialchars( $page->getPrefixedText() ),
-                               array(),
+                               array( 'class' => 'mw-contributions-title' ),
                                $page->isRedirect() ? array( 'redirect' => 'no' ) : array()
                        );
                        # Mark current revisions
@@ -882,11 +882,11 @@ class ContribsPager extends ReverseChronologicalPager {
                                // For some reason rev_parent_id isn't populated for this row.
                                // Its rumoured this is true on wikipedia for some revisions (bug 34922).
                                // Next best thing is to have the total number of bytes.
-                               $chardiff = ' . . ' . Linker::formatRevisionSize( $row->rev_len ) . ' . . ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
                        } else {
                                $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
-                               $chardiff = ' . . ' . ChangesList::showCharacterDifference(
-                                               $parentLen, $row->rev_len, $this->getContext() ) . ' . . ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
+                                               $parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
                        }
 
                        $lang = $this->getLanguage();
@@ -896,7 +896,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $d = Linker::linkKnown(
                                        $page,
                                        htmlspecialchars( $date ),
-                                       array(),
+                                       array( 'class' => 'mw-changeslist-date' ),
                                        array( 'oldid' => intval( $row->rev_id ) )
                                );
                        } else {
index 991e7a2..c880b61 100644 (file)
@@ -191,7 +191,7 @@ class DeletedContribsPager extends IndexPager {
                        $link = Linker::linkKnown(
                                $undelete,
                                $date,
-                               array(),
+                               array( 'class' => 'mw-changeslist-date' ),
                                array(
                                        'target' => $page->getPrefixedText(),
                                        'timestamp' => $rev->getTimestamp()
@@ -203,7 +203,11 @@ class DeletedContribsPager extends IndexPager {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
-               $pagelink = Linker::link( $page );
+               $pagelink = Linker::link(
+                       $page,
+                       null,
+                       array( 'class' => 'mw-changeslist-title' )
+               );
 
                if( $rev->isMinor() ) {
                        $mflag = ChangesList::flag( 'minor' );
@@ -222,7 +226,8 @@ class DeletedContribsPager extends IndexPager {
                                array( $last, $dellog, $reviewlink ) ) )->escaped()
                );
 
-               $ret = "{$del}{$link} {$tools} . . {$mflag} {$pagelink} {$comment}";
+               $separator = '<span class="mw-changeslist-separator">. .</span>';
+               $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
                # Denote if username is redacted for this edit
                if( $rev->isDeleted( Revision::DELETED_USER ) ) {
index 923a18d..1089fbb 100644 (file)
@@ -88,7 +88,7 @@ class UsersPager extends AlphabeticPager {
                $dbr = wfGetDB( DB_SLAVE );
                $conds = array();
                // Don't show hidden names
-               if( !$this->getUser()->isAllowed('hideuser') ) {
+               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $conds[] = 'ipb_deleted IS NULL';
                }
 
@@ -116,18 +116,22 @@ class UsersPager extends AlphabeticPager {
                $query = array(
                        'tables' => array( 'user', 'user_groups', 'ipblocks'),
                        'fields' => array(
-                               $this->creationSort ? 'MAX(user_name) AS user_name' : 'user_name',
-                               $this->creationSort ? 'user_id' : 'MAX(user_id) AS user_id',
-                               'MAX(user_editcount) AS edits',
-                               'COUNT(ug_group) AS numgroups',
-                               'MAX(ug_group) AS singlegroup', // the usergroup if there is only one
-                               'MIN(user_registration) AS creation',
-                               'MAX(ipb_deleted) AS ipb_deleted' // block/hide status
+                               'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name',
+                               'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)',
+                               'edits' => 'MAX(user_editcount)',
+                               'numgroups' => 'COUNT(ug_group)',
+                               'singlegroup' => 'MAX(ug_group)', // the usergroup if there is only one
+                               'creation' => 'MIN(user_registration)',
+                               'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status
                        ),
                        'options' => $options,
                        'join_conds' => array(
                                'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
-                               'ipblocks' => array( 'LEFT JOIN', 'user_id=ipb_user AND ipb_deleted=1 AND ipb_auto=0' ),
+                               'ipblocks' => array( 'LEFT JOIN', array(
+                                       'user_id=ipb_user',
+                                       'ipb_deleted' => 1,
+                                       'ipb_auto' => 0
+                               )),
                        ),
                        'conds' => $conds
                );
@@ -183,7 +187,7 @@ class UsersPager extends AlphabeticPager {
                }
 
                wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
-               return "<li>{$item}{$edits}{$created}</li>";
+               return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}" );
        }
 
        function doBatchLookups() {
index 3ece917..af3dbf3 100644 (file)
@@ -258,7 +258,7 @@ class MovePageForm extends UnlistedSpecialPage {
                         Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
                         Xml::openElement( 'fieldset' ) .
                         Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
-                        Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-movepage-table' ) ) .
+                        Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
                         "<tr>
                                <td class='mw-label'>" .
                                        $this->msg( 'movearticle' )->escaped() .
index c37bb1d..7740b32 100644 (file)
@@ -188,7 +188,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 
                        $n = 0;
                        if( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-prefixindex-list-table' ) );
+                               $out = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-list-table' ) );
 
                                while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::makeTitle( $s->page_namespace, $s->page_title );
@@ -227,7 +227,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                } else {
                        $nsForm = $this->namespacePrefixForm( $namespace, $prefix, $hideredirects );
                        $self = $this->getTitle();
-                       $out2 = Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-prefixindex-nav-table' ) )  .
+                       $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) )  .
                                '<tr>
                                        <td>' .
                                                $nsForm .
index 85365f5..5f5b6b4 100644 (file)
@@ -300,7 +300,7 @@ class SpecialSearch extends SpecialPage {
                        )
                );
                $out->addHtml(
-                       Xml::openElement( 'table', array( 'id'=>'mw-search-top-table', 'border'=>0, 'cellpadding'=>0, 'cellspacing'=>0 ) ) .
+                       Xml::openElement( 'table', array( 'id' => 'mw-search-top-table', 'cellpadding' => 0, 'cellspacing' => 0 ) ) .
                        Xml::openElement( 'tr' ) .
                        Xml::openElement( 'td' ) . "\n" .
                        $this->shortDialog( $term ) .
@@ -868,7 +868,7 @@ class SpecialSearch extends SpecialPage {
                for( $i = 0; $i < $numRows; $i += 4 ) {
                        $namespaceTables .= Xml::openElement(
                                'table',
-                               array( 'cellpadding' => 0, 'cellspacing' => 0, 'border' => 0 )
+                               array( 'cellpadding' => 0, 'cellspacing' => 0 )
                        );
                        for( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
                                $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
index d60fcdc..1ef1124 100644 (file)
@@ -1008,7 +1008,7 @@ class SpecialUndelete extends SpecialPage {
                $diffEngine->showDiffStyle();
                $this->getOutput()->addHTML(
                        "<div>" .
-                       "<table border='0' width='98%' cellpadding='0' cellspacing='4' class='diff'>" .
+                       "<table width='98%' cellpadding='0' cellspacing='4' class='diff'>" .
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<col class='diff-marker' />" .
index 59d983f..9f5a48a 100644 (file)
@@ -449,7 +449,7 @@ class UserrightsPage extends SpecialPage {
                        $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
                        $grouplist .
                        Xml::tags( 'p', null, $this->groupCheckboxes( $groups, $user ) ) .
-                       Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-userrights-table-outer' ) ) .
+                       Xml::openElement( 'table', array( 'id' => 'mw-userrights-table-outer' ) ) .
                                "<tr>
                                        <td class='mw-label'>" .
                                                Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
@@ -534,7 +534,7 @@ class UserrightsPage extends SpecialPage {
                }
 
                # Build the HTML table
-               $ret .= Xml::openElement( 'table', array( 'border' => '0', 'class' => 'mw-userrights-groups' ) ) .
+               $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
                        "<tr>\n";
                foreach( $columns as $name => $column ) {
                        if( $column === array() )
index aa65ffe..c7fd23a 100644 (file)
@@ -572,9 +572,10 @@ class UploadStashFile extends UnregisteredLocalFile {
         * ugly file name.
         *
         * @param $params Array: handler-specific parameters
+        * @param $flags integer Bitfield that supports THUMB_* constants
         * @return String: base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
-       function thumbName( $params ) {
+       function thumbName( $params, $flags = 0 ) {
                return $this->generateThumbName( $this->getUrlName(), $params );
        }
 
index 2898e1b..472871f 100644 (file)
@@ -3015,7 +3015,7 @@ class Language {
        function listToText( array $l ) {
                $s = '';
                $m = count( $l ) - 1;
-               
+
                if ( $m === 0 ) {
                        return $l[0];
                } elseif ( $m === 1 ) {
@@ -4197,7 +4197,17 @@ class Language {
         * @return array Associative array with plural form, and plural rule as key-value pairs
         */
        public function getCompiledPluralRules() {
-               return self::$dataCache->getItem( strtolower( $this->mCode ), 'compiledPluralRules' );
+               $pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'compiledPluralRules' );
+               $fallbacks = Language::getFallbacksFor( $this->mCode );
+               if ( !$pluralRules ) {
+                       foreach ( $fallbacks as $fallbackCode ) {
+                               $pluralRules = self::$dataCache->getItem( strtolower( $fallbackCode ), 'compiledPluralRules' );
+                               if ( $pluralRules ) {
+                                       break;
+                               }
+                       }
+               }
+               return $pluralRules;
        }
 
        /**
@@ -4206,7 +4216,17 @@ class Language {
         * @return array Associative array with plural form, and plural rule as key-value pairs
         */
        public function getPluralRules() {
-               return self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
+               $pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
+               $fallbacks = Language::getFallbacksFor( $this->mCode );
+               if ( !$pluralRules ) {
+                       foreach ( $fallbacks as $fallbackCode ) {
+                               $pluralRules = self::$dataCache->getItem( strtolower( $fallbackCode ), 'pluralRules' );
+                               if ( $pluralRules ) {
+                                       break;
+                               }
+                       }
+               }
+               return $pluralRules;
        }
 
        /**
index 965ea6a..5623f3c 100644 (file)
@@ -54,21 +54,4 @@ class LanguageHsb extends Language {
                return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values
        }
 
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 4 );
-
-               switch ( abs( $count ) % 100 ) {
-                       case 1:  return $forms[0]; // singular
-                       case 2:  return $forms[1]; // dual
-                       case 3:
-                       case 4:  return $forms[2]; // plural
-                       default: return $forms[3]; // pluralgen
-               }
-       }
 }
diff --git a/languages/classes/LanguageLn.php b/languages/classes/LanguageLn.php
deleted file mode 100644 (file)
index d7329d5..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * Lingala (Lingála) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Lingala (Lingála)
- *
- * @ingroup Language
- */
-class LanguageLn extends Language {
-       /**
-        * Use singular form for zero
-        * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ln
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
diff --git a/languages/classes/LanguageMo.php b/languages/classes/LanguageMo.php
deleted file mode 100644 (file)
index bf8a10d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Moldavian (Молдовеняскэ) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Moldavian (Молдовеняскэ)
- *
- * @ingroup Language
- */
-class LanguageMo extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               // Plural rules per
-               // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mo
-               // Identical to Romanian (ro).
-               if ( !count( $forms ) ) { return ''; }
-
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       $index = 0;
-               } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
-                       $index = 1;
-               } else {
-                       $index = 2;
-               }
-               return $forms[$index];
-       }
-}
diff --git a/languages/classes/LanguageRo.php b/languages/classes/LanguageRo.php
deleted file mode 100644 (file)
index 0db2ec0..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Romanian (Română) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Romanian (Română)
- *
- * @ingroup Language
- */
-class LanguageRo extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               // Plural rules per
-               // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ro
-               if ( !count( $forms ) ) { return ''; }
-
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       $index = 0;
-               } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
-                       $index = 1;
-               } else {
-                       $index = 2;
-               }
-               return $forms[$index];
-       }
-}
diff --git a/languages/classes/LanguageSe.php b/languages/classes/LanguageSe.php
deleted file mode 100644 (file)
index 25b61c3..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Northern Sami (Sámegiella) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Northern Sami (Sámegiella)
- *
- * @ingroup Language
- */
-class LanguageSe extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               // plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#se
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       $index = 0;
-               } elseif ( $count == 2 ) {
-                       $index = 1;
-               } else {
-                       $index = 2;
-               }
-               return $forms[$index];
-       }
-}
diff --git a/languages/classes/LanguageSma.php b/languages/classes/LanguageSma.php
deleted file mode 100644 (file)
index 1961871..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Southern Sami (Åarjelsaemien) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Southern Sami (Åarjelsaemien)
- *
- * @ingroup Language
- */
-class LanguageSma extends Language {
-
-       /**
-        * @param $count int
-        * @param $forms array
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-
-               // plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sma
-               $forms = $this->preConvertPlural( $forms, 3 );
-
-               if ( $count == 1 ) {
-                       $index = 0;
-               } elseif ( $count == 2 ) {
-                       $index = 1;
-               } else {
-                       $index = 2;
-               }
-               return $forms[$index];
-       }
-}
index 54f23dc..65e27ca 100644 (file)
@@ -6,7 +6,7 @@
                        <pluralRule count="one">n is 1</pluralRule>
                        <pluralRule count="two">n is 2</pluralRule>
                </pluralRules>
-               <pluralRules locales="dsb">
+               <pluralRules locales="dsb hsb">
                        <pluralRule count="one">n mod 100 is 1</pluralRule>
                        <pluralRule count="two">n mod 100 is 2</pluralRule>
                        <pluralRule count="few">n mod 100 in 3..4</pluralRule>
@@ -31,5 +31,9 @@
                        <pluralRule count="twelve">n is 12</pluralRule>
                        <pluralRule count="few">n in 3..10 or n in 13..19</pluralRule>
                </pluralRules>
+               <!-- Hopefully temporary overrides for bug 40251 -->
+               <pluralRules locales="fa hu ja vi">
+                       <pluralRule count="one">n is 1</pluralRule>
+               </pluralRules>
        </plurals>
 </supplementalData>
index c243fa0..5ec4754 100644 (file)
@@ -408,10 +408,12 @@ $messages = array(
 
 'versionrequired' => 'Peureulee MediaWiki versi $1',
 
+'ok' => 'Ka göt',
 'retrievedfrom' => 'Geurumpok nibak "$1"',
 'youhavenewmessages' => 'Droëneuh   na $1 ($2).',
 'newmessageslink' => 'peusan barô',
 'newmessagesdifflink' => 'neuubah keuneulheuëh',
+'youhavenewmessagesmulti' => 'Droëneuh na padum boh peusan barô bak $1',
 'editsection' => 'andam',
 'editold' => 'andam',
 'viewsourceold' => 'Eu nè',
@@ -421,6 +423,11 @@ $messages = array(
 'toc' => 'Asoë',
 'showtoc' => 'peuleumah',
 'hidetoc' => 'peusom',
+'collapsible-collapse' => 'Peuubeut',
+'collapsible-expand' => 'Peuluwaih',
+'thisisdeleted' => 'Eu atawa peuriwang $1?',
+'viewdeleted' => 'Eu $1?',
+'restorelink' => '$1 {{PLURAL:$1|neuandam|neuandam}} nyang ka geusampoh',
 'site-rss-feed' => 'Umpeuën RSS $1',
 'site-atom-feed' => 'Umpeuën Atôm $1',
 'page-rss-feed' => 'Umpeuën RSS "$1"',
@@ -448,6 +455,8 @@ Nyoë biasajih sabab hubông useuëng u geunantoë away nyang ka teusampôh.
 
 Meunyo kön nyoë sababjih, Droëneuh kadang ka neuteumèë saboh bug lam software. Neutulông peugah bhah nyoë bak salah sidroë [[Special:ListUsers/sysop|Nyang urôh]], ngön neupeugah alamat URL nyang neusaweuë.',
 'missingarticle-rev' => '(revisi#: $1)',
+'internalerror' => 'Salah bak dalam',
+'internalerror_info' => 'Salah bak dalam: $1',
 'badtitle' => 'Nan hana sah',
 'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.',
 'viewsource' => 'Eu nè',
index eb47ce2..322ebc4 100644 (file)
@@ -2049,7 +2049,7 @@ $1',
 'backend-fail-internal' => 'وقع خطأ غير معروف في خلفية التخزين "$1".',
 'backend-fail-contenttype' => 'تعذر تحديد نوع محتوى الملف الذي تريد تخزينه في "$1".',
 'backend-fail-batchsize' => 'أعطت خلفية التخزين دفعة $1 ملف {{PLURAL:$1|عملية|عمليات}}; الحد الأقصى هو $2 {{PLURAL:$2|عملية|عمليات}}.',
-'backend-fail-usable' => 'تعذر Ù\83تابة Ø§Ù\84Ù\85Ù\84Ù\81 $1 لنقص في التراخيص أو فقدان الدلائل/الحاويات.',
+'backend-fail-usable' => 'تعذر Ù\82راءة Ø£Ù\88 Ù\83تابة Ø§Ù\84Ù\85Ù\84Ù\81 "$1" لنقص في التراخيص أو فقدان الدلائل/الحاويات.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'تعذر ربط الإتصال بقاعدة بيانات خلفية التخزين "$1".',
@@ -2851,7 +2851,7 @@ $1',
 'ipb-confirm' => 'أكّد المنع',
 'badipaddress' => 'عنوان أيبي غير صحيح',
 'blockipsuccesssub' => 'تم المنع بنجاح',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] تم منعها.<br />
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] تم {{GENDER:$1|منعه|منعها}}.<br />
 أنظر [[Special:BlockList|قائمة منع الآيبي]] لمراجعة حالات المنع.',
 'ipb-blockingself' => 'أنت على وشك منع نفسك! أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-confirmhideuser' => 'أنت على وشك منع مستخدم مع تفعيل خيار "أخف المستخدم". سوف يخفي هذا الخيار اسم المستخدم من جميل القوائم ومدخلات السجلات. أمتأكد من رغبتك في القيام بذلك؟',
index 147d19a..a69fab4 100644 (file)
@@ -320,6 +320,10 @@ $1',
 'youhavenewmessages' => 'ܐܝܬ ܠܟ $1 ($2).',
 'newmessageslink' => 'ܐܓܪ̈ܬܐ ܚܕ̈ܬܬܐ',
 'newmessagesdifflink' => 'ܫܘܚܠܦܐ ܐܚܪܝܐ',
+'youhavenewmessagesfromusers' => 'ܐܝܬ ܠܟ $1 ܡܢ {{PLURAL:$3|ܡܦܠܚܢܐ ܐܚܪܢܐ|$3 ܡܦܠܚܢ̈ܐ}} ($2).',
+'youhavenewmessagesmanyusers' => 'ܐܝܬ ܠܟ $1 ܡܢ ܡܦܠܚܢ̈ܐ ܣܓܝܐ̈ܐ ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ܐܓܪܬܐ ܚܕܬܐ|ܐܓܪ̈ܬܐ ܚܕ̈ܬܬܐ}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ|ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}}',
 'youhavenewmessagesmulti' => 'ܐܝܬ ܠܟ ܐܓܪ̈ܬܐ ܚܕ̈ܬܬܐ ܒ $1',
 'editsection' => 'ܫܚܠܦ',
 'editold' => 'ܫܚܠܦ',
@@ -663,6 +667,7 @@ $1',
 'prefs-watchlist-days-max' => 'ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}}',
 'prefs-misc' => 'ܦܪ̈ܝܫܬܐ',
 'prefs-resetpass' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
+'prefs-changeemail' => 'ܫܚܠܦ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-email' => 'ܓܒܝܬ̈ܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-rendering' => 'ܐܣܟܝܡܐ',
 'saveprefs' => 'ܠܒܘܟ',
index dd00e1c..fe36fae 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Araucanian (mapudungun)
+/** Mapuche (mapudungun)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -107,7 +107,9 @@ $messages = array(
 
 # Cologne Blue skin
 'qbfind' => 'Kintupe',
+'qbbrowse' => 'Kintun',
 'qbedit' => 'Pepikape',
+'qbpageoptions' => 'Tüfachi wülngiñ',
 'qbpageinfo' => 'Trokiñdungu',
 'qbmyoptions' => 'tañi nütramkawe',
 'qbspecialpages' => 'Kangelu',
@@ -180,6 +182,7 @@ $messages = array(
 'jumpto' => 'Amulün:',
 'jumptonavigation' => 'miyawün',
 'jumptosearch' => 'kintun',
+'pool-errorunknown' => 'Kimnoelchi welulkan',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} ñi dungu',
@@ -204,6 +207,7 @@ $messages = array(
 'youhavenewmessages' => 'Nieymi $1 ($2).',
 'newmessageslink' => 'weke werkün',
 'newmessagesdifflink' => 'we kalekünun',
+'newmessagesdifflinkplural' => 'we {{PLURAL:$1|kalekünuy|kalekünuy}}',
 'youhavenewmessagesmulti' => 'Nieymi we yefalzugu $1 mew.',
 'editsection' => 'Wirin',
 'editold' => 'kümeelün',
@@ -214,15 +218,22 @@ $messages = array(
 'toc' => 'Trokiñdungu',
 'showtoc' => 'pegelpe',
 'hidetoc' => 'ellkangepe',
+'thisisdeleted' => 'Pen kam kümeeltun $1?',
 'viewdeleted' => 'Küpaadkintuymi $1 am?',
 'restorelink' => '{{PLURAL:$1|kiñe wirin ñamümgün|$1 wirin ñamümün}}',
+'feedlinks' => 'Amuldungu:',
+'site-rss-feed' => '$1 RSS ñi amuldungu',
 'site-atom-feed' => '$1 ñi Atom ñi amuldungu',
+'page-rss-feed' => '«$1» RSS ñi amuldungu',
 'page-atom-feed' => '$1 ñi Atom ñi amuldungu',
 'red-link-title' => '$1 (ngelay tichi adtapül)',
+'sort-descending' => 'Kümeelngen minche püle',
+'sort-ascending' => 'Kümeelngen püra püle',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Wülngiñ',
 'nstab-user' => 'Kellufe',
+'nstab-media' => 'Ad ñi wülngiñ',
 'nstab-special' => 'Wichu wülngiñ',
 'nstab-project' => 'Deumandungu wülngiñ',
 'nstab-image' => 'Eltukawün',
@@ -231,6 +242,9 @@ $messages = array(
 'nstab-help' => 'Kelluwe',
 'nstab-category' => 'Trokiñ',
 
+# Main script and global functions
+'nosuchaction' => 'Mülelay feychi femün',
+
 # General errors
 'error' => 'Welulkan',
 'missing-article' => 'Feychi ngülümdunguwe kintulay feychi wülngiñ ñi wirin, welu nienuafulu. Ñi üy ta "$1" $2.
@@ -245,6 +259,7 @@ Femnuale, welulkafuy feychi küzauwe. Feypimi tüfachi dungu kiñe [[Special:Lis
 'badtitletext' => 'Tüfachi wülngiñ ñi üy kümelay, welliley kam niey weda lasun nülkükawlelu kake dungun kam kake wiki wülngiñ ñi üy.
 Nieafuy falinochi wirin püñamtuam wülngiñ ñi üy.',
 'viewsource' => 'Kimam chew küpan chi wirin',
+'exception-nologin' => 'Petu konlaymi',
 
 # Login and logout pages
 'yourname' => 'Tami üy',
index 8cb86de..c0e7226 100644 (file)
@@ -226,7 +226,7 @@ $messages = array(
 'namespaces' => 'Espacios de nome',
 'variants' => 'Variantes',
 
-'errorpagetitle' => 'Fallu',
+'errorpagetitle' => 'Error',
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayuda',
@@ -375,7 +375,7 @@ Tamién podría ser un bug nel software usáu por {{SITENAME}}.",
 Pues atopar una llista de les páxines especiales válides en [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Fallu',
+'error' => 'Error',
 'databaseerror' => 'Fallu na base de datos',
 'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
 Esti fallu pue ser por un problema del software.
@@ -1013,10 +1013,11 @@ Nun tienes accesu al mesmu.',
 'revdelete-concurrent-change' => "Error al camudar l'elementu con data $2, $1: paez que'l so estáu camudólu otra persona mientres tentabes camudalu tu.
 Comprueba los rexistros, por favor.",
 'revdelete-only-restricted' => "Fallu al anubrir l'elementu con data $1, $2: nun se puen quitar elementos de la vista de los alministradores ensin escoyer tamién una de les otres opciones de visibilidá.",
-'revdelete-reason-dropdown' => '*Razones comúnes de desaniciu 
+'revdelete-reason-dropdown' => "*Razones comúnes de desaniciu 
 ** Violación del Copyright
-** Información personal non apropiada
-** Información potencialmente bilordiosa',
+** Información personal o comentariu non apropiáu
+** Nome d'usuariu non apropiáu
+** Información potencialmente bilordiosa",
 'revdelete-otherreason' => 'Motivu distintu/adicional:',
 'revdelete-reasonotherlist' => 'Otru motivu',
 'revdelete-edit-reasonlist' => 'Editar motivos del desaniciu',
index 3de6c84..a68e84c 100644 (file)
@@ -1790,7 +1790,7 @@ $1',
 'backend-fail-internal' => 'Узьнікла невядомая памылка на сэрвэры сховішча «$1».',
 'backend-fail-contenttype' => 'Немагчыма вызначыць тып зьместу файла, які мусіць быць захаваны ў «$1».',
 'backend-fail-batchsize' => 'Cховішча атрымала блёк з $1 {{PLURAL:$1|файлавай апэрацыі|файлавых апэрацыяў|файлавых апэрацыяў}}; абмежаваньне складае $2 {{PLURAL:$2|апэрацыю|апэрацыі|апэрацыяў}}.',
-'backend-fail-usable' => 'Ð\9dе Ð°Ñ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл $1 з-за недастачы правоў ці адсутнасьці дырэкторыяў або кантэйнэраў.',
+'backend-fail-usable' => 'Ð\9dе Ð°Ñ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f Ð¿Ñ\80аÑ\87Ñ\8bÑ\82аÑ\86Ñ\8c Ñ\86Ñ\96 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл Â«$1» з-за недастачы правоў ці адсутнасьці дырэкторыяў або кантэйнэраў.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не атрымалася злучыцца з базай зьвестак журнала для сховішча «$1».',
index fd22a46..9d3b58e 100644 (file)
@@ -75,7 +75,7 @@ $messages = array(
 'tog-hidepatrolled' => 'পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো',
 'tog-newpageshidepatrolled' => 'পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো',
 'tog-extendwatchlist' => 'শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন।',
-'tog-usenewrc' => 'à¦\89নà§\8dনততর à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦¬à§\8dযবহার à¦\95রà§\81ন (জাভাস্ক্রিপ্ট প্রয়োজন)',
+'tog-usenewrc' => 'সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\8fবà¦\82 à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦\8fà¦\95তà§\8dরà§\87 à¦ªà§\8dরদরà§\8dশন (জাভাস্ক্রিপ্ট প্রয়োজন)',
 'tog-numberheadings' => 'শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমাঙ্কিত করা হোক',
 'tog-showtoolbar' => 'সম্পাদনা টুলবার দেখানো হোক (জাভাস্ক্রিপ্ট)',
 'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
@@ -83,17 +83,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে <br />পরিচ্ছেদ সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
 'tog-showtoc' => 'সূচিপত্র দেখানো হোক (৩টির বেশি পরিচ্ছেদের শিরোনামবিশিষ্ট পাতার জন্য)',
 'tog-rememberpassword' => 'এই ব্রাউজারে আমার লগ ইন তথ্য (শব্দচাবি) মনে রাখো (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
-'tog-watchcreations' => 'আমার তৈরি পাতাগুলি আমার নজরতালিকায় যোগ করা হোক',
-'tog-watchdefault' => 'আমার সম্পাদিত পাতাগুলি আমার নজরতালিকায় যোগ করা হোক',
-'tog-watchmoves' => 'আমার সরিয়ে ফেলা পাতাগুলি আমার নজরতালিকায় যোগ করা হোক',
-'tog-watchdeletion' => 'আমার মুছে ফেলা পাতাগুলি আমার নজর তালিকায় যোগ করা হোক',
+'tog-watchcreations' => 'আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক',
+'tog-watchdefault' => 'আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক',
+'tog-watchmoves' => 'আমার সরিয়ে ফেলা পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক',
+'tog-watchdeletion' => 'আমার মুছে ফেলা পাতা এবং ফাইলগুলো আমার নজর তালিকায় যোগ করা হোক',
 'tog-minordefault' => 'শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক',
 'tog-previewontop' => 'সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক',
 'tog-previewonfirst' => 'প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক',
 'tog-nocache' => 'ব্রাউজার পাতা ক্যাশিং নিষ্ক্রিয় করো',
-'tog-enotifwatchlistpages' => 'আমার নজর তালিকায় আছে এমন পাতাে পরিবর্তন হলে তা জানিয়ে আমাকে ই-মেইল করো',
+'tog-enotifwatchlistpages' => 'আমার নজর তালিকায় আছে এমন পাতা অথবা ফাইলে পরিবর্তন হলে তা জানিয়ে আমাকে ই-মেইল করো',
 'tog-enotifusertalkpages' => 'আমার ব্যবহারকারী আলোচনা পাতার পরিবর্তন হলে আমাকে ই-মেইল করা হোক',
-'tog-enotifminoredits' => 'পাতাগুলির অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক',
+'tog-enotifminoredits' => 'পাতা এবং ফাইলগুলোতে অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক',
 'tog-enotifrevealaddr' => 'বিজ্ঞপ্তি মেইলে আমার ই-মেইল ঠিকানা প্রকাশ করা হোক',
 'tog-shownumberswatching' => 'নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক',
 'tog-oldsig' => 'বর্তমান স্বাক্ষর:',
@@ -391,8 +391,8 @@ $1',
 সফটওয়্যারে কোন বাগের কারণে এমন হতে পারে।
 সর্বশেষ ডাটাবেজ কোয়েরিটি ছিল এরকম:
 <blockquote><tt>$1</tt></blockquote>
-"<tt>$2</tt>" ফাংশনের ভিতর থেকে।
-ডাটাবেজ যে ত্রুটি পাঠিয়েছে: "<tt>$3: $4</tt>"।',
+"<code>$2</code>" ফাংশনের ভিতর থেকে।
+ডাটাবেজ যে ত্রুটি পাঠিয়েছে: "<samp>$3: $4</samp>"।',
 'dberrortextcl' => 'ডাটাবেজ কোয়েরি সিনট্যাক্স ত্রুটি ঘটেছে।
 সর্বশেষ ডাটাবেজ কোয়েরিটি ছিল:
 "$1"
@@ -446,8 +446,11 @@ $1',
 'protectedpagetext' => 'সম্পাদনা এড়াতে এ পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে।',
 'viewsourcetext' => 'এ পাতাটি আপনি দেখতে এবং উৎসের অনুলিপি নিতে পারবেন:',
 'viewyourtext' => "আপনি ' ' ' আপনার সম্পাদনা ' ' ' এই পাতায় দেখতে এবং কপি করতে পারেন:",
-'protectedinterface' => 'এই পাতার বিষয়বস্তু উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।',
-'editinginterface' => "'''সতর্কীকরণ:''' আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে। এই পাতাতে সংঘটিত পরিবর্তন ব্যবহারকারী ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন। অনুবাদের জন্য অনুগ্রহ করে [//translatewiki.net/wiki/Main_Page?setlang=bn translatewiki.net] ব্যবহার করার ব্যাপারটি বিবেচনা করুন। এটি মিডিয়াউইকি স্থানীয়করণ প্রকল্প।",
+'protectedinterface' => 'এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।
+সকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।',
+'editinginterface' => "'''সতর্কীকরণ:''' আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।
+এই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।
+সকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
 'sqlhidden' => '(এস কিউ এল কোয়েরি লুকানো আছে)',
 'cascadeprotected' => 'এই পাতাটি সম্পাদনা থেকে সুরক্ষিত, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতার|টি পাতার}} অন্তর্গত, যে পাতা(গুলি) "প্রপাতাকার" (cascading) বৈশিষ্ট্য সহযোগে সুরক্ষিত করা হয়েছে:
 $2',
@@ -723,6 +726,10 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'noarticletext-nopermission' => 'বর্তমানে এই পাতায় কোন লেখা নেই।
 আপনি চাইলে অন্য পাতায় [[Special:Search/{{PAGENAME}}| শিরোনামটি অনুসন্ধান করতে পারেন]],
 অথবা <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পর্কিত লগ অনুসন্ধান করতে পারেন]</span>।',
+'missing-revision' => '"{{PAGENAME}}" এর #$1তম সংস্করণটি প্রদর্শন সম্ভব নয়।
+
+সাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। 
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" নামের কোন ব্যবহারকারী অ্যাকাউন্ট নিবন্ধিত হয়নি। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি এই পাতাটি সৃষ্টি/সম্পাদনা করতে চান কি না।',
 'userpage-userdoesnotexist-view' => 'ব্যবহারকারী অ্যাকাউন্ট "$1" অনিবন্ধিত।',
 'blocked-notice-logextract' => 'এই ব্যবহারকারী বর্তমানে ব্লক রয়েছে।
@@ -731,7 +738,6 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 * '''ফায়ারফক্স / সাফারি:''' ''শিফট'' কি ধরে রাখা অবস্থায় ''রিলোড''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' বা ''Ctrl-R'' (ম্যাক-এ ''⌘-R'') চাপুন
 * '''গুগল ক্রোম:''' ''Ctrl-Shift-R'' (ম্যাক-এ ''⌘-Shift-R'') চাপুন
 * '''ইন্টারনেট এক্সপ্লোরার:''' ''Ctrl'' কি ধরে রাখা অবস্থায় ''রিফ্রেশ''-এ ক্লিক করুন, অথবা ''Ctrl-F5'' চাপুন
-* '''কনকুয়েরার:''' ''রিলোড''-এ ক্লিক করুন বা ''F5'' চাপুন
 * '''অপেরা:''' ''টুলস → প্রিফারেন্স''-এ গিয়ে ক্যাশে পরিস্কার করে নিন",
 'usercssyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
 'userjsyoucanpreview' => "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
@@ -836,6 +842,13 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'parser-template-loop-warning' => 'টেম্পলেট লুপ সনাক্ত হয়েছে: [[$1]]',
 'parser-template-recursion-depth-warning' => 'টেমপ্লেট  পুনরাবৃত্তি (রিকার্শন)  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
 'language-converter-depth-warning' => 'ভাষা পরিবর্তন  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'node-count-exceeded-category' => 'যে সকল পাতার নোড কাউন্ট সীমানা পার হয়েছে',
+'node-count-exceeded-warning' => 'পাতাটি নোড কাউন্ট সীমানা পার করেছে',
+'expansion-depth-exceeded-category' => 'যে সকল পাতার এক্সেপশন সীমানা অতিক্রম করেছে',
+'expansion-depth-exceeded-warning' => 'পাতাটি এক্সেপশন সীমানা অতিক্রম করেছে',
+'parser-unstrip-loop-warning' => 'ত্রুটিপূর্ণ লুপ খুঁজে পাওয়া গিয়েছে',
+'parser-unstrip-recursion-limit' => 'লুপ রিকারশন সীমানা অতিক্রম করেছে ($1)',
+'converter-manual-rule-error' => 'ভাষা পরিবর্তন রুলে ত্রুটি পাওয়া গিয়েছে',
 
 # "Undo" feature
 'undo-success' => 'সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।',
@@ -919,13 +932,20 @@ $3-এর দেয়া কারণ হল ''$2''",
 'revdelete-nologtype-title' => 'কোনো লগ টাইপ দেওয়া হয়নি।',
 'revdelete-nologtype-text' => 'আপনি হয়তো এই কাজটি করার জন্য কোনো লগ নির্ধারণ করেননি।',
 'revdelete-nologid-title' => 'ভুল লগ ভুক্তি',
+'revdelete-nologid-text' => 'হয়তো আপনি এই ফাংশনটির জন্য কোনো লগ ইভেন্ট নির্ধারণ করে দেননি, অথবা নির্ধারিত ইভেন্টটি সঠিক নয়।',
 'revdelete-no-file' => 'নির্ধারিত ফাইলটি নেই।',
+'revdelete-show-file-confirm' => 'আপনি কি নিশ্চিত যে "<nowiki>$1</nowiki>" ফাইলের $2 তারিখের $3 টার অপসারণ লগ দেখানো হবে?',
 'revdelete-show-file-submit' => 'হ্যাঁ',
 'revdelete-selected' => "'''[[:$1]] পাতার {{PLURAL:$2|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|টি নির্বাচিত লগ-ঘটনা|টি নির্বাচিত লগ-ঘটনা}}:'''",
 'revdelete-text' => "'''মুছে ফেলা সংশোধনগুলো এবং ঘটনাগুলি এখনও পাতার ইতিহাস ও লগগুলোতে দেখাবে, কিন্তু তাদের বিষয়বস্তুর অংশবিশেষ সর্বোসাধারণের জন্য উন্মুক্ত থাকবে না।'''
 
 {{SITENAME}} এর অন্যান্য প্রশাসকগণ লুকানো এই বিষয়বস্তু দেখতে পাবেন এবং বাড়তি কোনো সীমাবদ্ধতা না থাকলে একই ইন্টারফেসের মাধ্যমে এটি পুনরুদ্ধার করতে পারবেন।",
+'revdelete-confirm' => 'অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।',
+'revdelete-suppress-text' => "'''কেবলমাত্র''' নিচের বিষয়গুলোর ক্ষেত্রেই চাপাচাপি করা যাবে:
+* সম্ভাব্য মানহানিকর তথ্য
+* ভুল ব্যক্তিগত তথ্য
+*:  ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
 'revdelete-legend' => 'দৃষ্টিপাত সীমাবদ্ধ করো',
 'revdelete-hide-text' => 'সংশোধিত লেখা আড়াল করো',
 'revdelete-hide-image' => 'ফাইলের বিষয়বস্তু আড়াল করো',
@@ -941,6 +961,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 'revdelete-log' => 'কারণ:',
 'revdelete-submit' => 'নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো',
 'revdelete-success' => "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
+'revdelete-failure' => "'''রিভিশন ভিজিবিলিটি আপডেট সম্ভব নয়:'''
+$1",
 'logdelete-success' => "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
 'logdelete-failure' => "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''
 $1",
index 8f3ccf6..6a47be7 100644 (file)
@@ -837,7 +837,9 @@ Gallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù a
 'noarticletext-nopermission' => 'N\'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.
 Gallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,
 pe <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>.',
-'missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
+'missing-revision' => "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{PAGENAME}} ».
+
+C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
 Gallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 'userpage-userdoesnotexist' => 'N\'eo ket enrollet ar gont "<nowiki>$1</nowiki>". Merkit ma fell deoc\'h krouiñ/kemmañ ar bajenn-mañ.',
 'userpage-userdoesnotexist-view' => 'N\'eo ket enrollet ar gont implijer "$1".',
@@ -1091,9 +1093,10 @@ N\'oc\'h ket aotreet da vont outi.',
 'revdelete-no-change' => "'''Evezh :''' emañ an arventennoù gweluster goulennet gant an elfenn deiziataet eus an $1 da $2 dija",
 'revdelete-concurrent-change' => "Fazi p'eo bet kemmet an elfenn deiziataet eus an $1 da $2 : cheñchet eo bet e statud gant unan bennak all dres pa oac'h-chwi o kemmañ anezhi. Gwiriit ar marilhoù.",
 'revdelete-only-restricted' => "Ur fazi zo bet en ur guzhat an elfenn deiziadet eus an $1 da $2 : n'hallit ket kuzhat an elfennoù-mañ ouzh ar verourien hep dibab ivez unan eus an dibarzhioù gweluster all.",
-'revdelete-reason-dropdown' => '*Abegoù diverkañ boutin
+'revdelete-reason-dropdown' => "*Abegoù diverkañ boutin
 **Gaou ouzh ar gwirioù implijout
-** Titouroù personel dizereat',
+**Titouroù personel dizereat
+** Titouroù a c'hall bezañ gwallvrudus",
 'revdelete-otherreason' => 'Abeg all/ouzhpenn :',
 'revdelete-reasonotherlist' => 'Abeg all',
 'revdelete-edit-reasonlist' => 'Kemmañ abegoù an diverkañ',
@@ -1144,7 +1147,9 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'editundo' => 'dizober',
 'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
-'difference-missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.
+'difference-missing-revision' => "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.
+
+C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.
 Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 
 # Search results
@@ -1979,6 +1984,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'mostlinkedtemplates' => 'Patromoù implijet ar muiañ',
 'mostcategories' => 'Pennadoù rummatet ar muiañ',
 'mostimages' => 'Skeudennoù implijet ar muiañ',
+'mostinterwikis' => 'Pajennoù gant an niver brasañ a etrewikioù',
 'mostrevisions' => 'Pennadoù bet kemmet ar muiañ',
 'prefixindex' => 'An holl bajennoù a grog gant...',
 'prefixindex-namespace' => 'An holl bajennoù enno ur rakger (esaouenn anv $1)',
@@ -2276,6 +2282,8 @@ taolit evezh bras.",
 'rollback' => "disteuler ar c'hemmoù",
 'rollback_short' => 'Disteuler',
 'rollbacklink' => 'disteuler',
+'rollbacklinkcount' => 'terriñ $1 {{PLURAL:$1|kemm|kemmañ}}',
+'rollbacklinkcount-morethan' => 'terriñ ouzhpenn $1 {{PLURAL:$1|kemm|kemmoù}}',
 'rollbackfailed' => "C'hwitet eo bet an distaoladenn",
 'cantrollback' => 'Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ',
 'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2756,6 +2764,7 @@ Miret eo an holl enporzhiadennoù etrewiki e-barzh [[Special:Log/import|log an e
 'import-interwiki-templates' => 'Lakaat e-barzh an holl batromoù',
 'import-interwiki-submit' => 'Enporzhiañ',
 'import-interwiki-namespace' => 'Esaouenn anv ar pal :',
+'import-interwiki-rootpage' => 'Pennpajenn kas (war zibab)',
 'import-upload-filename' => 'Anv ar restr :',
 'import-comment' => 'Notenn :',
 'importtext' => "Ezporzhiit ar restr adal ar wiki orin en ur ober gant an arc'hwel [[Special:Export|ezporzhiañ]].
@@ -2789,6 +2798,8 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
 'import-error-special' => 'Ne vez ket enporzhiet ar bajenn "$1" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.',
 'import-error-invalid' => 'Ne vez ket enporzhiet ar bajenn "$1" rak direizh eo hec\'h anv.',
 'import-options-wrong' => '{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => "Pourchas a ra ar bennbajenn un titl n'eo ket reizh.",
+'import-rootpage-nosubpage' => 'Esaouenn anvioù "$1" eus ar bennpajenn ne aotre ket an ispajennoù.',
 
 # Import log
 'importlogpage' => 'Log an enporzhiadennoù',
index 8c02b3f..4020105 100644 (file)
@@ -717,7 +717,7 @@ $2
 'hr_tip' => 'هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)',
 
 # Edit pages
-'summary' => 'پوختە:',
+'summary' => 'کورتەی دەستکاری:',
 'subject' => 'بابەت/سەردێڕ:',
 'minoredit' => 'ئەمە دەستکارییەکی بچووکە',
 'watchthis' => 'چاودێریی ئەم پەڕە بکە',
@@ -1310,7 +1310,7 @@ $1",
 'group-autoconfirmed' => 'بەکارھێنەرانی پەسندکراوی خۆگەڕ',
 'group-bot' => 'بۆتەکان',
 'group-sysop' => 'بەڕێوبەران',
-'group-bureaucrat' => 'بورووکراتەکان',
+'group-bureaucrat' => 'بیوروکراتەکان',
 'group-suppress' => 'چاودێرەکان',
 'group-all' => '(هەموو)',
 
@@ -1318,14 +1318,14 @@ $1",
 'group-autoconfirmed-member' => '{{GENDER:$1|بەکارھێنەرانی پەسندکراوی خۆگەڕ}}',
 'group-bot-member' => 'بۆت',
 'group-sysop-member' => '{{GENDER:$1|بەڕێوبەر}}',
-'group-bureaucrat-member' => '{{GENDER:$1|بورووکرات}}',
+'group-bureaucrat-member' => '{{GENDER:$1|بیوروکرات}}',
 'group-suppress-member' => '{{GENDER:$1|چاودێر}}',
 
 'grouppage-user' => '{{ns:project}}:بەکارھێنەران',
 'grouppage-autoconfirmed' => '{{ns:project}}:بەکارھێنەرانی پەسندکراوی خۆگەڕ',
 'grouppage-bot' => '{{ns:project}}:بۆتەکان',
 'grouppage-sysop' => '{{ns:project}}:بەڕێوبەران',
-'grouppage-bureaucrat' => '{{ns:project}}:بورووکراتەکان',
+'grouppage-bureaucrat' => '{{ns:project}}:بیوروکراتەکان',
 'grouppage-suppress' => '{{ns:project}}:چاودێر',
 
 # Rights
@@ -1432,7 +1432,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
 'recentchanges' => 'دوایین گۆڕانکارییەکان',
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
-'recentchanges-summary' => 'لەم پەڕەدا بە دوای دوایین گۆڕانکارییەکان لەم ویکیەدا بکەوە.',
+'recentchanges-summary' => 'دوایین گۆڕانکارییەکانیی ویکی لەم پەڕەیەدا ببینە.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
 'recentchanges-label-newpage' => 'ئەم دەستکارییە لاپەڕەیەکی نوێی دروستکرد',
 'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
index bd82570..7e88001 100644 (file)
@@ -735,8 +735,11 @@ Dotaz: $2',
 'protectedpagetext' => 'Tato stránka byla zamčena, takže ji nelze editovat.',
 'viewsourcetext' => 'Můžete si prohlédnout a zkopírovat zdrojový kód této stránky:',
 'viewyourtext' => "Můžete si prohlédnout a zkopírovat zdrojový kód '''vašich změn''' této stránky:",
-'protectedinterface' => 'Tato stránka obsahuje text softwarového rozhraní a smějí ji editovat jen správci.',
-'editinginterface' => "'''Upozornění:''' Editujete stránku, která definuje texty rozhraní. Změny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům. Při úpravách českého překladu zvažte použití [//translatewiki.net/wiki/Main_Page?setlang=cs translatewiki.net], projektu pro lokalizaci MediaWiki.",
+'protectedinterface' => 'Tato stránka obsahuje text softwarového rozhraní a je zamčena kvůli prevenci zneužití.
+Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.',
+'editinginterface' => "'''Upozornění:''' Editujete stránku, která definuje texty rozhraní.
+Změny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.
+Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
 'sqlhidden' => '(SQL dotaz skryt)',
 'cascadeprotected' => 'Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky zamčené|následujících stránek zamčených|následujících stránek zamčených}} kaskádovým zámkem:
 $2',
@@ -1886,7 +1889,7 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
 'backend-fail-internal' => 'V koncovém úložném systému „$1“ došlo k neznámé chybě.',
 'backend-fail-contenttype' => 'Nelze určit typ obsahu souboru k uložení do „$1“.',
 'backend-fail-batchsize' => 'Koncový úložný systém přijal dávku s $1 {{PLURAL:souborovou operací|souborovými operacemi}}; maximum je {{PLURAL:$2|$2}}.',
-'backend-fail-usable' => 'Nepodařilo se zapsat do souboru $1 kvůli nedostatečným oprávněním nebo chybějícím adresářům/kontejnerům.',
+'backend-fail-usable' => 'Nepodařilo se zapsat do souboru „$1“ kvůli nedostatečným oprávněním nebo chybějícím adresářům/kontejnerům.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nelze se připojit k žurnálové databázi pro koncový úložný systém „$1“.',
@@ -3190,7 +3193,7 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'file-info-size' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4',
 'file-info-size-pages' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4, $5 {{PLURAL:$5|stránka|stránky|stránek}}',
 'file-nohires' => 'Větší rozlišení není k dispozici.',
-'svg-long-desc' => 'Soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
+'svg-long-desc' => 'soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
 'svg-long-desc-animated' => 'Animovaný soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
 'show-big-image' => 'Obrázek ve vyšším rozlišení',
 'show-big-image-preview' => 'Velikost tohoto náhledu: $1.',
@@ -4051,7 +4054,7 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'api-error-badtoken' => 'Vnitřní chyba: špatný token.',
 'api-error-copyuploaddisabled' => 'Načítání z URL je na tomto severu zakázáno.',
 'api-error-duplicate' => 'Na této wiki již {{PLURAL:$1|existuje [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem',
-'api-error-duplicate-archive' => '{{PLURAL:$1|Soubor|Soubory}} se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.',
+'api-error-duplicate-archive' => '[$2 {{PLURAL:$1|Soubor|Soubory}}] se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.',
 'api-error-duplicate-archive-popup-title' => 'Duplicitní {{PLURAL:$1|soubor, který byl|soubory, které byly}} smazány',
 'api-error-duplicate-popup-title' => 'Duplicitní {{PLURAL:$1|soubor|soubory}}',
 'api-error-empty-file' => 'Načtený soubor je prázdný.',
index ac3ed2b..e95b295 100644 (file)
@@ -436,7 +436,7 @@ $1',
 'portal' => 'Forside for skribenter',
 'portal-url' => 'Project:Forside',
 'privacy' => 'Behandling af personlige oplysninger',
-'privacypage' => 'Project:Behandling_af_personlige_oplysninger',
+'privacypage' => 'Project:Behandling af personlige oplysninger',
 
 'badaccess' => 'Manglende rettigheder',
 'badaccess-group0' => 'Du har ikke de nødvendige rettigheder til denne handling.',
@@ -531,15 +531,15 @@ Gør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, o
 'missingarticle-diff' => '(Forskel: $1, $2)',
 'readonly_lag' => 'Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen',
 'internalerror' => 'Intern fejl',
-'internalerror_info' => 'Internal fejl: $1',
-'fileappenderrorread' => 'Kunne ikke læse "$1" under tilføjelsen.',
+'internalerror_info' => 'Intern fejl: $1',
+'fileappenderrorread' => 'Kunne ikke læse "$1" mens der blev tilføjet data.',
 'fileappenderror' => 'Kunne ikke tilføje "$1" til "$2".',
 'filecopyerror' => 'Kunne ikke kopiere filen "$1" til "$2".',
 'filerenameerror' => 'Kunne ikke omdøbe filen "$1" til "$2".',
 'filedeleteerror' => 'Kunne ikke slette filen "$1".',
-'directorycreateerror' => 'Kunne ikke oprette kataloget "$1".',
+'directorycreateerror' => 'Kunne ikke oprette mappen "$1".',
 'filenotfound' => 'Kunne ikke finde filen "$1".',
-'fileexistserror' => 'Kunne ikke oprette "$1": filen findes allerede',
+'fileexistserror' => 'Kunne ikke oprette "$1": filen findes allerede.',
 'unexpected' => 'Uventet værdi: "$1"="$2".',
 'formerror' => 'Fejl: Kunne ikke afsende formular',
 'badarticleerror' => 'Denne funktion kan ikke udføres på denne side.',
@@ -599,9 +599,9 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'yourname' => 'Dit brugernavn:',
 'yourpassword' => 'Din adgangskode:',
 'yourpasswordagain' => 'Gentag adgangskode',
-'remembermypassword' => 'Husk mit brugernavn på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
+'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
 'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
-'yourdomainname' => 'Dit domænenavn',
+'yourdomainname' => 'Dit domænenavn:',
 'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
 'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
 'login' => 'Log på',
@@ -612,10 +612,10 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'logout' => 'Log af',
 'userlogout' => 'Log af',
 'notloggedin' => 'Ikke logget på',
-'nologin' => "Du har ingen brugerkonto? '''$1'''.",
-'nologinlink' => 'Opret ny brugerkonto',
-'createaccount' => 'Opret en ny konto',
-'gotaccount' => "Du har allerede en brugerkonto? '''$1'''.",
+'nologin' => 'Har du ingen konto? $1.',
+'nologinlink' => 'Opret en ny brugerkonto',
+'createaccount' => 'Opret en ny brugerkonto',
+'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Log på',
 'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
 'createaccountmail' => 'via e-mail',
@@ -624,14 +624,14 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'userexists' => 'Det brugernavn, du har valgt, er allerede i brug.
 Vælg venligst et andet brugernavn.',
 'loginerror' => 'Logon mislykket',
-'createaccounterror' => 'Kunne ikke oprette konto: $1',
+'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1',
 'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Vær venlig at slå cookies til, og derefter kan du logge på med dit nye brugernavn og kodeord.',
 'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.',
 'nocookiesfornew' => 'Denne brugerkonto er ikke oprettet, da vi ikke kunne bekræfte dens kilde.
 Sørg for, at du har aktivereret cookies, genindlæs siden og prøv igen.',
 'noname' => 'Du har ikke angivet et gyldigt brugernavn.',
 'loginsuccesstitle' => 'Du er nu logget på',
-'loginsuccess' => 'Du er nu logget på {{SITENAME}} som "$1".',
+'loginsuccess' => "'''Du er nu logget på {{SITENAME}} som \"\$1\".'''",
 'nosuchuser' => 'Der er ingen bruger med navnet "$1".
 Der skelnes mellem store og bogstaver i brugernavne.
 Kontrollér stavemåden, eller [[Special:UserLogin/signup|opret en ny konto]].',
@@ -855,9 +855,9 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'blocked-notice-logextract' => 'Denne bruger er i øjeblikket blokeret.
 Loggen over den seneste blokering ses nedenfor:',
 'clearyourcache' => "'''Bemærk:''' Efter at have gemt er du måske nødt til at tømme din browsers cache for at kunne se ændringerne.
-* '''Firefox / Safari:''' Hold ''shifttasten'' nede og klik på ''reload'', eller tryk enten ''Ctrl-F5'' eller ''Ctrl-Shift-r'' (''⌘-R'' på en Mac).
+* '''Firefox / Safari:''' Hold ''Shift'' nede og klik på ''Reload'', eller tryk enten ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på en Mac).
 * '''Google Chrome:''' Tryk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på en Mac).
-* '''Internet Explorer:''' Hold ''controltasten'' nede og klik på ''refresh'' eller tryk på ''Ctrl-F5''.
+* '''Internet Explorer:''' Hold ''Ctrl'' nede og klik på ''Refresh'' eller tryk på ''Ctrl-F5''.
 * '''Opera:''' Tøm cachen i ''Tools → Preferences''.",
 'usercssyoucanpreview' => "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye CSS inden du gemmer.",
 'userjsyoucanpreview' => "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye JavaScript inden du gemmer.",
@@ -1705,7 +1705,7 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
 'backend-fail-internal' => 'En ukendt fejl opstod i filbackend "$1".',
 'backend-fail-contenttype' => 'Kunne ikke bestemme typen af indhold i filen, der skal gemmes på "$1".',
 'backend-fail-batchsize' => 'Lagringsbackend gav en batch på $1 fil{{PLURAL:$1|operation|operationer}}; grænsen er $2 {{PLURAL:$2|operation|operationer}}.',
-'backend-fail-usable' => 'Kunne ikke skrive til filen "$1" på grund af manglende rettigheder eller manglende mapper/containere.',
+'backend-fail-usable' => 'Kunne ikke læse eller skrive til filen "$1" på grund af manglende rettigheder eller manglende mapper/containere.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kunne ikke tilslutte til journal databasen for lager backenden "$1".',
index 13c9ece..cbd5534 100644 (file)
@@ -780,10 +780,11 @@ Bitte versuche es in ein paar Minuten erneut.',
 'protectedpagetext' => 'Diese Seite wurde geschützt, um Bearbeitungen zu verhindern.',
 'viewsourcetext' => 'Du kannst den Quelltext dieser Seite betrachten und kopieren:',
 'viewyourtext' => "Du kannst den Quelltext '''deiner Bearbeitung''' dieser Seite betrachten und kopieren:",
-'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der Software und ist geschützt, um Missbrauch vorzubeugen.',
+'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.
+Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.',
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
-Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
-Ziehe bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
+Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
+Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
 'sqlhidden' => "''Die SQL-Datenbankabfrage ist verborgen.''",
 'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
 $2',
@@ -1939,7 +1940,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'backend-fail-internal' => 'Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.',
 'backend-fail-contenttype' => 'Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.',
 'backend-fail-batchsize' => 'Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.',
-'backend-fail-usable' => 'Die Datei $1 konnte, entweder aufgrund eines nicht vorhandenen Verzeichnisses oder aufgrund unzureichender Berechtigungen, nicht gespeichert werden.',
+'backend-fail-usable' => 'Die Datei „$1“ konnte, entweder aufgrund eines nicht vorhandenen Verzeichnisses oder aufgrund unzureichender Berechtigungen, weder abgerufen noch gespeichert werden.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends „$1“ hergestellt werden.',
index 6b14116..eb21f27 100644 (file)
@@ -341,7 +341,7 @@ $messages = array(
 'tog-uselivepreview' => 'Verqayto cınde bıxebetne (JavaScript lazımo) (hewna cerrebnayış dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
-'tog-watchlisthidebots' => 'Vurnayışanê boti lista mına seyrkerdışi de bınımne',
+'tog-watchlisthidebots' => 'Vurnayışanê bota liste da seyrkerdışi de bınımne',
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
@@ -469,7 +469,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışê raverberdan ake (Tenya vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
-'vector-view-history' => 'Tarixi bımocne',
+'vector-view-history' => 'Ravêran bıvin',
 'vector-view-view' => 'Bıwanê',
 'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Kerdeni',
@@ -550,7 +550,7 @@ $1',
 'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
-'edithelppage' => 'Help:Pela seni vurniyêna',
+'edithelppage' => 'Help:Vurnayış',
 'helppage' => 'Help:Estêni',
 'mainpage' => 'Pela Seri',
 'mainpage-description' => 'Pela Seri',
@@ -880,12 +880,12 @@ Parola vêrdiye: $2',
 'changeemail-cancel' => 'Bıtexelne',
 
 # Edit page toolbar
-'bold_sample' => 'Çapo qalınd',
-'bold_tip' => 'Herfo qalın',
+'bold_sample' => 'Metno qalın',
+'bold_tip' => 'Metno qalın',
 'italic_sample' => 'Herfo Çewt',
 'italic_tip' => 'Herfo çewt',
 'link_sample' => 'Namey gırê',
-'link_tip' => 'Gırê dahili',
+'link_tip' => 'Gıreyê miyani',
 'extlink_sample' => 'http://www.example.com titleya gire',
 'extlink_tip' => 'Çımeyo tewer (http:// prefix)',
 'headline_sample' => 'nuştey xeta seri',
@@ -1579,7 +1579,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-editusercss' => 'Dosyanê CSSiê karberanê binan sero bıgureye',
 'right-edituserjs' => 'Dosyanê JSiê karberanê binan sero bıgureye',
 'right-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
-'right-markbotedits' => 'Vurnayışanê tekraran zey vurnayışanê boti nışan bıde',
+'right-markbotedits' => 'Vurnayışanê peyd ameyan, vurnayışê boti deye nışan kerê',
 'right-noratelimit' => 'Sinoranê xızi (rate limit) ra tesir nêbi',
 'right-import' => 'Pelan wikiyanê binan ra bia',
 'right-importupload' => 'Pelî dosya bar kerdişî ra import bike',
@@ -1647,7 +1647,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
 'recentchanges-label-newpage' => 'Enê vurnayışi pelaya newi vıraşt',
 'recentchanges-label-minor' => 'Eno vurnayışo do qickek o',
-'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
+'recentchanges-label-bot' => 'Yew boti xo het ra no vurnayış vıraşto',
 'recentchanges-label-unpatrolled' => 'Eno edît patrol nibiyo',
 'rcnote' => "Bıni dı {{PLURAL:$1|is '''1''' vurnayış|peni '''$1''' vurnayışan estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetani $5, $4.",
 'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
@@ -1854,7 +1854,7 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'backend-fail-internal' => 'Depo kerdışê "$1" peyni de ju xırabin vıcyê.',
 'backend-fail-contenttype' => 'Qandê depo kerdışi zerrey babeta dosya da "$1" nêvineya.',
 'backend-fail-batchsize' => 'Depo kerdışê  dosya da $1 {{PLURAL:$1|operasyon de|operasyonê}} cı groto; sinorê  {{PLURAL:$2|operasyoni|operasyona}} $2.',
-'backend-fail-usable' => 'Dosyay $1 nênusneyê çıkı ratnayışê cı racnayeyo yana kewmiyo.',
+'backend-fail-usable' => 'Dosyay $1 nênusneyê çıkı ratnayışê cı racnayeyo yana karkerdışe cı kemiyo.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Depo kerdış de "$1" qande malumatê gurweynayışi cıya irtibat nêkewiya.',
@@ -1890,7 +1890,7 @@ Kontrolê emeleyey oyo veş nêbeno.',
 'invalid-chunk-offset' => 'Ofseto nêravyarde',
 
 # img_auth script messages
-'img-auth-accessdenied' => 'Cıkewtış red biyo',
+'img-auth-accessdenied' => 'Cıresnayış vındarnayo.',
 'img-auth-nopathinfo' => 'PATH_INFO kemiyo.
 Teqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.
 Beno ke be CGI-bıngeyın bo u img_auth rê destek nêbeno.
@@ -2095,7 +2095,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikiy}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
-'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
+'nrevisions' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
 'nviews' => '$1 {{PLURAL:$1|vînayîş|vînayîşî}}',
 'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
 'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
@@ -2213,7 +2213,7 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 # Special:DeletedContributions
 'deletedcontributions' => 'İştiraqê karberan de besternayına',
 'deletedcontributions-title' => 'Îştirakê karberî wederna',
-'sp-deletedcontributions-contribs' => 'pêşteni',
+'sp-deletedcontributions-contribs' => 'dekerdeni',
 
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
@@ -2305,7 +2305,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 
 # Watchlist
 'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Listey taqiban',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
@@ -2379,7 +2379,7 @@ qey hemkari u pêşniyazi:
 'deletepage' => 'Pele bıestere',
 'confirm' => 'Testiq ke',
 'excontent' => "behso kêm: '$1'",
-'excontentauthor' => "behso kêm: '$1' no/na ('[[Special:Contributions/$2|$2]]' karber/e têna paşt dayo/a)",
+'excontentauthor' => "behso kêm: '$1' no/na ('[[Special:Contributions/$2|$2]]'  teyna iştıraq kerdo)",
 'exbeforeblank' => "behsê verê esteriyayişi: '$1'",
 'exblank' => 'zerreyê peli vengo',
 'delete-confirm' => '"$1" bıestere',
@@ -2457,8 +2457,8 @@ Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê ê
 '''$1''' eyarê peli:",
 'protect-locked-dblock' => "semedê kılidê database ya aktifi şıma neeşkeni seviyeya pawıtışi buvurni.
 '''$1''' eyarê no peli:",
-'protect-locked-access' => "Hesabê tu nıeşken seviyeyê kılit-kerdışi bıvurn.
-Ser pela '''$1''', itiya dı enformasyon esta:",
+'protect-locked-access' => "Karber hesabê şıma nêşeno  staryaye sewiyey ena peler bıvurno.
+Hesıbyayê sazê pela da '''$1''' enêyê:",
 'protect-cascadeon' => 'Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele, ki|peleyan, which li}} bınê "cascading protection"iyo.
 Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading protection"i bıvurno.',
 'protect-default' => 'Destur bıde karberan pêrune',
@@ -2520,7 +2520,7 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 'undelete-nodiff' => 'revizyonê verıni nidiya',
 'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
-'undeleteviewlink' => 'ra mocın',
+'undeleteviewlink' => 'bıvin',
 'undeletereset' => 'Reset kerê',
 'undeleteinvert' => 'vicnayeyi qeldaye açarn',
 'undeletecomment' => 'Sebeb:',
@@ -2562,7 +2562,7 @@ $1',
 # Contributions
 'contributions' => 'İştiraqê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'İştıraqê mı',
+'mycontris' => 'Dekerdeni',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(ser)',
@@ -3149,7 +3149,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
 'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
 'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
-'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
+'file-nohires' => 'Deha berz agozney cı çıniyo',
 'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
 'svg-long-desc-animated' => 'SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3',
 'show-big-image' => 'Resolosyonê temami',
@@ -3542,7 +3542,7 @@ $8',
 'exif-lightsource-4' => 'Flaş',
 'exif-lightsource-9' => 'saye/hewayo weşî',
 'exif-lightsource-10' => 'hewra/hora',
-'exif-lightsource-11' => 'Virse',
+'exif-lightsource-11' => 'Sersiyın',
 'exif-lightsource-12' => 'Florasanê roşnê tici (D 5700 – 7100K)',
 'exif-lightsource-13' => 'Florasanê sipe ye roci (N 4600 – 5400K)',
 'exif-lightsource-14' => 'Florasanê sipe ye hewli (W 3900 – 4500K)',
@@ -3666,7 +3666,7 @@ $8',
 'exif-ycbcrpositioning-1' => 'Wertekerdış',
 'exif-ycbcrpositioning-2' => 'Wayırê-site',
 
-'exif-dc-contributor' => 'Pêşteni',
+'exif-dc-contributor' => 'Dekerdeni',
 'exif-dc-coverage' => 'Heruna yana wextin grotışa medya',
 'exif-dc-date' => 'Tarix(i)',
 'exif-dc-publisher' => 'Hesrekar',
index 7fa2743..01c152c 100644 (file)
@@ -535,8 +535,10 @@ Wótpšašanje: $2',
 'protectedpagetext' => 'Wobźěłanje toś togo boka jo se znjemóžniło.',
 'viewsourcetext' => 'Žrědłowy tekst togo boka móžoš se woglědaś a kopěrowaś:',
 'viewyourtext' => "Móžoš se žrědłowy tekst '''swójich změnow''' woglědaś a do toś togo bok kopěrowaś:",
-'protectedinterface' => 'Toś ten bok wopśimujo tekst za rěcny zwjerch softwary. Jogo wobźěłowanje jo se znjemóžniło, aby se znjewužywanjeju zadorało.',
-'editinginterface' => "'''Warnowanje:''' Wobźěłujoš bok, kótaryž se wužywa, aby se tekst za pówjerch software MediaWiki k dispoziciji stajił. Změny na toś tom boku buźo wuglědanje wužywarskego pówjercha za drugich wužywarjow wobwliwowaś. Wužywaj pšosym za pśełožki [//translatewiki.net/wiki/Main_Page?setlang=dsb translatewiki.net], projekt MediaWiki za lokalizacije.",
+'protectedinterface' => 'Toś ten bok wopśimujo tekst za rěcny zwjerch softwary na toś tom wikiju a šćita se, aby se znjewužywanjeju zadorało.
+Aby pśełožki za wšykne wikije pśidał abo změnił, wužyj pšosym [//translatewiki.net/ translatewiki.net], lokalizěrowański projekt MediaWiki.',
+'editinginterface' => "'''Warnowanje:''' Wobźěłujoš bok, kótaryž se wužywa, aby se tekst za pówjerch software MediaWiki k dispoziciji stajił. Změny na toś tom boku buźo wuglědanje wužywarskego pówjercha za drugich wužywarjow na toś tom wikiju wobwliwowaś.
+Aby pśełožki za wšykne wikije pśidał abo změnił, wužywaj pšosym [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizacije.",
 'sqlhidden' => '(Wótpšašanje SQL schowane)',
 'cascadeprotected' => 'Za toś ten bok jo se wobźěłowanje znjemóžniło, dokulaž jo zawězany do {{PLURAL:$1|slědujucego boka|slědujuceju bokowu|slědujucych bokow}}, {{PLURAL:$1|kótaryž jo|kótarejž stej|kótarež su}} pśez kaskadowu opciju {{PLURAL:$1|šćitany|šćitanej|šćitane}}: $2',
 'namespaceprotected' => "Njejsy wopšawnjony, boki w rumje: '''$1''' wobźěłaś.",
@@ -1665,7 +1667,7 @@ $1',
 'backend-fail-internal' => 'W składowańskem backenźe "$1" jo njeznata zmólka nastała.',
 'backend-fail-contenttype' => 'Wopśimjeśowy typ dataje, kótaraž ma se na "$1" składowaś, njedajo se zwěsćiś.',
 'backend-fail-batchsize' => 'Štapjelowa dataja, kótaraž wopśimujo {{PLURAL:$1|jadnu operaciju|$1 operaciji|$1 operacije|$1 operacijow}},  jo se  na składowański backend pósłała; limit jo $2 {{PLURAL:$1|operaciju|operaciji|operacije|operacijow}}.',
-'backend-fail-usable' => 'Dataja $1 njedajo se dla njedosegajucych  abo felujucych zapisow pisaś.',
+'backend-fail-usable' => 'Dataja "$1" njedajo se dla njedosegajucych  pšawow abo felujucych zapisow daniž cytaś daniž pisaś.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Njejo žeden zwisk ze žurnaloweju datoweju banku za składowański backend "$1" móžno.',
index d32ea2b..981c340 100644 (file)
@@ -827,7 +827,8 @@ Maai intaai tongolog.',
 'revdelete-reason-dropdown' => '*Sasabab do pugason
 ** Awu katanud kooturan kuasamonsupu
 ** Pail ahaltinan di awu kosudong
-** Kopoilaan di popinraat do wokon',
+** Ngaranmoguno di awu kosudong
+** Kopoilaan di mongindaraat do wokon',
 'revdelete-otherreason' => 'Sabab suai/poinsungku:',
 'revdelete-reasonotherlist' => 'Sabab suai',
 'revdelete-edit-reasonlist' => 'Idito sasabab pinugas',
index 2b2a884..e96418d 100644 (file)
@@ -1038,10 +1038,11 @@ Please try again in a few minutes.',
 'protectedpagetext'             => 'This page has been protected to prevent editing.',
 'viewsourcetext'                => 'You can view and copy the source of this page:',
 'viewyourtext'                  => "You can view and copy the source of '''your edits''' to this page:",
-'protectedinterface'            => 'This page provides interface text for the software, and is protected to prevent abuse.',
+'protectedinterface'            => 'This page provides interface text for the software on this wiki, and is protected to prevent abuse.
+To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
 'editinginterface'              => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
-Changes to this page will affect the appearance of the user interface for other users.
-For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
+Changes to this page will affect the appearance of the user interface for other users on this wiki.
+To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
 'sqlhidden'                     => '(SQL query hidden)',
 'cascadeprotected'              => 'This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
 $2',
@@ -2325,7 +2326,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-internal'      => 'An unknown error occurred in storage backend "$1".',
 'backend-fail-contenttype'   => 'Could not determine the content type of the file to store at "$1".',
 'backend-fail-batchsize'     => 'The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
-'backend-fail-usable'        => 'Could not write file "$1" due to insufficient permissions or missing directories/containers.',
+'backend-fail-usable'        => 'Could not read or write file "$1" due to insufficient permissions or missing directories/containers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Could not connect to the journal database for storage backend "$1".',
index bd7ae6c..b8067c3 100644 (file)
@@ -735,8 +735,11 @@ Consulta: $2',
 'protectedpagetext' => 'Esta página ha sido protegida para evitar su edición.',
 'viewsourcetext' => 'Puedes ver y copiar el código fuente de esta página:',
 'viewyourtext' => "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
-'protectedinterface' => 'Esta página provee texto del interfaz del software, y está protegida para evitar vandalismos.',
-'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar texto de interfaz para el software. Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios. Para traducciones, por favor considera usar [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyecto de regionalización de MediaWiki.",
+'protectedinterface' => 'Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.
+Para agregar o cambiar las traducciones para todos los wikis, por favor use [//translatewiki.net/translatewiki.net], el proyecto de localización de MediaWiki.',
+'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software. 
+Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. 
+Para añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
 'sqlhidden' => '(Consulta SQL oculta)',
 'cascadeprotected' => 'Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:
 $2',
@@ -1909,7 +1912,7 @@ $1',
 'backend-fail-internal' => 'Se ha producido un error desconocido en el servidor (backend) de almacenamiento "$1".',
 'backend-fail-contenttype' => 'No se pudo determinar el tipo de contenido del archivo a guardar en " $1 ".',
 'backend-fail-batchsize' => 'El servidor (back-end) de almacenamiento ha suministrado un lote de $1 {{PLURAL:$1|operación|operaciones}} de archivo; el límite es de $2 {{PLURAL:$2|operación|operaciones}}.',
-'backend-fail-usable' => 'No se pudo escribir el archivo $1 debido a permisos insuficientes o directorios/contenedores desaparecidos.',
+'backend-fail-usable' => 'No se pudo leer o escribir el archivo "$1" debido a permisos insuficientes o directorios/contenedores desaparecidos.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'No se pudo conectar a la base de datos del registro del sistema de almacenamiento "$1".',
index fde8589..d563bf1 100644 (file)
@@ -980,9 +980,10 @@ Ezin duzu atzitu.',
 'revdelete-concurrent-change' => 'Errorea, $1 $2 data duen elementua aldatzean: badirudi haren egoera aldatu duela nor edo nork, zu aldatzen saiatzen ari zinela.
 Begira itzazu erregistroak.',
 'revdelete-reason-dropdown' => '*Ezabatzeko ohiko arrazoiak
-**Egile eskubideen urraketa
-**Informazio pertsonal desegokia
-**Iraingarria izan daitekeen informazioa',
+** Egile eskubideen urraketa
+** Informazio pertsonal edo iruzkin desegokia
+** Lankide izen desegokia
+** Iraingarria izan daitekeen informazioa',
 'revdelete-otherreason' => 'Bestelako arrazoia:',
 'revdelete-reasonotherlist' => 'Beste arrazoi bat',
 'revdelete-edit-reasonlist' => 'Ezabaketa arrazoiak aldatu',
index 1bd57fe..5d53e45 100644 (file)
@@ -2009,7 +2009,7 @@ $1',
 'backend-fail-internal' => 'خطایی نامعلوم در پشتیبان ذخیره «$1» رخ داد.',
 'backend-fail-contenttype' => 'تعیین نوع محتوای پرونده برای ذخیره در «$1» ناموفق بود.',
 'backend-fail-batchsize' => 'دسته‌ای مشتمل بر $1 {{PLURAL:$1|عملکرد|عملکرد}} پرونده به پشتیبان ذخیره داده شد؛ حداکثر مجاز $2 {{PLURAL:$2|عملکرد|عملکرد}} است.',
-'backend-fail-usable' => 'امکان نوشتن در پروندهٔ $1 وجود نداشت چرا که سطح دسترسی کافی نیست یا شاخه مورد نظر وجود ندارد.',
+'backend-fail-usable' => 'امکان خواندن یا نوشتن پروندهٔ $1 وجود نداشت چرا که سطح دسترسی کافی نیست یا شاخه/محفظهٔ مورد نظر وجود ندارد.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'امکان وصل شدن به پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.',
@@ -3233,8 +3233,8 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'پالایهٔ هرزنگاری‌ها',
-'spamprotectiontext' => 'از ذخیره کردن صفحه توسط صافی هرزنگاری‌ها جلوگیری شد.
\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 Ø¬Ø¯Û\8cد ØµÙ\81Ø­Ù\87Ø\8c Ø­Ø§Ù\88Û\8c Ù¾Û\8cÙ\88Ù\86دÛ\8c Ø¨Ù\87 Û\8cÚ© Ù\86شاÙ\86Û\8c Ù\88ب Ø®Ø§Ø±Ø¬Û\8c Ø¨Ø§Ø´د.',
+'spamprotectiontext' => 'از ذخیره کردن صفحه توسط پالایهٔ هرزنگاری‌ها جلوگیری شد.
\85عÙ\85Ù\88Ù\84اÙ\8b Ø§Û\8cÙ\86 Ø§ØªÙ\81اÙ\82 Ø²Ù\85اÙ\86Û\8c Ù\85Û\8câ\80\8cاÙ\81تد Ú©Ù\87 Ù\85تÙ\86 Ø¬Ø¯Û\8cد ØµÙ\81Ø­Ù\87Ø\8c Ø­Ø§Ù\88Û\8c Ù¾Û\8cÙ\88Ù\86دÛ\8c Ø¨Ù\87 Û\8cÚ© Ù\86شاÙ\86Û\8c Ù\88ب Ø¨Ø§Ø´Ø¯ Ú©Ù\87 Ø¯Ø± Ù\81Ù\87رست Ø³Û\8cاÙ\87 Ù\82رار Ø¯Ø§Ø±د.',
 'spamprotectionmatch' => 'متن زیر چیزی‌است که پالایهٔ هرزه‌نگاری ما را به کارانداخت: $1',
 'spambot_username' => 'هرزه‌تمیزکارِ مدیاویکی',
 'spam_reverting' => 'واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.',
index b9d63d7..d2f5e76 100644 (file)
@@ -1118,7 +1118,7 @@ Kokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.',
 'rev-deleted-comment' => '(muokkausyhteenveto poistettu)',
 'rev-deleted-user' => '(käyttäjänimi poistettu)',
 'rev-deleted-event' => '(lokitapahtuma poistettu)',
-'rev-deleted-user-contribs' => '[käyttäjänimi tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]',
+'rev-deleted-user-contribs' => '[käyttäjätunnus tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]',
 'rev-deleted-text-permission' => "Tämä versio sivusta on '''poistettu'''.
 Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
 'rev-deleted-text-unhide' => "Tämä versio sivusta on '''poistettu'''.
@@ -1520,7 +1520,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'right-writeapi' => 'Käyttää kirjoitus-APIa',
 'right-delete' => 'Poistaa sivuja',
 'right-bigdelete' => 'Poistaa sivuja, joilla on pitkä historia',
-'right-deletelogentry' => 'Poista ja palauta tiettyjä lokimerkintöjä',
+'right-deletelogentry' => 'Poistaa ja palauttaa tiettyjä lokimerkintöjä',
 'right-deleterevision' => 'Poistaa ja palauttaa sivujen versioita',
 'right-deletedhistory' => 'Tarkastella poistettuja versiotietoja ilman niihin liittyvää sisältöä',
 'right-deletedtext' => 'Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä',
index 59df7ce..8498dc8 100644 (file)
@@ -750,8 +750,10 @@ Essayez à nouveau dans quelques minutes.',
 'protectedpagetext' => 'Cette page a été protégée pour empêcher sa modification.',
 'viewsourcetext' => 'Vous pouvez voir et copier le contenu de la page :',
 'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
-'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel et est protégée pour éviter les abus.',
-'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d’internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
+'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.
+Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.',
+'editinginterface' => "'''Attention''': Vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements sur cette page se répercuteront dur l'apparence de l'interface utilisateur pour les autres utilisateurs de ce wiki.
+Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet d’internationalisation de MediaWiki.",
 'sqlhidden' => '(Requête SQL cachée)',
 'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
 $2',
@@ -1906,7 +1908,7 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 'backend-fail-internal' => 'Une erreur inconnue s\'est produite dans le support de stockage "$1".',
 'backend-fail-contenttype' => 'Impossible de déterminer le type de contenu du fichier à stocker en "$1".',
 'backend-fail-batchsize' => 'Le support de stockage a fourni un lot de $1 {{PLURAL:$1|opération|opérations}} de fichier; la limite est $2 {{PLURAL:$2|opération|opérations}}.',
-'backend-fail-usable' => 'Impossible d’écrire le fichier $1 en raison de droits insuffisants ou répertoires/conteneurs manquants.',
+'backend-fail-usable' => 'Impossible de lire ou d’écrire le fichier « $1 » en raison de droits insuffisants ou répertoires/conteneurs manquants.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Impossible de se connecter à la base de données du journal pour le terminal de stockage "$1".',
@@ -3957,7 +3959,7 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-software' => 'Logiciels installés',
 'version-software-product' => 'Produit',
 'version-software-version' => 'Version',
-'version-entrypoints' => 'URL de point d’entrée',
+'version-entrypoints' => 'URL des points d’entrée',
 'version-entrypoints-header-entrypoint' => "Point d'entrée",
 'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d\'article]',
index 1c1bc9a..68d96bc 100644 (file)
@@ -1799,7 +1799,7 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
 'backend-fail-internal' => 'Houbo un erro descoñecido no sistema de almacenamento "$1".',
 'backend-fail-contenttype' => 'Non se puido determinar o tipo de contido do ficheiro a almacenar en "$1".',
 'backend-fail-batchsize' => 'O sistema de almacenamento recibiu un feixe de $1 {{PLURAL:$1|operación|operacións}} de ficheiro; o límite está en $2 {{PLURAL:$2|operación|operacións}}.',
-'backend-fail-usable' => 'Non se puido escribir o ficheiro "$1" debido a que os permisos son insuficientes ou faltan os directorios/contenedores.',
+'backend-fail-usable' => 'Non se puido ler ou escribir o ficheiro "$1" debido a que os permisos son insuficientes ou faltan os directorios/contenedores.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non se pode conectar coa base de datos do rexistro do sistema de almacenamento "$1".',
index 473f0c6..67fd0e8 100644 (file)
@@ -473,11 +473,11 @@ $1',
 'error' => 'ત્રુટિ',
 'databaseerror' => 'ડેટાબેઝ ત્રુટિ',
 'dberrortext' => 'માહિતીસંચ ને અપાયેલ શોધના સૂત્રમાં ચૂક છે.
-àª\86 àª¸à«\8bફà«\8dàª\9fવà«\87રમાàª\82 àª®àª¾àª\82 àª¨àª¾àª¨à«\80  àª¤à«\8dરà«\81àª\9fિ (bug) àª¨à«\87 àª²à«\80ધà«\87 àª¹à«\8bàª\87 àª¶àª\95à«\87.
-માહિતીસંચ પર કરાયેલ છેલ્લામાં છેલ્લી શોધ આ પ્રમાણે હતી:
-<blockquote><tt>$1</tt></blockquote>
-આ ફંકશન થકી  "<tt>$2</tt>".
-માહિતà«\80સàª\82àª\9aà«\87 àª\86પà«\87લ àª\9aà«\82àª\95નà«\81àª\82 àªµàª¿àªµàª°àª£ "<tt>$3: $4</tt>".',
+આ સોફ્ટવેરમાં નાની  ત્રુટિ (bug) ને લીધે હોઇ શકે.
+માહિતીસંચ પર કરાયેલ છેલ્લામાં છેલ્લી શોધ આ પ્રમાણે હતી:
+<blockquote><code>$1</code></blockquote>
+આ ફંકશન થકી  "<code>$2</code>".
+માહિતà«\80સàª\82àª\9aયà«\87 àª\86પà«\87લ àª\9aà«\82àª\95નà«\81àª\82 àªµàª¿àªµàª°àª£ "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'માહિતીસંચ ને અપાયેલ શોધના સૂત્રમાં ચૂક છે.
 માહિતીસંચ પર કરાયેલ છેલ્લામાં છેલ્લી શોધ આ પ્રમાણે હતી:
 "$1"
@@ -544,7 +544,10 @@ $2',
 'ns-specialprotected' => 'ખાસ પાનાંમાં ફેરફાર ન થઇ શકે.',
 'titleprotected' => 'આ મથાળું (વિષય) [[User:$1|$1]] બનાવવા માટે સુરક્ષિત કરવામાં આવ્યો છે.
 આ માટેનું કારણ છે-- "\'\'$2\'\'".',
+'invalidtitle-knownnamespace' => 'નામસ્થળ "$2" અને લખાણ "$3" સાથે અમાન્ય મથાળું',
+'invalidtitle-unknownnamespace' => 'અજ્ઞાત નામસ્થળ ક્રમાંક $1 અને નામ "$2" વાળું અમાન્ય મથાળું',
 'exception-nologin' => 'પ્રવેશ કરેલ નથી',
+'exception-nologin-text' => 'આ પાનું કે ક્રિયા માટે આ વિકિ પર લોગઈન થવું જરૂરી છે.',
 
 # Virus scanner
 'virus-badscanner' => "ખરાબ રૂપરેખા: અજાણ્યું વાઇરસ સ્કેનર: ''$1''",
@@ -642,8 +645,8 @@ Please log in again after you receive it.
 નિમ્નલિખિત વિશેષતાઓમાંથી કોઇ માટે ઇ-મેઇલ મોકલવામાં આવશે નહીં.',
 'noemailprefs' => "આ વિશેષતાઓ કાર્ય કરી શકે તે માટે 'તમારી પસંદ'માં ઇ-મેઇલ સરનામું દર્શાવો.",
 'emailconfirmlink' => 'તમારા ઇ-મેઇલ સરનામાની પુષ્ટિ કરો',
-'invalidemailaddress' => 'àª\86 àª\88-મà«\87લ àª\85યà«\8bàª\97à«\8dય àª®àª¾àª³àª\96à«\81àª\82 àª§àª°àª¾àªµà«\8dહà«\87 àª\9bà«\87  àª®àª¾àª\9fà«\87 àª¸à«\8dવà«\80àª\95ારà«\80 àª¶àª\95ાશà«\87 àª¨àª¹à«\80àª\82
-કૃપયા યોગ્ય માળખામાં ઇ-મેલ લખો',
+'invalidemailaddress' => 'àª\86 àª\88-મà«\87લ àª\85યà«\8bàª\97à«\8dય àª®àª¾àª³àª\96à«\81àª\82 àª§àª°àª¾àªµà«\87 àª\9bà«\87 àª®àª¾àª\9fà«\87 àª¸à«\8dવà«\80àª\95ારà«\80 àª¶àª\95ાશà«\87 àª¨àª¹à«\80àª\82.
+કૃપયા યોગ્ય માળખામાં ઇ-મેલ લખો અથવા આ ખાનું ખાલી કરો.',
 'cannotchangeemail' => 'એકાઉન્ટ ઈ મેલ એડ્રસ આ વીકી પર નહિ બદલી શકાય.',
 'emaildisabled' => 'આ સાઇટ ઇ-મેલ્સ મોકલી શકતી નથી.',
 'accountcreated' => 'ખાતું ખોલવામાં આવ્યું છે',
@@ -828,8 +831,7 @@ $2
 *'''ફાયરફોક્સ / સફારી:''' ''શીફ્ટ'' દબાવેલી રાખીને ''રિલોડ'' પર ક્લિક કરો, અથવા તો ''Ctrl-F5'' કે ''Ctrl-R'' દબાવો (મેક પર ''⌘-R'')
 *'''ગુગલ ક્રોમ:''' ''Ctrl-Shift-R'' દબાવો (મેક પર ''⌘-Shift-R'')
 *'''ઈન્ટરનેટ એક્સપ્લોરર:''' ''Ctrl'' દબાવેલી રાખીને ''રિફ્રેશ'' પર ક્લિક કરો, અથવા ''Ctrl-F5'' દબાવો
-*'''કોન્કરર:''' ''રિલોડ'' પર ક્લિક કરો અથવા ''F5'' દબાવો
-*'''ઓપેરા:''' ''સાધનો → પસંદગીઓ''માં જઈને કૅશ સાફ કારો",
+*'''ઓપેરા:''' ''સાધનો → પસંદગીઓ''માં જઈને કૅશ સાફ કરો",
 'usercssyoucanpreview' => "'''ટીપ:''' તમારા નવા CSSને સાચવતા પહેલા  \"{{int:showpreview}}\" બટન વાપરી ચકાસણી કરો.",
 'userjsyoucanpreview' => "'''ટીપ:''' Use the તમારી નવી JavaScript ને સાચવતા પહેલા   \"{{int:showpreview}}\" બટન વાપરી ચકાસો.",
 'usercsspreview' => "'''યાદ રહે કે તમે તમારા સભ્ય CSS નું અવલોકન કરો છે.'''
@@ -975,7 +977,7 @@ $3 દ્વારા અપાયેલ કારણ છે ''$2''",
 'last' => 'છેલ્લું',
 'page_first' => 'પહેલું',
 'page_last' => 'છેલ્લું',
-'histlegend' => "વિવિધ àªªàª¸àª\82દàª\97à«\80:સરàª\96ામણà«\80 àª®àª¾àª\9fà«\87 àª¸à«\81ધારà«\87લà«\80 àª\86વà«\83તિàª\93ના àª°à«\87ડિયà«\8b àª\96ાનાàª\93 àªªàª¸àª\82દ àª\95રà«\8b àª\85નà«\87 àª\8fનà«\8dàª\9fર àª®àª¾àª°à«\8b àª\85થવા àª¨à«\80àª\9aà«\87 àª\86વેલું બટન દબાવો.<br />
+'histlegend' => "વિવિધ àªªàª¸àª\82દàª\97à«\80:સરàª\96ામણà«\80 àª®àª¾àª\9fà«\87 àª¸à«\81ધારà«\87લà«\80 àª\86વà«\83તિàª\93ના àª°à«\87ડિયà«\8b àª\96ાનાàª\93 àªªàª¸àª\82દ àª\95રà«\8b àª\85નà«\87 àª\8fનà«\8dàª\9fર àª¦àª¬àª¾àªµà«\8b àª\85થવા àª¨à«\80àª\9aà«\87 àª\86પેલું બટન દબાવો.<br />
 સમજૂતી:'''({{int:cur}})''' = વર્તમાન અને સુધારેલી આવૃતિનો તફાવત, '''({{int:last}})''' = પૂર્વવર્તી ફેરફારનો તફાવત, '''{{int:minoreditletter}}''' = નાનો ફેરફાર.",
 'history-fieldset-title' => 'ઇતિહાસ ઉખેળો',
 'history-show-deleted' => 'માત્ર હટાવાયેલા',
@@ -1081,7 +1083,8 @@ $1",
 'revdelete-only-restricted' => '$2 તારીખ, $1 વાગ્યાની વસ્તુ સંતાડવામાં ત્રુટિ : અન્ય દ્રશ્ય વિકલ્પ પસંદ કર્યા સિવાય તમે પ્રતિબંધને પ્રબંધકથી દેખતા બચાવી ન શકો.',
 'revdelete-reason-dropdown' => '* હટાવવાનાં સામાન્ય કારણો 
 ** પ્રકાશનાધિકાર ભંગ
-** અયોગ્ય અંગત માહિતી 
+** અયોગ્ય ટિપ્પણી કે અંગત માહિતી 
+** અયોગ્ય સભ્યનામ
 ** સંભવતઃ બદનક્ષી કરનારું લખાણ',
 'revdelete-otherreason' => 'અન્ય/વધારાનું કારણ:',
 'revdelete-reasonotherlist' => 'અન્ય કારણ',
@@ -1360,7 +1363,7 @@ HTML નાકું ચકાસો',
 # Groups
 'group' => 'સમુહ',
 'group-user' => 'સભ્ય',
-'group-autoconfirmed' => 'સ્વયં ચલિત પરવાનગી મેળવેલ સભ્યો',
+'group-autoconfirmed' => 'સ્વયંચલિત માન્ય સભ્યો',
 'group-bot' => 'બૉટો',
 'group-sysop' => 'સાઇસૉપ/પ્રબંધકો',
 'group-bureaucrat' => 'રાજનૈતિકો',
@@ -1375,7 +1378,7 @@ HTML નાકું ચકાસો',
 'group-suppress-member' => '{{GENDER:$1|દુર્લક્ષ}}',
 
 'grouppage-user' => '{{ns:project}}:સભ્યો',
-'grouppage-autoconfirmed' => '{{ns:project}}:સà«\8dવà«\8dયàª\82àª\9aલિત àª¬àª¹àª¾àª²  સભ્યો',
+'grouppage-autoconfirmed' => '{{ns:project}}:સà«\8dવયàª\82àª\9aલિત àª®àª¾àª¨à«\8dય સભ્યો',
 'grouppage-bot' => '{{ns:project}}:બૉટો',
 'grouppage-sysop' => '{{ns:project}}:પ્રબંધકો',
 'grouppage-bureaucrat' => '{{ns:project}}: રાજનૈતિક',
@@ -2082,8 +2085,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 
 # Special:ListGroupRights
 'listgrouprights' => 'સભ્ય જૂથ ના હક્કો',
-'listgrouprights-summary' => 'નà«\80àª\9aà«\87 àª\86 àªµàª¿àª\95િ àªªàª° àªªàª°àª¿àª­àª¾àª·àª¿àª¤ àª¸àª­à«\8dય àª\9cà«\82થનà«\80 àª¯àª¾àª¦àª¿ àª\86પà«\80 àª\9bà«\87 àª\85નà«\87 àª¤à«\87મના àª¹àª\95à«\8dàª\95à«\8b àªªàª£ àª\86પà«\87લા છે.
-નà«\80àª\9cà«\80 àª¹àª\95à«\8dàª\95à«\8b àª®àª¾àª\9fà«\87 [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] àª®àª¾àª¹àª¿àª¤à«\80.',
+'listgrouprights-summary' => 'નà«\80àª\9aà«\87 àª\86 àªµàª¿àª\95િ àªªàª° àªµà«\8dયાàª\96à«\8dયાયિત àª¸àª­à«\8dય àª\9cà«\82થà«\8bનà«\80 àª¯àª¾àª¦à«\80, àª¤à«\87મનà«\80 àª¸àª¾àª¥à«\87 àª¸àª\82àª\95ળાયà«\87લા àª¹àª\95à«\8dàª\95à«\8b àª¸àª¾àª¥à«\87 àª\86પà«\80 છે.
+વà«\8dયàª\95à«\8dતિàª\97ત àª¹àª\95à«\8dàª\95à«\8b àª®àª¾àª\9fà«\87 [[{{MediaWiki:Listgrouprights-helppage}}|વધારાનà«\80 àª®àª¾àª¹àª¿àª¤à«\80]].',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">અધિકાર અપાયા</span>
 * <span class="listgrouprights-revoked">અધિકાર હટાવાયા</span>',
 'listgrouprights-group' => 'જૂથ',
@@ -2222,7 +2225,7 @@ $UNWATCHURL
 'delete-legend' => 'રદ કરો',
 'historywarning' => "'''ચેતવણી:''' જે પાનું તમે હટાવવા જઇ રહ્યાં છો તેને આશરે $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}નો ઇતિહાસ છે:",
 'confirmdeletetext' => 'આપ આ પાનું તેના ઇતિહાસ (બધાજ પૂર્વ  ફેરફારો) સાથે હટાવી રહ્યાં છો.
-àª\95à«\83પા àª\95રà«\80 àª®àª\82àª\9cà«\82રà«\80 àª\86પà«\8b àª\95à«\87, àª\86પ àª\86મ àª\95રવા àª\9aાહà«\8b àª\9bà«\8b, àª\86પ àª\86ના àª¸àª°àª¾-નરસા àªªàª°àª¿àª£àª¾àª®à«\8bથà«\80 àªµàª¾àª\95à«\87ફ àª\9bà«\8b, àª\85નà«\87 àª\86પ àª\86 àª\95à«\83ત્ય [[{{MediaWiki:Policy-url}}|નીતિ]]ને અનુરૂપ જ કરી રહ્યાં છો.',
+àª\95à«\83પા àª\95રà«\80 àª\96ાતà«\8dરà«\80 àª\95રà«\8b àª\95à«\87 àª\86પ àª\86મ àª\95રવા àª\87àª\9aà«\8dàª\9bà«\8b àª\9bà«\8b, àª\86પ àª\86ના àª¸àª¾àª°àª¾-નરસા àªªàª°àª¿àª£àª¾àª®à«\8bથà«\80 àªµàª¾àª\95à«\87ફ àª\9bà«\8b, àª\85નà«\87 àª\86પ àª\86 àª\95ાર્ય [[{{MediaWiki:Policy-url}}|નીતિ]]ને અનુરૂપ જ કરી રહ્યાં છો.',
 'actioncomplete' => 'કામ પૂર્ણ',
 'actionfailed' => 'કાર્ય અસફળ',
 'deletedtext' => '"$1" દૂર કરવામાં આવ્યું છે.
@@ -2343,7 +2346,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 
 # Undelete
 'undelete' => 'ભૂંસાડેલા પાના બતાવો',
-'undeletepage' => 'હàª\9fાવà«\87લ àªªàª¾àª¨àª¾ àª\9cà«\81àª\93 àª\85નà«\87 àªªà«\81àª\82રà«\8dàª\9cà«\80વà«\80ત કરો',
+'undeletepage' => 'હàª\9fાવà«\87લ àªªàª¾àª¨àª¾ àª\9cà«\81àª\93 àª\85નà«\87 àªªà«\81નરà«\8dàª\9cà«\80વિત કરો',
 'undeletepagetitle' => "'''નીચે [[:$1|$1]] ના ભૂંસાડેલ સંપાદનો છે.'''.",
 'viewdeletedpage' => 'ભૂંસેલા પાના બતાવો',
 'undeletepagetext' => 'નીચેના {{PLURAL:$1|પાનું હટાવી દેવાયું છે |$1 પાના હટાવી દેવાયા છે}} તે હજી પ્રાચીન દસ્તવેજમાં છે અને પુનઃસ્થાપિત કરી શકાશે.
@@ -2362,7 +2365,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'undelete-revision' => '$1 ( $4 તારીખે , $5 વાગ્યા)  સુધી કરેલા ફેરફારો  $3 દ્વારા હટાવાયા:',
 'undeleterevision-missing' => 'અવૈધ કે ગાયબ પુનરાવર્તન.
 તમારી કડી ખરાબ હશે અથવા ઇતિહાસમાંથી તે માહિતી હટાવાઇ હશે.',
-'undelete-nodiff' => 'àª\95à«\8bàª\87 àªªà«\8dરાàª\9aà«\80ન àª¸àª\82પદનà«\8b àª¨àª¥à«\80 àª®àª³à«\8dયાàª\82',
+'undelete-nodiff' => 'àª\95à«\8bàª\87 àªªà«\8dરાàª\9aà«\80ન àª¸àª\82પાદનà«\8b àª¨àª¥à«\80 àª®àª³à«\8dયાàª\82.',
 'undeletebtn' => 'પાછું વાળો',
 'undeletelink' => 'જુઓ/પાછુ વાળો',
 'undeleteviewlink' => 'જુઓ',
@@ -2372,8 +2375,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પુન સ્થાપિત કરાયા',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પુનઃસ્થાપિત',
 'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પુનઃસ્થાપિત',
-'cannotundelete' => 'પà«\81નàª\83àª\9cà«\80વિત àª\95રવાનà«\81àª\82 àª\95ારà«\8dય àª\85સફળ 
-કોઇકે  આ પાનાને પહેલેથી પુનઃજીવિત કર્યું હોઇ શકે.',
+'cannotundelete' => 'પà«\81નરà«\8dàª\9cà«\80વિત àª\95રવાનà«\81àª\82 àª\95ારà«\8dય àª\85સફળ; 
+કોઇકે આ પાનાને પહેલેથી પુનર્જીવિત કર્યું હોઈ શકે.',
 'undeletedpage' => "'''$1 પુનઃસ્થાપિત કરાયા'''
 
 તાજેતરમાં હટાવેલા કે પુનઃસ્થાપિત થયેલા ફેરફારની નોંધ નો સંદર્ભ અહીં ઉપ્લબ્ધ [[Special:Log/delete|deletion log]].",
@@ -2456,22 +2459,22 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'blockip' => 'સભ્ય પર પ્રતિબંધ મુકો',
 'blockip-title' => 'સભ્ય પર પ્રતિબંધ મુકો',
 'blockip-legend' => 'સભ્ય પર પ્રતિબંધ મુકો',
-'blockiptext' => 'àª\95à«\8bàª\87 àª\9aà«\8bàª\95à«\8dàª\95સ IP àª¸àª°àª¨àª¾àª®à«\81àª\82 àª\95à«\87 àª¸àª­à«\8dય  àª¨àª¾  લેખન યોગદાન પર પ્રતિબંધ મુકવા નીચેનું ફોર્મ વાપરો.
-તેનો ઉપયોગ માત્ર ભાંગફોડિયા પ્રવૃત્તિઓને રોકવા અને  [[{{MediaWiki:Policy-url}}|policy]] અનુસાર જ હોવી જોઇએ.
-àª\95ારણનà«\81àª\82 àª\96ાનà«\81àª\82 àª\85વશà«\8dય àª«àª°àª¶à«\8b (દા.ત. àª\85મà«\81àª\95 àª­àª¾àª\82àª\97ફà«\8bડ àª\95રાયà«\87લ àªªàª¾àª¨à«\81àª\82)',
+'blockiptext' => 'àª\95à«\8bàª\88 àª\9aà«\8bàª\95à«\8dàª\95સ IP àª¸àª°àª¨àª¾àª®à«\81àª\82 àª\95à«\87 àª¸àª­à«\8dયના લેખન યોગદાન પર પ્રતિબંધ મુકવા નીચેનું ફોર્મ વાપરો.
+તેનો ઉપયોગ માત્ર ભાંગફોડિયા પ્રવૃત્તિઓને રોકવા અને  [[{{MediaWiki:Policy-url}}|નીતિ]] અનુસાર જ હોવો જોઈએ.
+àª\95ારણનà«\81àª\82 àª\96ાનà«\81àª\82 àª\85વશà«\8dય àª­àª°àª¶à«\8b (દા.ત. àª\85મà«\81àª\95 àª­àª¾àª\82àª\97ફà«\8bડ àª\95રાયà«\87લા àªªàª¾àª¨àª¾àª¨à«\8b àª¸àª\82દરà«\8dભ).',
 'ipadressorusername' => 'IP સરનામું અથવા સભ્યનામ:',
 'ipbexpiry' => 'સમાપ્તિ:',
 'ipbreason' => 'કારણ:',
 'ipbreasonotherlist' => 'અન્ય કારણ',
 'ipbreason-dropdown' => '*સામાન્ય પ્રતિબંધ કારણો
-** ખોટી  માહિતી ઉમેરાઇ  
+** ખોટી માહિતી ઉમેરાઈ  
 ** પાનામાંથી માહિતી ભૂંસી નાંખી
 ** અનાવશ્યક બાહ્ય કડીઓ ઉમેરી 
 ** પાનામાં મૂર્ખામીભરી/અર્થહીન માહિતી ઉમેરી
-**  ત્રાસદાયક વર્તન 
-** ઘણા ખાતાઓનું સાથે શોષણ 
+** ત્રાસદાયક વર્તન 
+** ઘણા ખાતાઓ અને દુરુપયોગ
 ** અસ્વીકાર્ય સભ્ય નામ
-**આત્યંતિક ભાંગફોડ',
+** આત્યંતિક ભાંગફોડ',
 'ipb-hardblock' => 'અટકાવો આ IP સરનામું માંથી ફેરફાર વપરાશકર્તાઓ માં લૉગ',
 'ipbcreateaccount' => 'ખાતા ખોલવા પર પ્રતિબંધ',
 'ipbemailban' => 'સભ્યના ઇ-મેલ મોકલવા પર પ્રતિબંધ મૂકો',
@@ -2915,11 +2918,11 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 
 # Info page
 'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
-'pageinfo-header-edits' => 'àª\95રà«\87લા àª«à«\87રફાર',
+'pageinfo-header-edits' => 'àª\87તિહાસ àª¸àª\82પાદન',
 'pageinfo-views' => 'જોનારાની સંખ્યા',
-'pageinfo-watchers' => 'નીરીક્ષકોની સંખ્યા',
-'pageinfo-edits' => 'સંપાદનોની સંખ્યા',
-'pageinfo-authors' => 'ક્ષેત્રના લેખકોની સંખ્યા',
+'pageinfo-watchers' => 'પાના àª¨à«\80રà«\80àª\95à«\8dષàª\95à«\8bનà«\80 àª¸àª\82àª\96à«\8dયા',
+'pageinfo-edits' => 'àª\95à«\81લ àª¸àª\82પાદનà«\8bનà«\80 àª¸àª\82àª\96à«\8dયા',
+'pageinfo-authors' => 'àª\95à«\8dષà«\87તà«\8dરના àª²à«\87àª\96àª\95à«\8bનà«\80 àª\95à«\81લ àª¸àª\82àª\96à«\8dયા',
 
 # Patrolling
 'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
@@ -3630,7 +3633,7 @@ $5
 * <span class="mw-specialpagerestricted">ખાસ પાનાં પ્રતિબંધિત.</span>',
 'specialpages-group-maintenance' => 'સમારકામ અહેવાલ',
 'specialpages-group-other' => 'અન્ય ખાસ પાનાઓ',
-'specialpages-group-login' => 'પà«\8dરવà«\87શ / àª¨à«\8bàª\82ધણà«\80 àª\95રો',
+'specialpages-group-login' => 'પà«\8dરવà«\87શ / àª\96ાતà«\81 àª¬àª¨àª¾àªµો',
 'specialpages-group-changes' => 'હાલના ફેરફારો અને લોગ',
 'specialpages-group-media' => 'મિડિયા રિપોર્ટ અને ચડાવેલી ફાઇલ',
 'specialpages-group-users' => 'સભ્યો અને અધિકારો',
index 9fc12fa..a1769e9 100644 (file)
@@ -733,10 +733,11 @@ $1',
 'protectedpagetext' => 'דף זה מוגן ולא ניתן לערוך אותו.',
 'viewsourcetext' => 'באפשרותכם לצפות בטקסט המקור של הדף ולהעתיקו:',
 'viewyourtext' => "באפשרותכם לצפות בטקסט המקור של '''העריכות שלכם''' של הדף ולהעתיקו:",
-'protectedinterface' => 'דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה, ומוגן כדי למנוע השחתות.',
+'protectedinterface' => 'דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה באתר ויקי זה, ומוגן כדי למנוע השחתות.
+כדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.',
 'editinginterface' => "'''אזהרה:''' הדף שאתם עורכים הוא אחד הדפים המספקים הודעות מערכת לתוכנה.
-שינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים.
\9cתר×\92×\95×\9e×\99×\9d, ×\90× ×\90 ×©×§×\9c×\95 ×\9c×\94שת×\9eש ×\91Ö¾[//translatewiki.net/wiki/Main_Page?setlang=he translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
+שינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר ויקי זה.
\9b×\93×\99 ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9cשנ×\95ת ×ª×¨×\92×\95×\9e×\99×\9d ×\91×\9b×\9c ×\90תר×\99 ×\94×\95×\95×\99ק×\99, ×\90× ×\90 ×\94שת×\9eש×\95 ×\91Ö¾[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
 'sqlhidden' => '(שאילתת ה־SQL מוסתרת)',
 'cascadeprotected' => 'דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:
 $2',
@@ -1917,7 +1918,7 @@ $1',
 'backend-fail-internal' => 'אירעה שגיאה בלתי־ידועה במאגר אחסון הקבצים הפנימי "$1".',
 'backend-fail-contenttype' => 'לא ניתן היה לקבוע את סוג התוכן של הקובץ לאחסון ב־"$1".',
 'backend-fail-batchsize' => 'למאגר אחסון הקבצים הפנימי הועבר אוסף של {{PLURAL:$1|פעולת קובץ אחת|$1 פעולות קובץ}}; המגבלה היא {{PLURAL:$2|פעולה אחת|$2 פעולות}}.',
-'backend-fail-usable' => '×\9bת×\99×\91ת ×\94ק×\95×\91×¥ $1 לא הצליחה כיוון שההרשאות אינן מספיקות או כיוון שהספריות/המכלים חסרים.',
+'backend-fail-usable' => 'קר×\99×\90ת ×\90×\95 ×\9bת×\99×\91ת ×\94ק×\95×\91×¥ "$1" לא הצליחה כיוון שההרשאות אינן מספיקות או כיוון שהספריות/המכלים חסרים.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'לא ניתן היה להתחבר לבסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי "$1".',
index f58fa4f..bc1fbfe 100644 (file)
@@ -481,7 +481,7 @@ $messages = array(
 'namespaces' => 'Imenski prostori',
 'variants' => 'Inačice',
 
-'errorpagetitle' => 'Pogreška',
+'errorpagetitle' => 'Pogrješka',
 'returnto' => 'Vrati se na $1.',
 'tagline' => 'Izvor: {{SITENAME}}',
 'help' => 'Pomoć',
@@ -781,7 +781,7 @@ koristiti staru lozinku.',
 Prije nego što pošaljemo daljnje poruke, molimo Vas da otvorite e-mail i slijedite u njemu sadržana uputstva kako biste potvrdili da je e-mail adresa zaista Vaša.',
 'throttled-mailpassword' => 'Već Vam je poslan e-mail za promjenu lozinke, u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.
 Da bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu lozinke {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.',
-'mailerror' => 'Pogreška pri slanju e-maila: $1',
+'mailerror' => 'Pogrješka pri slanju e-pošte: $1',
 'acct_creation_throttle_hit' => 'Posjetitelji ovog wikija koji rabe Vašu IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjem danu, što je najveći dopušteni broj u tom vremenskom razdoblju.
 Zbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradničke račune.',
 'emailauthenticated' => 'Vaša e-mail adresa je ovjerena $2 u $3.',
@@ -1019,7 +1019,8 @@ ove stranice. Ako je sačuvate, sve će promjene učinjene nakon ove inačice bi
 Također nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom.
 '''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
 'copyrightwarning2' => "Molimo uočite da svi suradnici mogu mijenjati sve doprinose na {{SITENAME}}. Ako ne želite da se Vaše pisanje nemilosrdno uređuje, nemojte ga slati ovdje.<br /> Također nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom (vidi $1 za detalje). '''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
-'longpageerror' => "'''GREŠKA: Tekst koji ste unijeli dug je $1 kilobajta, što je više od maksimalnih $2 kilobajta. Nije ga moguće snimiti.'''",
+'longpageerror' => "'''Pogrješka: Tekst koji ste unijeli dug je {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je više od maksimalno {{PLURAL:$2|jednog kilobajta|$2 kilobajta}}.'''
+Nije ga moguće snimiti.",
 'readonlywarning' => "'''UPOZORENJE: Baza podataka je zaključana zbog održavanja, pa trenutačno ne možete sačuvati svoje
 promjene. Najbolje je da kopirate i zaljepite tekst u tekstualnu datoteku te je snimite za kasnije.'''
 
@@ -1203,16 +1204,16 @@ $1",
 'revdel-restore-visible' => 'vidljive izmjene',
 'pagehist' => 'Povijest stranice',
 'deletedhist' => 'Obrisana povijest',
-'revdelete-hide-current' => 'Greška u skrivanju stavke datirane $2, $1: ovo je trenutačna inačica. Ne može biti skrivena.',
-'revdelete-show-no-access' => 'Greška u prikazivanju stavke od $2, $1: ova stavka je označena kao "ograničeno".
+'revdelete-hide-current' => 'Pogrješka u skrivanju stavke datirane $2, $1: ovo je trenutačna inačica. Ne može biti skrivena.',
+'revdelete-show-no-access' => 'Pogrješka u prikazivanju stavke od $2, $1: ova stavka označena je kao "ograničeno".
 Nemate pristup do nje.',
-'revdelete-modify-no-access' => 'Greška pri izmjeni stavke od $2, $1: ova stavka je označena kao "ograničeno".
+'revdelete-modify-no-access' => 'Pogrješka pri izmjeni stavke od $2, $1: ova je stavka označena kao "ograničeno".
 Nemate pristup do nje.',
-'revdelete-modify-missing' => 'Greška pri izmjeni izmjene broj $1: nedostaje u bazi!',
+'revdelete-modify-missing' => 'Pogrješka pri izmjeni izmjene broj $1: nedostaje u bazi!',
 'revdelete-no-change' => "'''Upozorenje:''' stavka od $2, $1 već ima tražene postavke vidljivosti.",
-'revdelete-concurrent-change' => 'Greška pri izmjeni stavke od $2, $1: izgleda da je njen status promijenio netko drugi dok ste ju pokušavali mijenjati.
+'revdelete-concurrent-change' => 'Pogrješka pri izmjeni stavke od $2, $1: izgleda da je njen status promijenio netko drugi dok ste ju pokušavali mijenjati.
 Provjerite evidencije.',
-'revdelete-only-restricted' => 'Greška pri skrivanju stavke od dana $2, $1: ne možete ukloniti stavke od pregledavanja administratora bez da odaberete neku od drugih mogućnosti vidljivosti.',
+'revdelete-only-restricted' => 'Pogrješka pri skrivanju stavke od dana $2, $1: ne možete ukloniti stavke od pregledavanja administratora bez da odaberete neku od drugih mogućnosti vidljivosti.',
 'revdelete-reason-dropdown' => '*Uobičajeni razlozi brisanja
 ** Kršenje autorskih prava
 ** Neprimjereni osobni podaci',
@@ -1834,9 +1835,9 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-invalid-url' => 'Nevaljan URL: $1',
 'http-invalid-scheme' => 'URL-ovi s prefiksom "$1" nisu podržani.',
 'http-request-error' => 'HTTP zahtjev nije uspio zbog nepoznate pogreške.',
-'http-read-error' => 'Greška pri čitanju HTTP.',
+'http-read-error' => 'Pogrješka pri čitanju HTTP.',
 'http-timed-out' => 'HTTP zahtjev je istekao.',
-'http-curl-error' => 'Greška pri otvaranju URL-a: $1',
+'http-curl-error' => 'Pogrješka pri otvaranju URL-a: $1',
 'http-host-unreachable' => 'URL nije dostupan.',
 'http-bad-status' => 'Došlo je do problema tijekom HTTP zahtjeva: $1 $2',
 
@@ -1887,7 +1888,7 @@ Kad je filtriran po korisniku, popis prikazuje samo one datoteke čiju posljednj
 'imagelinks' => 'Upotreba datoteke',
 'linkstoimage' => '{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedećih stranice povezuju}} na ovu datoteku:',
 'linkstoimage-more' => 'Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.
-Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.
+Sljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.
 [[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.',
 'nolinkstoimage' => 'Nijedna stranica ne povezuje na ovu sliku.',
 'morelinkstoimage' => 'Pogledaj [[Special:WhatLinksHere/$1|više poveznica]] za ovu datoteku.',
@@ -2042,7 +2043,7 @@ koja obično ukazuje na "pravu" odredišnu stranicu, na koju bi trebalo pokaziva
 'shortpages' => 'Kratke stranice',
 'longpages' => 'Duge stranice',
 'deadendpages' => 'Slijepe ulice',
-'deadendpagestext' => 'Slijedeće stranice nemaju poveznice na druge stranice na ovom wikiju ({{SITENAME}}).',
+'deadendpagestext' => 'Sljedeće stranice nemaju poveznice na druge stranice na ovom wikiju ({{SITENAME}}).',
 'protectedpages' => 'Zaštićene stranice',
 'protectedpages-indef' => 'Samo neograničene zaštite',
 'protectedpages-cascade' => 'Samo prenosiva zaštita',
@@ -2089,6 +2090,7 @@ Molimo obratite pozornost da druge web stranice mogu povezivati sliku izravnim U
 Možete suziti prikaz odabirući tip evidencije, suradničko ime ili stranicu u upitu.',
 'logempty' => 'Nema pronađenih stavki.',
 'log-title-wildcard' => 'Traži stranice koje počinju s navedenim izrazom',
+'showhideselectedlogentries' => 'Otkrij/sakrij odabrane evidencije',
 
 # Special:AllPages
 'allpages' => 'Sve stranice',
@@ -2504,7 +2506,7 @@ Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
 'istemplate' => 'kao predložak',
 'isimage' => 'poveznica na datoteku',
 'whatlinkshere-prev' => '{{PLURAL:$1|prethodna|prethodne|prethodnih}} $1',
-'whatlinkshere-next' => '{{PLURAL:$1|slijedeća|slijedeće|slijedećih}} $1',
+'whatlinkshere-next' => '{{PLURAL:$1|sljedeća|sljedeće|sljedećih}} $1',
 'whatlinkshere-links' => '← poveznice',
 'whatlinkshere-hideredirs' => '$1 preusmjeravanja',
 'whatlinkshere-hidetrans' => '$1 transkluzije',
@@ -2624,7 +2626,7 @@ Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokir
 'ipb-needreblock' => '$1 je već blokiran. Želite promijeniti postavke blokiranja?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Ostalo blokiranje|Ostala blokiranja}}',
 'unblock-hideuser' => 'Ne možete deblokirati ovog suradnika, jer je njegovo suradničko ime skriveno.',
-'ipb_cant_unblock' => 'Pogreška: blok ID $1 nije nađen. Moguće je da je suradnik već odblokiran.',
+'ipb_cant_unblock' => 'Pogrješka: blok ID $1 nije nađen. Moguće je da je suradnik već odblokiran.',
 'ipb_blocked_as_range' => 'Pogreška: IP adresa $1 nije blokirana direktno te stoga ne može biti odblokirana. Blokirana je kao dio opsega $2, koji može biti odblokiran.',
 'ip_range_invalid' => 'Raspon IP adresa nije valjan.',
 'ip_range_toolarge' => 'Opsezi blokiranja veći od /$1 nisu dozvoljeni.',
@@ -3581,7 +3583,7 @@ Potvrdite namjeru vraćanja ovog članka.",
 
 # Multipage image navigation
 'imgmultipageprev' => '← prethodna slika',
-'imgmultipagenext' => 'slijedeća slika →',
+'imgmultipagenext' => 'sljedeća slika →',
 'imgmultigo' => 'Kreni!',
 'imgmultigoto' => 'Idi na stranicu $1',
 
index 07685cf..fff133f 100644 (file)
@@ -529,8 +529,9 @@ Wotprašenje: $2',
 'protectedpagetext' => 'Strona je přećiwo wobdźěłowanju škitana.',
 'viewsourcetext' => 'Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować:',
 'viewyourtext' => "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
-'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary a je škitana, zo by so znjewužiwanje zadźěwało.',
-'editinginterface' => "'''Warnowanje:''' Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje  wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow. Hlej za přełožki [//translatewiki.net/wiki/Main_Page?setlang=hsb translatewiki.net], projekt lokalizacije MediaWiki.",
+'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.
+Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.',
+'editinginterface' => "'''Warnowanje:''' Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje  wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju. Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
 'sqlhidden' => '(SQL wotprašenje schowane)',
 'cascadeprotected' => 'Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:
 $2',
@@ -1668,7 +1669,7 @@ $1',
 'backend-fail-internal' => 'W składowanskim backendźe "$1" je njeznaty zmylk wustupił.',
 'backend-fail-contenttype' => 'Wobsahowy typ dataje, kotraž ma so na "$1" składować, njeda so zwěsćić.',
 'backend-fail-batchsize' => 'Staplowa dataja, kotraž {{PLURAL:$1|jednu operaciju|$1 operaciji|$1 operacije|$1 operacijow}} wobsahuje,  je so  na składowanski backend pósłała; limit je $2 {{PLURAL:$2|operaciju|operaciji|operacije|operacijow}} .',
-'backend-fail-usable' => 'Dataja $1 njeda so njedosahacych prawow  dla abo falowacych zapisow dla pisać.',
+'backend-fail-usable' => 'Dataja "$1" njeda so njedosahacych prawow  abo falowacych zapisow dla ani čitać ani pisać.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Njeje žadyn zwisk ze žurnalowej datowej banku za składowanski backend "$1" móžno.',
index ec5d002..3c2e2ce 100644 (file)
@@ -1218,7 +1218,8 @@ Ellenőrizd a naplókat.',
 'revdelete-only-restricted' => 'Hiba a(z) $1 $2 időbélyegű elem elrejtésekor: nem rejthetsz el az adminisztrátorok elől elemeket anélkül, hogy ne választanál ki egy másik elrejtési beállítást.',
 'revdelete-reason-dropdown' => '*Általános törlési okok
 ** Jogsértő tartalom
-** Kényes személyes információk',
+** Kényes személyes információk
+** Potenciális becsületsértő információk',
 'revdelete-otherreason' => 'Más/további ok:',
 'revdelete-reasonotherlist' => 'Más ok',
 'revdelete-edit-reasonlist' => 'Törlési okok szerkesztése',
index 4379259..dad3fa1 100644 (file)
@@ -38,45 +38,45 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Pinag-ugisan ti silpo:',
 'tog-justify' => 'Limpiaen dagiti parapo',
-'tog-hideminor' => 'Ilemmeng dagiti bassit a panagbaliw kadagiti naudi a panagisukat',
+'tog-hideminor' => 'Ilemmeng dagiti bassit a panagbaliw kadagiti naudi a sinuk-sukatan',
 'tog-hidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos kadagiti naudi a sinuk-sukatan',
-'tog-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid idiay baro a listaan ti panid',
+'tog-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid',
 'tog-extendwatchlist' => 'Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, tapno saan laeng a dagiti nabiit',
-'tog-usenewrc' => 'Dagiti grupo panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan  (masapul ti JavaScript)',
+'tog-usenewrc' => 'Dagiti grupo panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan  (masapul ti JavaScript)',
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
 'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
 'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
 'tog-editsection' => 'Pakabaelan ti panag-urnos iti paset babaen kadagiti [urnosen] a  panilpo',
-'tog-editsectiononrightclick' => 'Ikkan ti pakabaelan ti paset  a panag-urnos no agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
-'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga addan ti ad-adu ngem dagiti 3 a paulo)',
-'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kaadu nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
+'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
+'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
+'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
 'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles  nga inpanko idiay listaan ti bambantayak',
 'tog-watchdefault' => 'Agnayon kadagiti panid ken papeles nga inurnosko idiay listaan ti bambantayak',
 'tog-watchmoves' => 'Agnayon kadagiti panid ken papeles nga inyalisko idiay listaan ti bambantayak',
 'tog-watchdeletion' => 'Agnayon kadagiti panid ken papeles nga inikkatko idiay listaan ti bambantayak',
 'tog-minordefault' => 'Markaan amin nga  inurnos a kas sigud a bassit',
 'tog-previewontop' => 'Ipakita ti panag-padas sakbay ti kahon ti inurnos',
-'tog-previewonfirst' => 'Ipakita ti na-ipadas iti umuna nga inurnos',
-'tog-nocache' => 'Ibaldado ti pagcache ti pabasabasam iti daytoy a panid',
+'tog-previewonfirst' => 'Ipakita ti pinadas iti umuna a panag-urnos',
+'tog-nocache' => 'Ibaldado ti panagilemmeng ti pabasabasa ti panid',
 'tog-enotifwatchlistpages' => 'E-suratannak no mabaliwan ti panid wenno papeles idiay listaan dagiti bambantayak',
-'tog-enotifusertalkpages' => 'E-suratannak no mabaliwan ti panidko a tungtongan ti agar-aramat',
+'tog-enotifusertalkpages' => 'E-suratannak no mabaliwan ti tungtungan a panidko',
 'tog-enotifminoredits' => 'E-suratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles',
-'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti e-surat ko kadagiti pammalagip ti  e-surat',
-'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbambantay nga agar-aramat',
+'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti e-suratko kadagiti panagipakaaammo nga  e-surat',
+'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbuybuya nga agar-aramat',
 'tog-oldsig' => 'Ti adda a pirma:',
 'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
-'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a pinakaikabil idiay komputer mo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nagruna a kasasaad a pinakaikabil idiay komputer mo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-showjumplinks' => 'Ikkan ti pakabaelan  a  "mapan iti"  agpalaka a sumrek kadagiti panagsilpo',
-'tog-uselivepreview' => 'Usaren ti panag-padas tattan (masapul ti JavaScript) (suuten laeng)',
+'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
+'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
+'tog-showjumplinks' => 'Pakabaelan  a  "lumaktaw kadagiti"  naipalaka a pagserkan a silpo',
+'tog-uselivepreview' => 'Usaren ti agdama a panagpadas  (masapul ti JavaScript) (eksperimento)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
-'tog-watchlisthideown' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnosko',
-'tog-watchlisthidebots' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti bot',
-'tog-watchlisthideminor' => 'Ilemmeng idiay listaan ti bambantayan dagiti bassit nga  inurnos',
-'tog-watchlisthideliu' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti nakastrek nga agar-aramat',
-'tog-watchlisthideanons' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti di am-ammo nga agar-aramat',
-'tog-watchlisthidepatrolled' => 'Ilemmeng idiay listaan ti bambantayan dagiti napatruliaan nga inurnos',
-'tog-ccmeonemails' => 'Patulodandak iti kopia kadagiti e-surat nga ipatulodko kadagiti sabsabali nga agar-aramat',
+'tog-watchlisthideown' => 'Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan',
+'tog-watchlisthidebots' => 'Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan',
+'tog-watchlisthideminor' => 'Ilemmeng dagiti bassit nga inurnos manipud ti listaan ti bambantayan',
+'tog-watchlisthideliu' => 'Ilemmeng dagiti inurnos ti nakasterk nga agar-aramat manipud ti listaan ti bambantayan',
+'tog-watchlisthideanons' => 'Ilemmeng dagiti inurnos ti di am-ammo nga agar-aramat manipud ti  listaan ti bambantayan',
+'tog-watchlisthidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos manipud ti listaan ti bambantayan',
+'tog-ccmeonemails' => 'Patulodandak kadagiti kopia ti e-surat nga ipatulodko kadagiti sabsabali nga agar-aramat',
 'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
 'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
 'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagi-subli',
@@ -145,19 +145,19 @@ $messages = array(
 'dec' => 'Dis',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategoria|Dagiti kategoria}}',
-'category_header' => 'Dagiti panid ti kategoria  "$1"',
+'pagecategories' => '{{PLURAL:$1|Kategoria|Katkategoria}}',
+'category_header' => 'Dagiti panid nga adda iti kategoria  "$1"',
 'subcategories' => 'Dagiti apo ti kategoria',
-'category-media-header' => 'Dagiti midia ti kategoria  "$1"',
+'category-media-header' => 'Dagiti midia nga adda iti kategoria  "$1"',
 'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
 'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
-'hidden-category-category' => 'Dagiti nailemmeng a kategoria',
+'hidden-category-category' => 'Nailemmeng a katkategoria',
 'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
-'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
-'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad nga {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
-'category-article-count-limited' => 'Ti sumaganad nga {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
-'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad nga {{PLURAL:$1| a papeles|$1  a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
-'category-file-count-limited' => 'Ti sumaganad nga {{PLURAL:$1|a papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
+'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad  {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
+'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad  {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
+'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
+'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad  {{PLURAL:$1| a papeles|$1  a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
+'category-file-count-limited' => 'Ti sumaganad  {{PLURAL:$1|a papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
 'listingcontinuesabbrev' => 'tuloy.',
 'index-category' => 'Dagiti naipasurutan a panid',
 'noindex-category' => 'Dagiti saan a pagsurutan a panid',
@@ -169,8 +169,8 @@ $messages = array(
 'cancel' => 'Ukasen',
 'moredotdotdot' => 'Adu pay...',
 'mypage' => 'Panidko',
-'mytalk' => 'Pakitungtongak',
-'anontalk' => 'Tungtongan iti daytoy a pagtaengan ti IP',
+'mytalk' => 'Pakitungtungak',
+'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
 'navigation' => 'Pagdaliasatan',
 'and' => '&#32;ken',
 
@@ -191,8 +191,8 @@ $messages = array(
 'vector-action-move' => 'Iyalis',
 'vector-action-protect' => 'Salakniban',
 'vector-action-undelete' => 'Isubli ti inikkat',
-'vector-action-unprotect' => 'Sukatan ti panag-salaknib',
-'vector-simplesearch-preference' => 'Ikkan ti pakabaelan ti napasayaat a singasing ti panagbiruk (Kudil a Vector laeng)',
+'vector-action-unprotect' => 'Sukatan ti salaknib',
+'vector-simplesearch-preference' => 'Pakabaelan ti napasayaat a singasing ti panagbiruk (Kudil a Vector laeng)',
 'vector-view-create' => 'Agaramid',
 'vector-view-edit' => 'Urnosen',
 'vector-view-history' => 'Kitaen ti pakasaritaan',
@@ -228,16 +228,16 @@ $messages = array(
 'protect' => 'Salakniban',
 'protect_change' => 'sukatan',
 'protectthispage' => 'Salakniban daytoy a panid',
-'unprotect' => 'Sukatan ti panag-salaknib',
+'unprotect' => 'Sukatan ti salaknib',
 'unprotectthispage' => 'Sukatan ti salaknib daytoy a panid',
 'newpage' => 'Baro a panid',
-'talkpage' => 'Pagtungtongan daytoy a panid',
-'talkpagelinktext' => 'Makipatang',
+'talkpage' => 'Pagtungtungan daytoy a panid',
+'talkpagelinktext' => 'Tungtungan',
 'specialpage' => 'Espesial a panid',
 'personaltools' => 'Bukod a ram-ramit',
 'postcomment' => 'Baro a paset',
 'articlepage' => 'Kitaen ti naglaon a panid',
-'talk' => 'Pagtungtongan',
+'talk' => 'Pagtungtungan',
 'views' => 'Dagiti pangkitaan',
 'toolbox' => 'Ramramit',
 'userpage' => 'Kitaen ti panid ti agar-aramat',
@@ -248,13 +248,13 @@ $messages = array(
 'viewhelppage' => 'Kitaen ti panid ti tulong',
 'categorypage' => 'Kitaen ti panid ti kategoria',
 'viewtalkpage' => 'Kitaen ti pagtungtungan',
-'otherlanguages' => 'Dagiti sabali a pagsasao',
+'otherlanguages' => 'Kadagiti sabali a pagsasao',
 'redirectedfrom' => '(Naibaw-ing manipud idiay $1)',
 'redirectpagesub' => 'Baw-ing a panid',
-'lastmodifiedat' => 'Naudi a nabaliwan daytoy a panid idi $1, ti oras nga $2.',
+'lastmodifiedat' => 'Daytoy a panid ket  naudi a nabaliwan idi $1, ti oras nga $2.',
 'viewcount' => 'Naserrekan daytoy a panid iti {{PLURAL:$1|naminsan|$1 a daras}}.',
 'protectedpage' => 'Nasalakniban a panid',
-'jumpto' => 'Mapan idiay:',
+'jumpto' => 'Lumaktaw idiay:',
 'jumptonavigation' => 'pagdaliasatan',
 'jumptosearch' => 'biruken',
 'view-pool-error' => 'Pasensian, dagiti servers ket nadagsenan unay tattan.
@@ -299,7 +299,7 @@ $1',
 'newmessageslink' => 'dagiti baro a mensahe',
 'newmessagesdifflink' => 'naudi a sinukatan',
 'youhavenewmessagesfromusers' => 'Adda $1 manipud {{PLURAL:$3|ti sabali nga agar-aramat|$3 kadagiti sabsabali nga agar-aramat}} ($2).',
-'youhavenewmessagesmanyusers' => 'Adda $1 fmanipud kadagiti adu nga agar-aramat ($2).',
+'youhavenewmessagesmanyusers' => 'Adda $1 manipud kadagiti adu nga agar-aramat ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|baro a mensahem|dagiti baro a mensahem}}',
 'newmessagesdifflinkplural' => 'kinaudi {{PLURAL:$1|a sinukatan|a sinuksukatan}}',
 'youhavenewmessagesmulti' => 'Adda dagiti baro a mensahem iti $1',
@@ -312,21 +312,21 @@ $1',
 'toc' => 'Dagiti linaon',
 'showtoc' => 'ipakita',
 'hidetoc' => 'ilemmeng',
-'collapsible-collapse' => 'Marba',
+'collapsible-collapse' => 'Rebbaen',
 'collapsible-expand' => 'Palawaen',
 'thisisdeleted' => 'Kitaen wenno isubli ti $1?',
 'viewdeleted' => 'Kitaen ti $1?',
 'restorelink' => '{{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}',
 'feedlinks' => 'Pakan:',
-'feed-invalid' => 'Saan a mabalin a kita ti maalala a pakan.',
-'feed-unavailable' => 'Awan dagiti pakan a sindikasion',
+'feed-invalid' => 'Saan a mabalin a kita ti maala a pakan.',
+'feed-unavailable' => 'Awan dagiti magun-od a sindikasion ti pakan',
 'site-rss-feed' => '$1 Pakan ti RSS',
-'site-atom-feed' => '$1 Pakan ti Atom',
+'site-atom-feed' => '$1 Pakan ti Atomo',
 'page-rss-feed' => '"$1" Pakan ti RSS',
-'page-atom-feed' => 'Pakan nga Atom ti "$1"',
+'page-atom-feed' => 'Pakan nga Atomo ti "$1"',
 'red-link-title' => '$1 (awan ti panid)',
-'sort-descending' => 'Ilasin mo nga agpababa',
-'sort-ascending' => 'Ilasin mo nga agpangato',
+'sort-descending' => 'Ilasin nga agpababa',
+'sort-ascending' => 'Ilasin nga agpangato',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Panid',
@@ -346,7 +346,7 @@ $1',
 Baka madi ti naimakiniliam nga URL, wenno sinurotmo ti saan nga agpayso a panilpo.
 Baka daytoy ket "kiteb" ti "software" nga ususaren babaen ti {{SITENAME}}.',
 'nosuchspecialpage' => 'Awan ti kasta nga espesial a panid',
-'nospecialpagetext' => '<strong>Nagkiddaw ka ti imbalido nga espesial a panid.</strong>
+'nospecialpagetext' => '<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>
 
 Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialPages|{{int:specialpages}}]].',
 
@@ -364,33 +364,33 @@ Ti kinaudi a panagsapul ti database ket:
 "$1"
 naggapu ti uneg ti opisio "$2".
 Ti database ket nangipatulod ti biddut "$3: $4".',
-'laggedslavemode' => 'Ballaag: Mabalin a ti panid ket awan ti nagyan na kadagiti naudi a panagpabaro.',
+'laggedslavemode' => 'Ballaag: Mabalin a ti panid ket saan nga aglaon kadagiti naudi a panagpabaro.',
 'readonly' => 'Nakandadoan ti database',
-'enterlockreason' => 'Mangipan ti rason no apay nga ikandado, agraman no kaano a maluktan ti kandado',
-'readonlytext' => 'Ti database ket naikandado iti baro a panagikabil ken panagbaliw, gapu dagiti kanayon a pagsimpa, ket no malpas kadawyanto nga agsubli.
+'enterlockreason' => 'Agikabil ti maysa a rasaon para iti kandado, agraman ti karkulo no kaano a maluktan ti kandado',
+'readonlytext' => 'Ti database ket agdama a naikandado kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kanayon a pagsimpa, ket no malpas kadawyanto nga agsubli.
 
-Ti administrador a nagkandado ket daytoy ti palawag na: $1',
-'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a nabirukanna kuman, ti napanaganan ti "$1" $2.
+Ti administrador a nangkandado ket nangited ti daytoy a palawag: $1',
+'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a mabirukanna kuma, a napanaganan ti "$1" $2.
 
 Dayoty ket gapu babaen ti sumaganad a baak a paggiddiatan wenno panilpo ti pakasaritaan ti maysa panid a dati a naikkat.
 
 No saan a kasta, baka nakasarak ti kiteb ti "software".
 
-Panngaasi nga  ibagam kadagiti [[Special:ListUsers/sysop|administrador]], isurat mo ti pakaammo dayta URL.',
+Panngaasi nga  ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isurat mo ti pakaammo dayta URL.',
 'missingarticle-rev' => '(binaliwan#: $1)',
 'missingarticle-diff' => '(Sabali: $1, $2)',
-'readonly_lag' => 'Automatiko a narikpan ti database kabayatan a dagiti tagabu a database servers ket kumamakam iti agturay',
+'readonly_lag' => 'Automatiko a narikpan ti database kabayatan a dagiti tagabu a database server ket kumamakam iti agturay',
 'internalerror' => 'Akin-uneg a biddut',
 'internalerror_info' => 'Akin-uneg a biddut: $1',
 'fileappenderrorread' => 'Saan a mabasa ti "$1" idi agpanayon.',
 'fileappenderror' => 'Saan a manayonan ti "$1" iti  "$2".',
 'filecopyerror' => 'Saan a makopia ti papeles $1 iti $2.',
-'filerenameerror' => 'Saan a managanan ti papeles "$1" iti "$2".',
+'filerenameerror' => 'Saan a managanan manen ti papeles "$1" iti "$2".',
 'filedeleteerror' => 'Saan a maikkat ti papeles  "$1".',
 'directorycreateerror' => 'Saan a maaramid ti direktorio  "$1".',
-'filenotfound' => 'Saan a masarakan ti papeles  "$1".',
+'filenotfound' => 'Saan a mabirukan ti papeles  "$1".',
 'fileexistserror' => 'Di mabalin a maisurat ti papeles  "$1": Adda kastan a papeles',
-'unexpected' => 'Di mapakpakadaaan a kuwenta: "$1"="$2".',
+'unexpected' => 'Di mapakpakadaaan a pateg: "$1"="$2".',
 'formerror' => 'Biddut: saan a maited ti nakabuklan.',
 'badarticleerror' => 'Saan a matungpal daytoy nga aramid iti daytoy a panid.',
 'cannotdelete' => 'Ti panid wenno ti papeles "$1" ket saan a maikkat.
@@ -401,25 +401,26 @@ Awan ti intedna a palawag.',
 'badtitle' => 'Madi a titulo',
 'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a titulo nga inter-lengguahe wenno inter-wiki a titulo.
 Adda ngata nagyan a maysa wenno ad-adu pay a kababalin a saan a mausar iti titulo.',
-'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagant|dagiti $1 a nagbanagan}} ket magun-od idiay cache.',
-'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay cache.',
+'perfcached' => 'Ti sumaganad a data ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagant|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.',
+'perfcachedts' => 'Ti sumaganad a data ket naidulin, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay pagidulinan.',
 'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. 
-Saan a mipasaradiwa ita dagiti data ditoy.',
+Saan a mipasaradiwa ita dagiti datos ditoy.',
 'wrong_wfQuery_params' => 'Kamali a parametro iti wfQuery()<br />
 Pamay-an: $1<br />
 Panagsapul: $2',
 'viewsource' => 'Kitaen ti taudan',
-'viewsource-title' => 'Kitaen ti taudan iti $1',
+'viewsource-title' => 'Kitaen ti taudan para iti $1',
 'actionthrottled' => 'Napabuntog ti aramid',
 'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatinggaka ti panagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
 Pangngaasi nga ipadasmo manen no madamdama.',
 'protectedpagetext' => 'Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos.',
 'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
 'viewyourtext' => "Mabalinmo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
-'protectedinterface' => 'Daytoy a panid ket mangited ti testo nga interface para iti software, ken nasalakniban tapno mapawilan ti panag-abuso.',
+'protectedinterface' => 'Daytoy a panid ket mangited ti testo nga interface para iti software iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.
+Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.',
 'editinginterface' => "'''Ballaag:''' Ururnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti software.
-Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti agaramat nga interface dagiti sabali nga agar-aramat.
-Para kadagiti panagipatarus, pangngaasim a padasen ti agaramat ti [//translatewiki.net/wiki/Main_Page?setlang=ilo translatewiki.net], ti gandat a panagipatarus ti MediaWiki.",
+Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti panagaramat nga interface dagiti sabali nga agar-aramat iti daytoy a wiki.
+Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki..",
 'sqlhidden' => '(nakalemmeng ti biniruk a SQL )',
 'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos, ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap"  :
 $2',
@@ -429,7 +430,7 @@ $2',
 'ns-specialprotected' => 'Saan a mabalin nga urnosen dagiti espesial a panid.',
 'titleprotected' => "Daytoy a titulo ket nasalakniban manipud ti panakapartuat babaen ni [[User:$1|$1]].
 Ti naited a rason ket ''$2''.",
-'filereadonlyerror' => 'Di nabaliwan ti papales "$1" gapu ket ti repositorio ti papeles "$2" ket basaen laeng a moda.
+'filereadonlyerror' => 'Di nabaliwan ti papeles "$1" gapu ket ti repositorio ti papeles "$2" ket basaen laeng a moda.
 
 Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Imbalido a titulo nga adda ti nagan ti lugar "$2" ken testo "$3"',
@@ -446,7 +447,7 @@ Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'"
 'logouttext' => "'''Nakaruarkan.'''
 
 Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno [[Special:UserLogin|sumrek ka manen]] iti sigud wenno sabali nga agar-aramat.
-Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakaserrek ka pay laeng, agingga na nga dalusam ti \"cache\" ti panagbasabasam.",
+Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakaserrekka pay laeng, aginggana no dalusam ti \"cache\" ti panagbasabasam.",
 'welcomecreation' => '== Kablaaw, $1! ==
 Naaramiden ti pakabilangam.
 Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENAME}} kaykayat]].',
@@ -454,7 +455,7 @@ Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENA
 'yourpassword' => 'Kontrasenias:',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
 'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
-'securelogin-stick-https' => 'Agyan ka a nakasilpo iti HTTPS no nakastrekka',
+'securelogin-stick-https' => 'Agyanka a nakasilpo iti HTTPS kalpasan no nakastrekka',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
 'password-change-forbidden' => 'Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.',
 'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo a ruar a pakabilangan.',
@@ -474,37 +475,41 @@ Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENA
 'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
 'createaccountmail' => 'Babaen ti e-surat',
 'createaccountreason' => 'Rason:',
-'badretype' => 'Saan nga agparis dagiti impanmo a kontrasenias.',
-'userexists' => 'Maus-usaren ti nagan a kayat mo.
-Pangngaasim ta agpilika ti sabali a nagan.',
+'badretype' => 'Saan nga agpada dagiti impanmo a kontrasenias.',
+'userexists' => 'Maus-usaren ti nagan a kayatmo.
+Pangngaasi nga agpilika ti sabali a nagan.',
 'loginerror' => 'Biddut ti sumrek',
 'createaccounterror' => 'Saan a makaaramid ti pakabilangan: $1',
-'nocookiesnew' => 'Naaramid ti pakabilangan daytoy agaramat, ngem saanka a nakastrek.
-{{SITENAME}} ket agususar kadagiti "galietas" para iserrek ti agaramat.
-Nabaldado dagiti galietas mo.
-Pangngaasi ta pakabaelam ida,  ken sumrek ka nga agusar ti baro a nagan ken kontrasenias.',
-'nocookieslogin' => 'Ti {{SITENAME}} ket agus-usar  kadagiti galietas tapno makastrek dagiti agar-aramat.
-Nabaldado dagiti galietas mo.
+'nocookiesnew' => 'Naaramid ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.
+Ti {{SITENAME}} ket agususar kadagiti "galietas" tapno maiserrek dagiti agaramat.
+Nabaldado dagiti galietam.
+Pangngaasi a pakabaelam ida,  ken sumrekka nga agusar ti baro a nagan ken kontrasenias.',
+'nocookieslogin' => 'Ti {{SITENAME}} ket agus-usar  kadagiti galietas tapno maiserrek dagiti agar-aramat.
+Nabaldado dagiti galietam.
 Pangngaasi a pakabaelam ida ken padasem manen ti sumrek.',
-'nocookiesfornew' => 'Ti pakabilangan ti agar-aramat ket saan a naaramid, saan mi a masingkedan ti naggapuan na.
-Usarem dagita galietas mo, ipadas mo manen daytoy a panid.',
+'nocookiesfornew' => 'Ti pakabilangan ti agar-aramat ket saan a naaramid, saanmi a mapasingkedan ti taudanna.
+Siguraduem a napakabaelan dagita galietam, ikargam manen daytoy a panid ken padasem manen.',
 'noname' => 'Saanmo a nainaganan ti agpayso a nagan ti agar-aramat.',
 'loginsuccesstitle' => 'Balligi ti panagserrek',
 'loginsuccess' => "'''Nakastrekkan iti {{SITENAME}} a kas ni \"\$1\".'''",
 'nosuchuser' => 'Awan ti agar-aramat nga agnagan iti "$1". 
 
-Kitaem ti panangiletra, wenno [[Special:UserLogin/signup|agaramid ka ti baro a pakabilangan]].',
-'nosuchusershort' => 'Awan ti agar-aramat nga addaan iti nagan a "$1".
+Dagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.
+
+Kitaem ti panangiletra, wenno [[Special:UserLogin/signup|agaramidka ti baro a pakabilangan]].',
+'nosuchusershort' => 'Awan ti agar-aramat nga agnagan ti "$1".
 Kitaem ti panangiletra.',
 'nouserspecified' => 'Nasken nga agikabilka ti nagan ti agar-aramat.',
 'login-userblocked' => 'Naserraan daytoy nga agar-aramat. Maiparit ti sumrek.',
-'wrongpassword' => 'Biddut (wenno awan) ti kontrasenias nga ikabil mo. Padasem koma manen, apo.',
-'wrongpasswordempty' => 'Blanko ti impanmo a kontrasenias. Padasem koma manen apo.',
-'passwordtooshort' => 'Ti kontrasenias ket nasken nga adda  {{PLURAL:$1|iti 1 a karakter|kadagiti $1 a karakter}}.',
-'password-name-match' => 'Masapul a saan nga agpadpada ti  nagan mo nga agar-aramat ken kontrasenias',
-'password-login-forbidden' => 'Maiparit daytoy ususarem a nagan ti agar-aramat ken kontrasenias.',
+'wrongpassword' => 'Saan nga husto  ti kontrasenias a naikabil. 
+Pangngaasi a padasem manen.',
+'wrongpasswordempty' => 'Blanko ti naikabil  a kontrasenias. 
+Pangngaasi a padasem manen.',
+'passwordtooshort' => 'Ti kontrasenias ket nasken a saan a basbasit ngem  {{PLURAL:$1|1 a karakter| $1 a karkarakter}}.',
+'password-name-match' => 'Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.',
+'password-login-forbidden' => 'Ti panag-usar ti daytoy a nagan ket kontrasenias ket naiparit..',
 'mailmypassword' => 'E-surat ti baro a kontrasenias',
-'passwordremindertitle' => 'Baro a saan nga agnayon a kontrasenias para idiay  {{SITENAME}}',
+'passwordremindertitle' => 'Baro a temporario a kontrasenias para iti  {{SITENAME}}',
 'passwordremindertext' => 'Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw ti baro
 a kontrasenias para iti {{SITENAME}} ($4). Ti saan nga agnayon a kontrasenias ti agususar
 "$2" ket naaramiden ken naidisso iti "$3". No kastan ti kinayatmo,
@@ -512,74 +517,75 @@ masapul a sumrek ka ta agpili ka ti baro a kontrasenias.
 Ti temporario a bukodmo a kontrasenias ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 
 No sabali ti nagkiddaw, wenno no malagipmo pay ti kontrasenias mo ket dimon kayat a suktan daytoy, mabalin a dimo lattan ikaskaso daytoy a mensahe ket itultuloymo latta nga usaren ti daan a kontrasenias.',
-'noemail' => 'Awan ti nagtaengan ti e-surat  a nairehistro iti agar-aramat a ni "$1".',
+'noemail' => 'Awan ti i e-surat a pagtaengan a nairehistro para  iti agar-aramat a ni "$1".',
 'noemailcreate' => 'Mangtedka to pudno nga e-surat a pagtaengam',
-'passwordsent' => 'Naipatulod ti baro a kontrasenias iti e-surat a pagtaengan a nairehistro ken "$1".
+'passwordsent' => 'Naipatulod ti baro a kontrasenias iti e-surat a pagtaengan a nairehistro kenni "$1".
 Sumrekka koma manen kalpasan a maawatmo daytoy a baro a kontrasenias.',
-'blocked-mailpassword' => 'Ti IP a pagtaengam ket naserraan iti panagurnos, isu nga saan a mabalin nga agusar ti panagala ti kontrasenias nga opisio tapno mapawilan ti panag-abuso.',
+'blocked-mailpassword' => 'Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, ken isu a saan a mabalin nga agusar ti panagala ti kontrasenias a pamay-an tapno mapawilan ti panag-abuso.',
 'eauthentsent' => 'Naipatuloden ti pammasingked nga e-surat iti naited nga e-surat a pagtaengan.
 Sakbay nga ania man nga e-surat ti maipatulod iti pakabilangan, masapul a surotem dagiti maibagbaga iti e-surat, tapno mapasingkedan a ti pakabilangan ket agpayso a kukuam.',
 'throttled-mailpassword' => 'Ti palagip ti kontrasenias ket naipatuloden, iti napalabas nga {{PLURAL:$1|oras|$1 nga oras}}.
 Tapno maipawilan ti panag-abuso, maysa laeng a palagip ti kontrasenias ti maipatulod ti tunggal maysa nga {{PLURAL:$1|oras|$1 nga oras}}.',
-'mailerror' => 'Biddut iti panagipatulod iti surat: $1',
-'acct_creation_throttle_hit' => 'Dagiti bisita daytoy wiki nga agususar ti IP a pagtaengan ket nakaaramid {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} ti maysa nga aldaw, dagita laeng ti mabalin a mausar.
-Ti nagbanaganna, dagitoy bisita nga agususar ti IP a pagtaengan ket saan a makaaramid ti pakabilangan tatta.',
+'mailerror' => 'Biddut iti panagipatulod ti surat: $1',
+'acct_creation_throttle_hit' => 'Dagiti sumarungkar ti daytoy a wiki nga agususar ti IP a pagtaengan ket nakaaramid {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.
+A kas ti nagbanagan, dagiti agsarsarummgkar nga agususar ti IP a pagtaengan ket agdama a saanda a mabalin a makaaramid kadagiti pakabilangan.',
 'emailauthenticated' => 'Napasingkedan ti e-surat a pagtaengan idi $2 ti oras nga $3.',
 'emailnotauthenticated' => 'Saan pay a napasingkedan ti e-surat mo.
-Awan ti e-surat nga ipatulod para dagitoy a langa.',
+Awan ti e-surat a naipatulod para kadagiti sumaganad a langa.',
 'noemailprefs' => 'Ipanaganan ti e-surat a pagtaengan tapno agbalin dagitoy a langa.',
 'emailconfirmlink' => 'Pasingkedam ti e-surat a pagtaengam',
-'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat, ket kasla addaan ti saan a napudno a nakabuklan.
+'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat ngamin ket kasla adda ti saan a napudno a nakabuklan.
 Pangngaasi nga ikkam ti nasayaat  a  nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
 'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
 'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
-'accountcreatedtext' => 'Naaramiden ti pakabilangan a pagaramat ni $1.',
+'accountcreatedtext' => 'Ti pakabilangan ti agar-aramat para iti  $1 ket naaramiden.',
 'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
-'createaccount-text' => 'Adda nagaramid ti pakabilangan iti e-surat a pagtaengam idiay {{SITENAME}} ($4) nagnagan a "$2", a ti kontrasenias a "$3".
-
-Saan mo nga ikaskaso daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
-'usernamehasherror' => 'Dagiti nagan ti agar-aramat ke saan nga ikkan dagiti "hash" a kababalin',
-'login-throttled' => 'Adu unay ti panagpadas mo a sumrek.
-Pangaasim ta aguray ka sakbay nga agipadas manen.',
-'login-abort-generic' => 'Madi ti panakastrekmo - Napasardeng',
+'createaccount-text' => 'Adda nagaramid ti pakabilangan para iti e-surat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti "$2", iti kontrasenias a "$3".
+Nasken a sumrekka ken sukatam ti kontraseniasmo tattan.
+
+Mabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
+'usernamehasherror' => 'Ti nagan ti agar-aramat ket nasken a saan nga aglaon kadagiti "hash" a karakter',
+'login-throttled' => 'Adu unay ti panagpadasmo a sumrek.
+Pangaasi nga agurayka sakbay nga agipadas manen.',
+'login-abort-generic' => 'Napaay ti panagserrekmo - Napasardeng',
 'loginlanguagelabel' => 'Pagsasao: $1',
-'suspicious-userlogout' => 'Madi ti kiniddawmo a rummuar, ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
+'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar  ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
 
 # E-mail sending
-'php-mail-error-unknown' => 'Di am-ammo a biddut ti kukua ti PHP a surat () nga opisio.',
-'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan na.',
+'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP  () a pamay-an.',
+'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan.',
 
 # Change password dialog
 'resetpass' => 'Sukatan ti kontrasenias',
-'resetpass_announce' => 'Simrek ka nga nagusar iti saan nga agnayon nga e-surat a kodigo.
-Tapno malpas ka a makastrek, mangikabil ka ti baro a kontrasenias ditoy:',
+'resetpass_announce' => 'Simrekka a nagus-usar ti temporario a kodigo ti e-surat.
+Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:',
 'resetpass_header' => 'Sukatan ti kontrasenias ti pakabilangan',
 'oldpassword' => 'Daan a kontrasenias:',
 'newpassword' => 'Baro a kontrasenias:',
-'retypenew' => 'Isurat manen ti baro a kontrasenias:',
+'retypenew' => 'Imakinilya manen ti baro a kontrasenias:',
 'resetpass_submit' => 'Ikabil ti kontrasenias ken sumrek',
 'resetpass_success' => 'Nagballigi a nabaliwan ti kontrasenias mo! 
 </br>
 Iserrek kan...',
 'resetpass_forbidden' => 'Saan a masukatan dagiti kontrasenias',
-'resetpass-no-info' => 'Masapul a nakastrekka tapno dagus ka a makapan iti panid .',
+'resetpass-no-info' => 'Masapul a nakastrekka tapno dagus a makapan ti daytoy a panid .',
 'resetpass-submit-loggedin' => 'Sukatan ti kontrasenias',
 'resetpass-submit-cancel' => 'Ukasen',
-'resetpass-wrong-oldpass' => 'Imbalido ti saan nga agnayon wenno agdama a kontrasenias.
-Baka mabalin a nasukatam metten ti kontrasenias mo wenno nagkiddaw ka ti saan nga agnayon a kontrasenias.',
-'resetpass-temp-password' => 'Saan nga agnayon a kontrasenias:',
+'resetpass-wrong-oldpass' => 'Imbalido ti temporario wenno agdama a kontrasenias.
+Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.',
+'resetpass-temp-password' => 'Temporario a kontrasenias:',
 
 # Special:PasswordReset
 'passwordreset' => 'Ipasubli ti kontrasenias',
-'passwordreset-text' => 'Lippasem daytoy a kinabuklan tapno maipatulodan ka ti e-surat a palagipan kadagiti dsalaysay ti pakabilangam.',
+'passwordreset-text' => 'Lippasem daytoy a kinabuklan tapno maipatulodanka ti e-surat a paglagipan kadagiti salaysay ti pakabilangam.',
 'passwordreset-legend' => 'Ipasubli ti kontrasenias',
-'passwordreset-disabled' => 'Naikkat dagiti pagisubli iti kontrasenias daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a bukel ti datos dita baba}}',
+'passwordreset-disabled' => 'Nabaldado dagiti panagisubli ti kontrasenias iti daytoy a wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a piraso ti datos dita baba}}',
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
-'passwordreset-capture' => 'Kayatmo a kitaen ti nagbanagan ti e-surat?',
-'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda saan nga agnayon a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
+'passwordreset-capture' => 'Kitaem ti nagbanagan ti e-surat?',
+'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
 'passwordreset-email' => 'E-surat a pagtaengan:',
 'passwordreset-emailtitle' => 'Salaysay ti pakabilangan iti {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti palagip para
@@ -588,7 +594,7 @@ nakairaman iti daytoy nga e-surat a pagtaengan:
 
 $2
 
-{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
+{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
 panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
 agtuloy ka nga agusar ti daan a kontrasenias.',
@@ -598,41 +604,41 @@ nakairaman iti daytoy nga e-surat a pagtaengan:
 
 $2
 
-{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
+{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
 panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
 agtuloy kan nga agusar ti daan a kontrasenias mo.',
 'passwordreset-emailelement' => 'Nagan ti agar-aramat: $1
-Saan nga agnayon a kontrasenias: $2',
+Temporario a kontrasenias: $2',
 'passwordreset-emailsent' => 'Maipatuloden ti e-surat a palagip.',
 'passwordreset-emailsent-capture' => 'Naipatulod ti palagip nga e-surat, a napaikita dita baba.',
-'passwordreset-emailerror-capture' => 'Naaramid ti palagip nga e-surat, a napaikita dita baba, ngem madi a napaitulod ti agar-aramat: $1',
+'passwordreset-emailerror-capture' => 'Naaramid ti palagip nga e-surat, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Sukatan ti e-surat a pagtaengan',
 'changeemail-header' => 'Sukatan ti e-surat a pagtaengan ti pakabilangan',
 'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti e-surat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.',
-'changeemail-no-info' => 'Masapul a nakastrekka tapno dagus ka a makapan ditoy a panid.',
+'changeemail-no-info' => 'Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.',
 'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
-'changeemail-newemail' => 'Baro nga e-surat a pagtaengam:',
+'changeemail-newemail' => 'Baro nga e-surat a pagtaengan:',
 'changeemail-none' => '(awan)',
 'changeemail-submit' => 'Sukatan ti e-surat',
 'changeemail-cancel' => 'Ukasen',
 
 # Edit page toolbar
-'bold_sample' => 'Napuskol a teksto',
-'bold_tip' => 'Napuskol a teksto',
-'italic_sample' => 'Nakairig a teksto',
-'italic_tip' => 'Nakairig a teksto',
+'bold_sample' => 'Napuskol a testo',
+'bold_tip' => 'Napuskol a testo',
+'italic_sample' => 'Nakairig a testo',
+'italic_tip' => 'Nakairig a testo',
 'link_sample' => 'Titulo ti panilpo',
 'link_tip' => 'Akin-uneg a panilpo',
 'extlink_sample' => 'http://www.example.com titulo ti panilpo',
-'extlink_tip' => 'Akinruar a panilpo (laglagipen ti http:// a prefix)',
+'extlink_tip' => 'Akin-ruar a panilpo (laglagipen ti http:// a pasaruno)',
 'headline_sample' => 'Testo ti paulo',
-'headline_tip' => 'Maika-2 a lessaad ti paulo',
-'nowiki_sample' => 'Isengngat ti saan a nabuklan a testo ditoy',
-'nowiki_tip' => 'Saan nga ikaskaso ti panagbuklan a wiki',
-'image_tip' => 'Naibinggas a papeles',
+'headline_tip' => 'Maika-2 nga agasmang ti paulo',
+'nowiki_sample' => 'Isengngat ti saan a naporma a testo ditoy',
+'nowiki_tip' => 'Saan nga ikaskaso ti panakaporma ti wiki',
+'image_tip' => 'Naisengngat a papeles',
 'media_tip' => 'Panilpo ti papeles',
 'sig_tip' => 'Ti pirmam nga adda ti oras ken petsa',
 'hr_tip' => 'Pakuros a linia (manmano laeng nga aramaten)',
@@ -640,7 +646,7 @@ Saan nga agnayon a kontrasenias: $2',
 # Edit pages
 'summary' => 'Pakabuklan:',
 'subject' => 'Suheto/paulo:',
-'minoredit' => 'Bassit a panag-urnos laeng daytoy',
+'minoredit' => 'Daytoy ket bassit a panag-urnos',
 'watchthis' => 'Bantayan daytoy a panid',
 'savearticle' => 'Idulin ti panid',
 'preview' => 'Naipadas',
@@ -649,12 +655,12 @@ Saan nga agnayon a kontrasenias: $2',
 'showdiff' => 'Ipakita dagiti sinukatan',
 'anoneditwarning' => "'''Ballaag:''' Saanka a nakastrek.
 Mairehistro ti IP a pagtaengam iti pakasaritaan ti panagurnos iti daytoy a panid.",
-'anonpreviewwarning' => '" Saanka a nakastrek. No idulin mo mairehistro ti IP a pagtaengam kadagitoy pakasaritaan ti panagurnos ti panid."',
-'missingsummary' => "'''Palagip:''' Saanka a nangipan iti pakabuklan ti panag-urnos mo.
-No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnos mo nga awan ti pakabuklan na.",
-'missingcommenttext' => 'Pangngaasim a mangipanka iti komentario dita baba.',
-'missingcommentheader' => "'''Palagip:''' Saanka a nangipan iti suheto/paulo para iti daytoy a komentario.
-No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnormo nga awan ti pakabuklanna.",
+'anonpreviewwarning' => '" Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a  pakasaritaan ti panagurnos iti daytoy a panid."',
+'missingsummary' => "'''Palagip:''' Saanka a nakaited iti pakabuklan ti panag-urnos.
+No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnosmo nga awan ti pakabuklanna.",
+'missingcommenttext' => 'Pangngaasi nga agikabil ti komentario dita baba.',
+'missingcommentheader' => "'''Palagip:''' Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.
+No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnosmo nga awan ti pakabuklanna.",
 'summary-preview' => 'Naipadas a  pakabuklan:',
 'subject-preview' => 'Suheto/naipadas a paulo:',
 'blockedtitle' => 'Naseraan ti agar-aramat',
@@ -665,7 +671,7 @@ Ti rason ket ''$2''.
 
 * Rugi ti panangserra: $8
 * Panagpaso ti panangserra: $6
-* Ti kuma serraan na: $7
+* Ti kuma serraan na: $7
 
 Mabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panag-serra.
 Dimo mabalin nga aramaten ti ramit nga e-suratan daytoy nga agar-aramat malaksid no adda napudno nga e-surat a pagtaengan a naipan iti  [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.
@@ -687,15 +693,15 @@ naserraan ti panag-usar na.
 Ti tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.
 Pangaasi nga iramanmo amin dagiti salaysay ti amin a panagsaludsodmo.',
 'blockednoreason' => 'awan ti naited a rason',
-'whitelistedittext' => 'Nasken ti $1 tapno makaurnos kadagiti panid.',
-'confirmedittext' => 'Masapul a pasingkedam ti e-surat sakbay a makaurnos ka kadagiti panid.
+'whitelistedittext' => 'Nasken ti $1 tapno maurnosmo dagitoy a panid.',
+'confirmedittext' => 'Masapul a pasingkedam ti e-surat sakbay a makaurnos kadagitoy a panid.
 Pangngaasim nga ikabil ken ipapudnom ti e-suratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].',
-'nosuchsectiontitle' => 'Saan a mabirukan ti kasta a paset',
-'nosuchsectiontext' => 'Pinadasmo nga inurnos ti maysa a paset nga awan pay.
-Naiyalis ngatan wenno naikkat idi kitkitaen dayta a panid.',
+'nosuchsectiontitle' => 'Saan a mabirukan ti paset',
+'nosuchsectiontext' => 'Pinadasmo nga inurnos ti awan a paset.
+Mabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.',
 'loginreqtitle' => 'Masapul ti sumrek',
 'loginreqlink' => 'sumrek',
-'loginreqpagetext' => 'Nasken a $1 ka tapno makakitaka iti sabsabali a pampanid.',
+'loginreqpagetext' => 'Nasken a $1 ka tapno makakitaka kadagiti sabsabali a pampanid.',
 'accmailtitle' => 'Naipatuloden ti kontrasenias.',
 'accmailtext' => "Ti kontrasenias para ken ni [[User talk:$1|$1]] ket naipatuloden ken ni $2.
 
@@ -703,27 +709,27 @@ Ti kontrasenias ti baro a pakabilangan ket masukatan idiay ''[[Special:ChangePas
 'newarticle' => '(Baro)',
 'newarticletext' => "Nasurotmo ti maysa a panilpo ti panid a saan pay a napartuat. 
 Tapno mapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon dita baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). 
-No addaka ditoy babaen ti biddut, itaklam ti '''agsubli'''a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
-'anontalkpagetext' => "----''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saan na nga us-usaren.
+No addaka ditoy babaen ti biddut, itaklam ti '''agsubli''' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
+'anontalkpagetext' => "----''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saanna nga us-usaren.
 Dakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.
 Ti kastoy nga IP a pagtaengan ket us-usaren a bingayan ti adu pay a sabsabali nga agar-aramat.
 No sika ket maysa a di am-ammo nga agar-aramat ken dagiti awan ti kapategan a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agaramid ka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] 
-tapno maawanan ti pinakaulaw kadagiti sabali a di am-ammo nga agar-aramat.",
+tapno maawanan ti panakaulaw kadagiti sabali a di am-ammo nga agar-aramat.",
 'noarticletext' => 'Awan ti agdama a testo  daytoy a panid.
 Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] kadagiti sabsabali a pampanid,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbirukka],
 wenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid].',
-'noarticletext-nopermission' => 'Awan pay ti  nagyan na daytoy a panid.
+'noarticletext-nopermission' => 'Awan pay ti  nagyanna daytoy a panid.
 Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] iti sabsabali a pampanid,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbirukka],
-wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk ka kadagiti maikabagian a listaan]</span>.',
+wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbirukka kadagiti maikabagian a listaan]</span>.',
 'missing-revision' => 'Ti panagbalbaliw ti #$1 tipanid a nanaganan ti "{{PAGENAME}}" ket awan.
 
-Daytoy ket kadawyan agapuanan babaen ti samaganad a panilpo ti baak a pakasaritaan iti maysa a panid a naikkaten.
+Daytoy ket kadawyan a gapuanan babaen ti samaganad a panilpo ti baak a pakasaritaan iti maysa a panid a naikkaten.
 Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].',
 'userpage-userdoesnotexist' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro. 
 Pangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.',
-'userpage-userdoesnotexist-view' => 'Ti pakabilangan ni agar-aramat "$1" ket saan a nakarehistro.',
+'userpage-userdoesnotexist-view' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro.',
 'blocked-notice-logextract' => 'Agdama a naserraan daytoy nga agar-aramat.
 Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:',
 'clearyourcache' => "'''Pakaammo:''' No nalpaskan nga agiduldulin, kuma ket masapul nga ipalabas ti cahe ti pinagbasabasam tapno makita dagiti sinukatam.
@@ -758,7 +764,7 @@ No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek ka m
 
 '''No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.'''
 No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-'token_suffix_mismatch' => "'''Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna ti kuldit ti kababalin idiay pinagpudno ti panag-urnos.'''
+'token_suffix_mismatch' => "'''Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna ti kuldit ti kababalin idiay panagpudno ti panag-urnos.'''
 Ti panag-urnos ket saan a naawat tapno mapawilan ti panakadadael ti testo ti panid.
 Mapasamak daytoy no agus-usarka ti saan a nasayaat a naibasta ti sapot a diamammo a proxy a panagserbi.",
 'edit_form_incomplete' => "'''Adda dagiti paset ti panag-urnos a kabuklan a saan a nakadanon dita server; kitkitaen nga dagiti panag-urnosmo ket saan a naikkatan ken padasem manen.'''",
@@ -774,32 +780,32 @@ Ipatipon mo dagiti sinukatam idiay lugar ti testo.
 '''Iti laeng''' testo dita ngato a lugar ti testo ti maidulin no pesselem ti \"{{int:savearticle}}\".",
 'yourtext' => 'Ti testom',
 'storedversion' => 'Bersion a naidulin',
-'nonunicodebrowser' => "'''Ballaag: Ti  pabasabasam ket saan a kasla unicode .'''
-Adda sabali a mausar tapno makaurnos ka kadagiti panid: Ti saan nga-ASCII a kababalin ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
+'nonunicodebrowser' => "'''Ballaag: Ti  pabasabasam ket saan a naikeddeng ti Unicode .'''
+Adda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a kababalin ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
 'editingold' => "'''Ballag: Ururnosem ti daan a panag-baliw iti daytoy a panid.'''
 No idulinmo, mapukaw amin a sinukatam iti daytoy a panag-baliw.",
 'yourdiff' => 'Dagiti nagdudumaan',
-'copyrightwarning' => "Laglagipenyo koma, apo, nga amin a parawad iti {{SITENAME}} ket maibilang a nairuar iti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). 
+'copyrightwarning' => "Laglagipenyo koma, apo, nga amin a parawad iti {{SITENAME}} ket maibilang a mairuar iti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). 
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
-Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo ngem iti maysa a nawaya a pagturayan ti publiko wenno pumadmad a libre a pagtaudan.
- '''Saan a mangipan iti addaan a karbengan ti pinagpablaak nga obra no awan ti  pammalubos!'''",
+Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a lnawaya a nagtaudan.
+ '''Saan a mangited ti adda karbenganna a panagipablaak nga obra no awan ti  pammalubos!'''",
 'copyrightwarning2' => "Pangngaasiyo, apo, a laglagipen nga amin a parawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
-Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladam ngem iti maysa a nawaya a pagturayan ti publiko wenno pumadmad a libre a pagtaudan (kitaen ti $1 para iti salaysay).
-'''Saan a mangipan iti addaan ti karbengan ti pinagpablaak nga obra no awan ti  pammalubos!'''",
+Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a nawaya a pagtaudan (kitaen ti $1 para iti salaysay).
+'''Saan a mangipan iti adda ti karbenganna a panagpablaak nga obra no awan ti  pammalubos!'''",
 'longpageerror' => "'''Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} a katiddog, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.'''
 Isu ti gapuna a saan a maidulin.",
-'readonlywarning' => "'''Ballaag: Narikepan ti database tapno masimpaan, saan mo a mabalin nga idulin dagita inurnosmo tattan.'''
+'readonlywarning' => "'''Ballaag: Narikepan ti database para iti panagtaripatu, saanmo a mabalin nga idulin dagita inurnosmo tattan.'''
 No kayatmo i \"cut-n-paste\" mo dagiti testo iti testo a papeles ken idulinmo no madamdama.
 
 Ti administrador a nangrikep ket saan a nangted ti palawag: \$1",
-'protectedpagewarning' => "'''Ballaag:  Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaurnos ditoy.'''
+'protectedpagewarning' => "'''Ballaag:  Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga adda ti gundaway nga administrador ti makaurnos ditoy.'''
 Ti nakaudi a naikabil a listaan ket adda dita baba tapno usaren a  reperensia:",
 'semiprotectedpagewarning' => "'''Pakaammo:'''Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.
 Ti naudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
-'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga addaan ti  gundaway ti makaurnos, ngamin ket nairaman kadagiti sumaganad a sariap a nasalakniban
+'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga adda ti  gundaway ti makaurnos, ngamin ket nairaman kadagiti sumaganad a nasalakniban ti sariap
 {{PLURAL:$1|a panid|a pampanid}}:",
-'titleprotectedwarning' => "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ket nasken ti agpartuat iti daytoy.'''
+'titleprotectedwarning' => "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ket nasken ti makapartuat iti daytoy.'''
 Ti kinaudi a naikabil iti listaan ket naikabil dita baba tapno usaren a reperensia:",
 'templatesused' => '{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:',
 'templatesusedpreview' => '{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a nausar iti daytoy a panagpadas:',
@@ -819,29 +825,29 @@ Mabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumr
 'recreate-moveddeleted-warn' => "'''Ballaag: Agparpartuatka manen ti naikkat idi a panid'''
 
 Nasken a siguraduem no maikanatad nga ituloymo nga urnosen daytoy a panid.
-Ti panaka-ikkat ken panka-iyalis a listaan para iti daytoy  a panid ket adda ditoy a pakakitaan:",
+Ti panaka-ikkat ken panaka-iyalis a listaan para iti daytoy  a panid ket adda ditoy a pakakitaan:",
 'moveddeleted-notice' => 'Naikkaten daytoy a panid.
 Ti listaan a panaka-ikkat ken panaka-iyalis ti panid ket naikabil dita baba tapno usaren a reperensia.',
-'log-fulllog' => 'Kitaem amin dagita listaan',
+'log-fulllog' => 'Kitaem ti napno a listaan',
 'edit-hook-aborted' => 'Ti panag-urnos ket napasardeng ti kawit.
 Awan ti intedna a palawag.',
 'edit-gone-missing' => 'Saan a mapabaro daytoy a panid.
 Kasla met naikkaten.',
 'edit-conflict' => 'Adda kasinnungat ti panag-urnos.',
-'edit-no-change' => 'Ti inurnos mo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
+'edit-no-change' => 'Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
-'defaultmessagetext' => 'Naisigud a testo ti mensahe',
+'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser nga opisio a pinagtawtawag.
+'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an  a panagtawtawag.
 
 Adda kuman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
-'expensive-parserfunction-category' => 'Dagiti panid nga adda ti adu unay a nangina a parser nga opisio a panagtawtawag',
-'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti naikabil a plantilia.
-Addan to dagiti plantilia a saan a maikabil.",
-'post-expand-template-inclusion-category' => 'Dagiti pampanid nga ayan dagiti nagsobra ti rukod dagiti naikabil a plantilia',
-'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket adda nagyanna a maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
+'expensive-parserfunction-category' => 'Dagiti panid nga adda ti adu unay a nangina a parser a pamay-an a panagtawtawag',
+'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti nairaman a kadakkel ti plantilia.
+Adda dagiti plantilia a saanto a mairaman.",
+'post-expand-template-inclusion-category' => 'Pampanid nga ayan ti plantilia a  nagsobra ti kadakkel ti rukod a nairaman',
+'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
 Dagitoy a panagpalawag  ket naikkaten.",
 'post-expand-template-argument-category' => 'Dagiti panid a naglaon ti naikkat a plantilia kadagiti kasinnungat',
 'parser-template-loop-warning' => 'Adda nasarakan a silo ti plantilia: [[$1]]',
@@ -860,13 +866,13 @@ Dagitoy a panagpalawag  ket naikkaten.",
 Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.',
 'undo-failure' => 'Ti inurnos ket saan a maipasubli ta adda dagiti nakisinnungat a patingnga a naurnos.',
 'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan met daytoy wenno mabalin a naikkat.',
-'undo-summary' => 'Ibabawi ti binaliwan $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Makipatang]])',
+'undo-summary' => 'Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Madi a maaramid ti pakabilangan',
-'cantcreateaccount-text' => "Ti agaramid iti pakabilangan manipud itoy nga IP a pagtaengan ('''$1''') ket sinerraan ni [[User:$3|$3]].
+'cantcreateaccounttitle' => 'Saan a makaaramid ti pakabilangan',
+'cantcreateaccount-text' => "Ti panagaramid ti pakabilangan manipud itoy nga IP a pagtaengan ('''$1''') ket sinerraan babaen ni [[User:$3|$3]].
 
-Ti inted a rason ni $3 ket ''$2''",
+Ti inted a rason babaen ni $3 ket ''$2''",
 
 # History pages
 'viewpagelogs' => 'Kitaen dagiti listaan para iti daytoy a panid',
@@ -877,7 +883,7 @@ Ti inted a rason ni $3 ket ''$2''",
 'revision-info' => 'Panangbaliw manipud idi $1 babaen ni $2',
 'previousrevision' => '←Daan a panangbalbaliw',
 'nextrevision' => 'Nabarbaro a panangbalbaliw→',
-'currentrevisionlink' => 'kitaen ti agdama a panangbaliw',
+'currentrevisionlink' => 'Kinaudi a binaliwan',
 'cur' => 'agdama',
 'next' => 'sumaruno',
 'last' => 'naudi',
@@ -889,16 +895,16 @@ Sarita: '''({{int:cur}})''' = naggidiatan ti kinaudi a panagbaliw, '''({{int:las
 'history-show-deleted' => 'Naikkat laeng',
 'histfirst' => 'Kaunaan',
 'histlast' => 'Kaudian',
-'historysize' => '({{PLURAL:$1|1 a byte|$1 a bytes}})',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
 'historyempty' => '(blanko)',
 
 # Revision feed
 'history-feed-title' => 'Pakasaritaan ti panagbalbaliw',
 'history-feed-description' => 'Pakasaritaan ti panagbalbaliw para iti daytoy a panid ditoy a wiki',
 'history-feed-item-nocomment' => '$1 iti $2',
-'history-feed-empty' => 'Awan ti kiniddaw a panid..
-Baka naikkaten ditoy a wiki, wenno nanaganan.
-Padasem ti [[Special:Search|agbiruk ditoy a wiki]] kadagiti mapaay a baro a panid.',
+'history-feed-empty' => 'Awan ti kiniddaw a panid.
+Mabalin a naikkat manipud ti daytoy a wiki, wenno nanaganan manen.
+Padasem ti [[Special:Search|agbiruk ditoy a wiki]] para kadagiti maitutop a baro a panid.',
 
 # Revision deletion
 'rev-deleted-comment' => '(naikkat ti pakabuklan ti inurnos)',
@@ -912,7 +918,7 @@ Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FU
 Mabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
 'rev-suppressed-text-unhide' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].
-Mabalin mo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
+Mabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
 'rev-deleted-text-view' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
 Mabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
 'rev-suppressed-text-view' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
@@ -932,73 +938,75 @@ Mabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idia
 Mabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
 'rev-delundel' => 'ipakita/ilemmeng',
 'rev-showdeleted' => 'ipakita',
-'revisiondelete' => 'Naikkat/isubli dagiti naikkat a panagbaliw',
+'revisiondelete' => 'Ikkaten/isubli dagiti naikkat a panagbaliw',
 'revdelete-nooldid-title' => 'Imbalido ti napuntaan a panagbaliw',
-'revdelete-nooldid-text' => 'Baka saanmo nga imbaga ti pagpuntaan ti panagbaliw  (dagiti panagbaliwan) ti panagaramid daytoy,
+'revdelete-nooldid-text' => 'Mabalin a saanmo nga imbaga ti pagpuntaan ti panagbaliw  (dagiti panagbaliwan) ti panagaramid daytoy,
 awan ti naibaga a panagbaliw, wenno padpadasem nga ilemlemmeng ti agdama a panagbaliw.',
 'revdelete-nologtype-title' => 'Awan ti naited a kita ti listaan',
 'revdelete-nologtype-text' => 'Saanmo nga nainaganan ti kita a listaan ti agtungpal daytoy nga aramid.',
 'revdelete-nologid-title' => 'Imbalido a panangikabil dita listaan',
 'revdelete-nologid-text' => 'Saanmo a nainaganan ti puntaan ti listaan a paspasamak ti agaramid daytoy a pagusar wenno ti nainaganan nga inkabil ket saan nga adda idiay.',
-'revdelete-no-file' => 'Awan dayta ti nainaganan a papeles.',
-'revdelete-show-file-confirm' => 'Segurado a kayatmo ti mangkita ti naikkat a baliwan ti papeles "<nowiki>$1</nowiki>" a naggapu idi $2 ti oras nga $3?',
+'revdelete-no-file' => 'Awan dayta nainaganan a papeles.',
+'revdelete-show-file-confirm' => 'Sigurado kadi a kayatmo ti mangkita ti naikkat a baliwan ti papeles "<nowiki>$1</nowiki>" a naggapu idi $2 ti oras nga $3?',
 'revdelete-show-file-submit' => 'Wen',
 'revdelete-selected' => "'''{{PLURAL:$2|Napili a nabaliwan|Dagiti napili a nabaliwan}} iti [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Ti napili a listaan ti napasamak|Dagiti napili a listaan ti napasamak}}:'''",
 'revdelete-text' => "'''Dagiti naikkat a binaliwan ken dagiti napasamak ket agparang idiay panid ti pakasaritaan ken dagiti listaan, ngem addaan dagiti paset ti nagyanda a saan a maserrekan ti publiko.'''
-Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalin da a serrekan ti nailemmeng a nagyan ken isubli ti panakaikkat da manen idiay dati nga interface, ngem saan no adda dagiti nainayon a naikabil a panagparit.",
+Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalinda a serrekan ti nailemmeng a nagyan ken isubli ti panakaikkatda manen idiay dati nga interface, ngem saan no adda dagiti nainayon a naikabil a panagparit.",
 'revdelete-confirm' => 'Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ket araramidem daytoy a segun iti [[{{MediaWiki:Policy-url}}|ti annuroten]].',
-'revdelete-suppress-text' => "Ti pinagdepdep ket usaren '''laeng''' kadagiti sumaganad;
-* Makapataud a dakes a pakaammo
+'revdelete-suppress-text' => "Ti panagdepdep ket usaren '''laeng''' kadagiti sumaganad a kaso;
+* Adda panakabalinna a dakes a pakaammo
 * Di maiparbeng a  kabukbukodan a pakaammo
 * : ''dagiti pagtaengan ken numero ti telepono, numero ti sosial a seguridad, ken dadduma pay.''",
-'revdelete-legend' => 'Iplastar dagiti panagiparit ti panagkita',
+'revdelete-legend' => 'Ikabil dagiti panagiparit ti panagkita',
 'revdelete-hide-text' => 'Ilemmeng ti testo ti binaliwan',
 'revdelete-hide-image' => 'Ilemmeng ti linaon ti papeles',
 'revdelete-hide-name' => 'Ilemmeng ti aramid ken puntaan',
 'revdelete-hide-comment' => 'Ilemmeng ti pakabulan ti inurnos',
 'revdelete-hide-user' => 'Ilemmeng ti nagan ti agar-amat/ti IP a pagtaengan',
 'revdelete-hide-restricted' => 'Depdepen ti datos a naggapu kadagiti administrador ken dagiti sabsabali',
-'revdelete-radio-same' => 'saan a sukatan',
+'revdelete-radio-same' => '(saan a sukatan)',
 'revdelete-radio-set' => 'Wen',
 'revdelete-radio-unset' => 'Saan',
-'revdelete-suppress' => 'Depdepen ti data a naggapu kadagiti administrador ken dagiti sabsabali',
+'revdelete-suppress' => 'Depdepen ti datos manipud kadagiti administrador ken dagiti sabsabali',
 'revdelete-unsuppress' => 'Ikkaten dagiti pannakaiparit kadagiti naisubli a binaliwan',
 'revdelete-log' => 'Rason:',
-'revdelete-submit' => 'Ipakat ti napili {{PLURAL:$1|a panagbalbaliw|a dagiti panagbalbaliw}}',
+'revdelete-submit' => 'Ipakat  {{PLURAL:$1|ti napili a panagbalbaliw|dagiti napili a panagbalbaliw}}',
 'revdelete-success' => "'''Balligi ti panagpabaro ti pinakakita ti pinagbaliwan.'''",
 'revdelete-failure' => "'''Saan a napabaro ti pinakakita ti pinagbaliwan.'''
 $1",
 'logdelete-success' => "'''Balligi ti panagikabil ti listaan ti panagkita.'''",
 'logdelete-failure' => "'''Napaay ti panagikabil ti listaan ti panagkita:'''
 $1",
-'revdel-restore' => 'Sukatan ti panagkita',
-'revdel-restore-deleted' => 'naikkat a binaliwan',
-'revdel-restore-visible' => 'makita a binaliwan',
+'revdel-restore' => 'sukatan ti panagkita',
+'revdel-restore-deleted' => 'dagiti naikkat a binaliwan',
+'revdel-restore-visible' => 'dagiti makita a binaliwan',
 'pagehist' => 'Pakasaritaan ti panid',
 'deletedhist' => 'Naikkat a pakasaritaan',
 'revdelete-hide-current' => 'Biddut ti panakailemmeng ti banag a napetsado a $2, $1: Daytoy ti kinaudi a panagbaliw
-Saan a mailemmeng.',
+Saan a mabalin a mailemmeng.',
 'revdelete-show-no-access' => 'Biddut ti panagpakita ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
-Saan mo a mabalin a serrekan.',
+Saanmo a mabalin a serrekan.',
 'revdelete-modify-no-access' => 'Biddut ti panagpabaro ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
-Saan mo a mabalin a serrekan.',
+Saanmo a mabalin a serrekan.',
 'revdelete-modify-missing' => 'Biddut ti panagpabaro daytoy ID $1: Saan a nasarakan idiay database!',
-'revdelete-no-change' => "'''Biddut:''' Daytoy a banag a petsado a  $2, $1 ket addaan ti kiniddaw kadagiti pakakita a kasasaad.",
-'revdelete-concurrent-change' => 'Biddut ti panagpabaro daytoy a banag a petsado a $2, $1: Ti panakaikabil na ket mabalin a nasuktanen ti sabsabli idi pinadas mo a pinabaro.',
-'revdelete-only-restricted' => 'Biddut ti panagilemmeng daytoy banag a petsado a $2, $1: Saan mo a maidepdep dagita iti panagkita dagiti adminitrador no saan mo a pilian ti maysa kadagiti pinagpili ti panagkita.',
-'revdelete-reason-dropdown' => '*Dagiti kadawyan a panagikkat
-** Panaglabsing ti karbengan ti panagipablaak
-** Saan a maibagay ti kabukbukodan a pakaammo
-** Makapataud ti dakes a pakaammo',
-'revdelete-otherreason' => 'Sabali/dadduma a rason:',
+'revdelete-no-change' => "'''Ballaag:''' Daytoy a banag a napetsado ti  $2, $1 ket addaan ti kiniddaw kadagiti panakakita a kasasaad.",
+'revdelete-concurrent-change' => 'Biddut ti panagpabaro daytoy a banag a napetsado ti  $2, $1: Ti panakaikabilna ket mabalin a nasuktanen ti sabsabli idi pinada mo a pinabaro.
+Pangngaasi a kitaen dagiti listaan.',
+'revdelete-only-restricted' => 'Biddut ti panagilemmeng daytoy banag a napetsado ti $2, $1: Saanmo a maidepdep dagita iti panagkita dagiti adminitrador no saanmo a pilian ti maysa kadagiti pinagpili ti panagkita.',
+'revdelete-reason-dropdown' => '*Dagiti kadawyan a rason ti panagikkat
+** Panaglabsing ti karbengan ti kopia
+** Di maiparbeng a komentario wenno kabukbukodan a pakaammo
+** Di maiparbeng a nagan ti agar-aramat
+** Adda pannakabalinna a pammadpadakes a pakaammo',
+'revdelete-otherreason' => 'Sabali/maipatinayon a rason:',
 'revdelete-reasonotherlist' => 'Sabali a rason',
-'revdelete-edit-reasonlist' => 'Urnosen ti rason ti panagikkat',
+'revdelete-edit-reasonlist' => 'Urnosen dagiti rason ti panagikkat',
 'revdelete-offender' => 'Nangsukat a mannurat:',
 
 # Suppression log
 'suppressionlog' => 'Listaan ti nadepdepan',
-'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken npanagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
+'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken panagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
 Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a panagparit ken panagserra.',
 
 # History merging
@@ -1008,13 +1016,13 @@ Masapul a sigaraduem a daytoy a panagsukat ket agsustento ti panakaituloy ti pak
 'mergehistory-box' => 'Pagtiponen dagiti nasukatan iti dua a pampanid:',
 'mergehistory-from' => 'Taudan ti panid:',
 'mergehistory-into' => 'Pangipanan a panid:',
-'mergehistory-list' => 'Mabalin nga itipon ti pakasaritaan ti inurnos',
+'mergehistory-list' => 'Mabalin nga itipon a pakasaritaan ti inurnos',
 'mergehistory-merge' => 'Dagiti sumaganad a panagbaliw iti [[:$1]] ket mabalin nga itipon iti [[:$2]].
 Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid idiay ken sakbay ti nainagan nga oras.',
 'mergehistory-go' => 'Ipakita dagiti mabalin a maitipon a panag-urnos',
 'mergehistory-submit' => 'Pagtitiponen dagiti binalbaliwan',
-'mergehistory-empty' => 'Awan dagiti mabalin nga itipon.',
-'mergehistory-success' => '$3 {{PLURAL:$3|a binaliwan|dagiti binaliwan}} ti [[:$1]] balligi ti pinagtipon idiay [[:$2]].',
+'mergehistory-empty' => 'Awan dagiti mabalin nga itipon ti panagbalbaliw.',
+'mergehistory-success' => '$3 {{PLURAL:$3|a binaliwan|dagiti binaliwan}} ti [[:$1]] balligi ti panagitipon idiay [[:$2]].',
 'mergehistory-fail' => 'Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi ta kitaen ti panid ken parametro ti oras.',
 'mergehistory-no-source' => 'Awan ti taudan ti panid a $1.',
 'mergehistory-no-destination' => 'Awan ti papanan ti panid a $1.',
@@ -1049,15 +1057,15 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 
 # Search results
 'searchresults' => 'Dagiti nagbanagan ti panagbiruk',
-'searchresults-title' => 'Dagiti nabirukan a nagbanagan ti "$1"',
-'searchresulttext' => 'Ti adu pay a pakaammo ti panagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Nagbiruk ka  para iti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|amin a panid a mangrugi iti "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|amin a panid nga agsilpo iti "$1"]])',
+'searchresults-title' => 'Dagiti nabirukan a nagbanagan para iti "$1"',
+'searchresulttext' => 'Para iti adu pay a pakaammo a maipanggep ti panagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Nagbirukka  para iti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|amin a panid a mangrugi iti "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|amin a panid nga agsilpo iti "$1"]])',
 'searchsubtitleinvalid' => "Nagbiruk ka para  iti '''$1'''",
 'toomanymatches' => 'Adu unay ti napasubli  nga agpapada, pangngaasi a padasem ti sabali a panagsapul',
 'titlematches' => 'Dagiti kapadpada a titulo ti panid',
 'notitlematches' => 'Awan dagiti kapadpada a titulo ti panid',
 'textmatches' => 'Dagiti agpapada a testo ti panid',
-'notextmatches' => 'Awan dagiti kapadpada a teksto ti panid',
+'notextmatches' => 'Awan dagiti kapadpada a testo ti panid',
 'prevn' => 'napalabas {{PLURAL:$1|$1}}',
 'nextn' => 'sumaruno {{PLURAL:$1|$1}}',
 'prevn-title' => 'Napalabas a $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}',
@@ -1081,22 +1089,22 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searchprofile-advanced-tooltip' => 'Agbiruk ka kadagiti naiduma a "nagan ti lugar"',
 'search-result-size' => '$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})',
 'search-result-category-size' => '{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 nga apo ti kategoria|dagiti $2  nga apo ti kategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})',
-'search-result-score' => 'Kapategan: $1%',
+'search-result-score' => 'Kaitutopan: $1%',
 'search-redirect' => '(ibaw-ing ti $1)',
 'search-section' => '(paset $1)',
 'search-suggest' => 'Daytoy kadi: $1',
 'search-interwiki-caption' => 'Dagiti kakabsat a gandat',
 'search-interwiki-default' => '$1 dagiti nagbanagan:',
 'search-interwiki-more' => '(adu pay)',
-'search-mwsuggest-enabled' => 'addaan ti singasing',
-'search-mwsuggest-disabled' => 'awanan ti singasing',
+'search-mwsuggest-enabled' => 'addaan dagiti singasing',
+'search-mwsuggest-disabled' => 'awanan dagiti singasing',
 'search-relatedarticle' => 'Mainaig',
-'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naibagbaga',
+'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naisingasing',
 'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti lugar',
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
 'showingresults' => "Maiparang iti baba ti agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
-'showingresultsnum' => "Makita dita baba  {{PLURAL:$3|iti '''1''' a nagbanagan|dagiti '''$3''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+'showingresultsnum' => "Maipakpakita dita baba  {{PLURAL:$3|iti '''1''' a nagbanagan|dagiti '''$3''' a nagbanagan}} a mangrugi iti #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Nagbanagan a '''$1''' iti '''$3'''|Dagiti Nagbanagan a '''$1 - $2''' iti '''$3'''}} para iti '''$4'''",
 'nonefound' => "'''Palagip'': Adda laeng bassit dagita nagan ti lugar a masigud a biruken.
 Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (mairaman ti kapatangan a pampanid, dagiti plantilia, ken dadduma pay), wenno usarem nga ipasaruno ti kayatmo a nagan ti lugar.",
@@ -1140,7 +1148,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-personal' => 'Bariweswes ti agar-aramat',
 'prefs-rc' => 'Kinaudi a binalbaliwan',
 'prefs-watchlist' => 'Listaan ti bambantayan',
-'prefs-watchlist-days' => 'Manu nga aldaw nga agparang ti listaan iti bambantayan:',
+'prefs-watchlist-days' => 'Alaldaw nga iparang idiay listaan ti bambantayan:',
 'prefs-watchlist-days-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'prefs-watchlist-edits' => 'Kaadu a bilang ti ipakita kadagiti sinukatan iti napadakkel a bambantayan:',
 'prefs-watchlist-edits-max' => 'Kaadu a bilang: 1000',
@@ -1160,20 +1168,20 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'columns' => 'Tuk-tukol:',
 'searchresultshead' => 'Biruken',
 'resultsperpage' => 'Nabirukan ti tunggal maysa a panid:',
-'stub-threshold' => 'Pangruggian ti <a href="#" class="stub">pungol a panilpo</a>pinagbukel (bytes):',
+'stub-threshold' => 'Pangruggian ti <a href="#" class="stub">pungol a panilpo</a>panagporma (bytes):',
 'stub-threshold-disabled' => 'Nabaldado',
-'recentchangesdays' => 'Mano nga aldaw nga ipakita dagiti kinaudi a binalbaliwan:',
+'recentchangesdays' => 'Alaldaw nga ipakita dagiti kinaudi a binalbaliwan:',
 'recentchangesdays-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'recentchangescount' => 'Dagiti bilang dagiti naurnos a kinasigud a maiparang:',
 'prefs-help-recentchangescount' => 'Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.',
 'prefs-help-watchlist-token' => 'No ikkam daytoy pagikabilan ti sekreto a tulbek, agaramid ti pakan a RSS para ti binambantayam.
-No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpili ka ti kuwenta a seguridad.
+No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpilika ti pateg a seguridad.
 
-Adda ditoy ti pugto a kuwenta a mausarmo: $1',
+Adda ditoy ti pugto a pateg a mausarmo: $1',
 'savedprefs' => 'Naidulin dagitoy kaykayatmon.',
 'timezonelegend' => 'Sona ti oras:',
 'localtime' => 'Lokal nga oras:',
-'timezoneuseserverdefault' => 'Usaren ti wiki a kinasigud ($1)',
+'timezoneuseserverdefault' => 'Usaren ti wiki a kasisigud ($1)',
 'timezoneuseoffset' => 'Sabsabali (inaganan ti tangdan)',
 'timezoneoffset' => 'Tangda¹:',
 'servertime' => 'Oras ti server:',
@@ -1189,10 +1197,10 @@ Adda ditoy ti pugto a kuwenta a mausarmo: $1',
 'timezoneregion-indian' => 'Taaw Indiano',
 'timezoneregion-pacific' => 'Taaw Pasipiko',
 'allowemail' => 'Pakabaelam ti e-surat a naggapu kadagiti sabali nga agar-aramat',
-'prefs-searchoptions' => 'Pagpilian ti agbiruk',
+'prefs-searchoptions' => 'Pagpilian ti panagbiruk',
 'prefs-namespaces' => 'Nagan ti luglugar',
-'defaultns' => 'Wenno no saan agbiruk ka kadagitoy a nagan ti luglugar:',
-'default' => 'kinasigud',
+'defaultns' => 'Wenno no saan agbirukka kadagitoy a nagan ti luglugar:',
+'default' => 'kasisigud',
 'prefs-files' => 'Dagiti papeles',
 'prefs-custom-css' => 'Naiduma a CSS',
 'prefs-custom-js' => 'Naiduma a JavaScript',
@@ -1234,11 +1242,11 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Kita ti petsa',
 'prefs-timeoffset' => 'Tangda ti oras',
-'prefs-advancedediting' => 'Dagiti nangato a pagpilian',
-'prefs-advancedrc' => 'Dagiti nangato a pagpilian',
-'prefs-advancedrendering' => 'Dagiti nangato a pagpilian',
-'prefs-advancedsearchoptions' => 'Dagiti nangato a pagpilian',
-'prefs-advancedwatchlist' => 'Dagiti nangato a pagpilian',
+'prefs-advancedediting' => 'Dagiti napasayaat a pagpilian',
+'prefs-advancedrc' => 'Dagiti napasayaat a pagpilian',
+'prefs-advancedrendering' => 'Dagiti napasayaat a pagpilian',
+'prefs-advancedsearchoptions' => 'Dagiti napasayaat a pagpilian',
+'prefs-advancedwatchlist' => 'Dagiti napasayaat a pagpilian',
 'prefs-displayrc' => 'Ipakita dagiti pagpilian',
 'prefs-displaysearchoptions' => 'Ipakita dagiti pagpilian',
 'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
@@ -1264,7 +1272,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 * A * ti kunana ket saan mo a maikkat ti bunggoy no nainayonmon, wenno pagbalittaden.',
 'userrights-reason' => 'Rason:',
 'userrights-no-interwiki' => 'Awan ti pammalubosmo nga agbaliw ti karbengan ti agar-aramat kadagiti sabali a wiki.',
-'userrights-nodatabase' => 'Awan ti database a $1 wenno baka saan a lokal.',
+'userrights-nodatabase' => 'Awan ti database a $1 wenno saan a lokal.',
 'userrights-nologin' => 'Masapul a [[Special:UserLogin|sumrekka]] nga adda pakabilangan nga administrador ti magted kadagiti karbengan ti agar-aramat.',
 'userrights-notallowed' => 'Awan ti pammalubos ti pakabilangam a mangted iti kakaberngan ti agar-aramat.',
 'userrights-changeable-col' => 'Dagiti bunggoy a mabalinmo a baliwan',
@@ -1274,29 +1282,29 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'group' => 'Bunggoy:',
 'group-user' => 'Dagiti agar-aramat',
 'group-autoconfirmed' => 'Dagiti automatiko a napasingkedan nga agar-aramat',
-'group-bot' => 'Dagiti bots',
+'group-bot' => 'Dagiti bot',
 'group-sysop' => 'Dagiti administrador',
 'group-bureaucrat' => 'Dagiti burokrata',
 'group-suppress' => 'Pakapansin',
 'group-all' => '(amin)',
 
 'group-user-member' => '{{GENDER:$1|agar-aramat}}',
-'group-autoconfirmed-member' => 'automatiko a napasingkedan nga agar-aramat',
-'group-bot-member' => 'bot',
-'group-sysop-member' => 'administrador',
-'group-bureaucrat-member' => 'burokrata',
-'group-suppress-member' => 'pagpansin',
+'group-autoconfirmed-member' => '{{GENDER:$1|automatiko a napasingkedan nga agar-aramat}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|administrador}}',
+'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
+'group-suppress-member' => '{{GENDER:$1|pagpansin}}',
 
 'grouppage-user' => '{{ns:project}}:Dagiti agar-aramat',
 'grouppage-autoconfirmed' => '{{ns:project}}:Dagiti automatiko a napasingkedan nga agar-aramat',
-'grouppage-bot' => '{{ns:project}}:Dagiti bots',
+'grouppage-bot' => '{{ns:project}}:Dagiti bot',
 'grouppage-sysop' => '{{ns:project}}:Dagiti administrador',
 'grouppage-bureaucrat' => '{{ns:project}}:Dagiti burokrata',
 'grouppage-suppress' => '{{ns:project}}:Pagpansin',
 
 # Rights
 'right-read' => 'Basaen dagiti panid',
-'right-edit' => 'Agurnos kadagiti pampanid',
+'right-edit' => 'Agurnos kadagiti panid',
 'right-createpage' => 'Agaramid kadagiti panid (saan a pagtutungtongan a pampanid)',
 'right-createtalk' => 'Agaramid ti pagtungtungan a pampanid',
 'right-createaccount' => 'Agaramid kadagiti baro a pakabilangan ti agar-aramat',
@@ -1309,23 +1317,23 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-upload' => 'Agipan ti papeles',
 'right-reupload' => 'Suratam manen dagiti adda a papeles',
 'right-reupload-own' => 'Pasuratam manen dagiti addaan ti pinag-ipan mo a papeles',
-'right-reupload-shared' => 'Paawanen dagiti papeles idiay pagbingayan ti nakaikabilan ti media a lokal',
+'right-reupload-shared' => 'Paawanen dagiti papeles idiay pagbingayan ti nakaikabilan ti midia a lokal',
 'right-upload_by_url' => 'Pag-ipan ti papeles a naggapu ti URL',
-'right-purge' => 'Pasariwaam ti cache ti pagsaadan a ti panid ket awan ti pasingkedan na.',
+'right-purge' => 'Purgaen ti pagidulinan ti pagsaadan a ti panid nga awan ti panagpasingked',
 'right-autoconfirmed' => 'Urnosen dagiti nasalakniban-bassit a panid',
-'right-bot' => 'Matrato a kas automatiko a panagaramid',
+'right-bot' => 'Matrato a kas automatiko a pamay-an',
 'right-nominornewtalk' => 'Nga awanan ti bassit a panagurnos dagiti tungtungan a panid ti mangkalbit dagiti agpakabil ti baro a mensahe',
-'right-apihighlimits' => 'Agusar ti nangatngato a patingga kadagiti pinagsapul ti API.',
+'right-apihighlimits' => 'Agusar ti nangatngato a patingga kadagiti panagsapul ti API.',
 'right-writeapi' => 'Panagusar ti panagsurat nga API',
 'right-delete' => 'Ikkaten dagiti panid',
 'right-bigdelete' => 'Ikkaten dagiti panid nga adda dagiti dakkel a pakasaritaanna',
 'right-deletelogentry' => 'Ikkaten ken isubli ti panagikkat dagiti naisangsangayan a naikabil ti listaan',
-'right-deleterevision' => 'Ikkaten ken ipasubli dagiti nainagan a pinagbaliwan ti panid',
+'right-deleterevision' => 'Ikkaten ken ipasubli dagiti nainagan a panagbaliw ti panid',
 'right-deletedhistory' => 'Kitaen dagiti naikabil a pakasaritaan, nga awan kaniada kadagiti nairaman a testo',
 'right-deletedtext' => 'Kitaen dagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti binaliwan',
 'right-browsearchive' => 'Biruken dagiti naikkat a panid',
 'right-undelete' => 'Isubli ti naikkat a panid',
-'right-suppressrevision' => 'Kitaen ken ipasubli dagiti binaliwan a nailemmeng kadagiti administrador',
+'right-suppressrevision' => 'Kitaen ken ipasubli dagiti binaliwan a nailemmeng manipud kadagiti administrador',
 'right-suppressionlog' => 'Kitaen dagita pribado a listaan',
 'right-block' => 'Serraan dagiti sabali nga agar-aramat manipud iti panag-urnos',
 'right-blockemail' => 'Serraan dagiti agar-aramat nga agpatulod manipud ti e-surat',
@@ -1360,18 +1368,18 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'rightslog' => 'Listaan dagiti karbengan ti agar-aramat',
 'rightslogtext' => 'Listaan daytoy kadagiti sinukatan a karbengan ti agararamat.',
 'rightslogentry' => 'sinukatan ti panagkameng iti bunggoy ti $1 manipud $2 iti $3',
-'rightslogentry-autopromote' => 'na automatiko a naipangato a naggapo iti $2 idiay $3',
+'rightslogentry-autopromote' => 'naautomatiko a naipangato a naggapo iti $2 idiay $3',
 'rightsnone' => '(awan)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'basaem datoy a panid',
-'action-edit' => 'agurnos iti datoy a panid',
+'action-read' => 'basaen datoy a panid',
+'action-edit' => 'urnosen datoy a panid',
 'action-createpage' => 'agpartuat kadagiti panid',
 'action-createtalk' => 'agaramid kadagiti pagtungtungan a panid',
 'action-createaccount' => 'agpartuat ti pakabilangan daytoy nga agar-aramat',
 'action-minoredit' => 'markaam a bassit nga urnos daytoy',
 'action-move' => 'iyalis daytoy a panid',
-'action-move-subpages' => 'iyalis daytoy a panid, ken dagiti apo na a panid',
+'action-move-subpages' => 'iyalis daytoy a panid, ken dagiti apona a panid',
 'action-move-rootuserpages' => 'iyalis dagiti ramut a panid ti agar-aramat',
 'action-movefile' => 'iyalis daytoy a papeles',
 'action-upload' => 'ipapan daytoy a papeles',
@@ -1494,7 +1502,7 @@ Pangngaasi ta naganan manen ti papeles ken padasen manen nga ipapan.',
 'filetype-unwanted-type' => "'''\".\$1\"''' ti saan a mapalubusan a kita ti papeles.
 Ti mapalubusan  {{PLURAL:\$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} \$2.",
 'filetype-banned-type' => 'Ti \'\'\'".$1"\'\'\' {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}.
-Ti mapalubusan{{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
+Ti mapalubusan {{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
 'filetype-missing' => 'Daytoy a papeles ket awan ti kita na a (kasla ".jpg").',
 'empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
 'file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
@@ -1607,14 +1615,18 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-closetemp' => 'Saan a marikpan ti temporario a papeles.',
 'backend-fail-read' => 'Saan a mabasa ti papeles $1.',
 'backend-fail-create' => 'Saan a masuratan ti papeles $1.',
-'backend-fail-maxsize' => 'Saan a masuratan ti papeles $1 gapu ta dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a bytes}}.',
+'backend-fail-maxsize' => 'Saan a masuratan ti papeles $1 gapu ta dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a byte}}.',
 'backend-fail-readonly' => 'Ti pagidulinan a kalikudan ti "$1" ket agdama a mabasa laeng. Ti rason a naited idi ket: "$2"',
 'backend-fail-synced' => 'Ti papeles "$1" ket bangking ti kasasaad na  iti kinauneg a pagidulinan ti kalikudan',
 'backend-fail-connect' => 'Saan a makaikapet idiay pagidulinan a kalikudan  "$1".',
 'backend-fail-internal' => 'Adda di amammo a biddut ti napasamak idiay pagidulinan a kalikudan "$1".',
 'backend-fail-contenttype' => 'Saan a maammoan ti kita ti linaon ti papeles nga idulin idiay "$1".',
 'backend-fail-batchsize' => 'Nagited ti nagipenpenan ti bunggoy iti $1 a papeles {{PLURAL:$1|nga aramid|nga ar-aramid}}; ti patingga ket $2 {{PLURAL:$2|nga aramid|nga ar-aramid}}.',
-'backend-fail-usable' => 'Saan a masuratan ti papeles $1 gapu ta awan ti makaanay a pammalubos wenno awan dagiti direktorio/pangikabilan.',
+'backend-fail-usable' => 'Saan a mabasa wenno masuratan ti papeles $1 gaputa awan ti makaanay a pammalubos wenno awan dagiti direktorio/pangikabilan.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Saan a maikapet idiay warnakan a database para iti likudan a pagipenpenan "$1".',
+'filejournal-fail-dbquery' => 'Saan a makapabaro idiay warnakan a database para iti likudan a pagipenpenan "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Saan a malukatan ti "$1"; saan a nakandaduan.',
@@ -1644,7 +1656,7 @@ Saan a matutup ti pinagkita ti seguridad na.',
 'uploadstash-badtoken' => 'Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talek mo ti panag-urnos ket nagpaso. Padasem manen.',
 'uploadstash-errclear' => 'Ti panagdalus kadagiti papeles ket napaay.',
 'uploadstash-refresh' => 'Pasadiwaam dagiti listaan ti papeles',
-'invalid-chunk-offset' => 'Imbalido ti maysa a supli',
+'invalid-chunk-offset' => 'Imbalido ti maysa a tangdan',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'naiparit ti iseserrek',
@@ -1672,7 +1684,7 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'http-timed-out' => 'Nagsardeng ti panagtulod ti HTTP.',
 'http-curl-error' => 'Biddut ti panagala ti URL: $1',
 'http-host-unreachable' => 'Di madanon ti URL',
-'http-bad-status' => 'Adda pakirut iti agdama a pinagtulod ti HTTP: $1 $2',
+'http-bad-status' => 'Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Di madanon ti URL',
@@ -1702,7 +1714,7 @@ No sagaten ti agar-aramat, dagiti laeng papeles a pinag-ipan ti agar-aramat ti k
 'listfiles_user' => 'Agar-aramat',
 'listfiles_size' => 'Kadakkel',
 'listfiles_description' => 'Panagipalpalawag',
-'listfiles_count' => 'Dagiti Bersion',
+'listfiles_count' => 'Dagiti bersion',
 
 # File description page
 'file-anchor-link' => 'Papeles',
@@ -1754,26 +1766,26 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 'filerevert-defaultcomment' => 'Naisubli ti bersion manipud idi $2, $1',
 'filerevert-submit' => 'Isubli',
 'filerevert-success' => "Ti '''[[Media:$1|$1]]''' ket naipasubli idiay [$4 bersion ti oras ken petsa $3, $2].",
-'filerevert-badversion' => 'Awan ti napalubos a lokal a bersion daytoy a papeles nga adda naikkan dayta nga oras ken petsa.',
+'filerevert-badversion' => 'Awan ti dati a lokal a bersion daytoy a papelesa naited ti dayta nga oras ken petsa.',
 
 # File deletion
 'filedelete' => 'Ikkaten ti $1',
-'filedelete-legend' => 'ikkaten ti papeles',
+'filedelete-legend' => 'Ikkaten ti papeles',
 'filedelete-intro' => "Mangrugrugika nga agikkat ti '''[[Media:$1|$1]]''' ken mairaman amin a pakasaritaanna.",
-'filedelete-intro-old' => "Ikikatem ti bersion iti '''[[Media:$1|$1]]''' manipud idi [$4 $3, $2].",
+'filedelete-intro-old' => "Ikikkatem ti bersion iti '''[[Media:$1|$1]]''' manipud idi [$4 $3, $2].",
 'filedelete-comment' => 'Rason:',
 'filedelete-submit' => 'Ikkaten',
 'filedelete-success' => "Naikkaten ti '''$1'''.",
 'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' manipud idi $3, $2 ket naikkaten.",
 'filedelete-nofile' => "awan ti '''$1''' .",
 'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkita na.",
-'filedelete-otherreason' => 'Sabali/nayon a rason:',
+'filedelete-otherreason' => 'Sabali/maipatinayon a rason:',
 'filedelete-reason-otherlist' => 'Sabali a rason',
 'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
 ** Panagsalungasing iti karbengan ti panagkopia
 ** Nadoble a papeles',
-'filedelete-edit-reasonlist' => 'Unosen ti rason ti panagikkat',
-'filedelete-maintenance' => 'Saan nga agnayon a naibaldado ti pinagikkat ken pinagisubli dagiti papeles iti dagdama a pinagsimpa.',
+'filedelete-edit-reasonlist' => 'Unosen dagiti rason ti panagikkat',
+'filedelete-maintenance' => 'Saan nga agnayon a naibaldado ti pinagikkat ken pinagisubli dagiti papeles iti dagdama a panagsimpa.',
 'filedelete-maintenance-title' => 'Saan a maikkat daytoy a papeles',
 
 # MIME search
@@ -1853,7 +1865,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'fewestrevisions' => 'Dagiti panid nga adda kadagiti kabassitan a panangbalbaliw',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|a byte|kadagiti byte}}',
+'nbytes' => '$1 {{PLURAL:$1| byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|a kategoria|kadagiti kategoria}}',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|dagiti interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|a panilpo|kadagiti panilpo}}',
@@ -1877,7 +1889,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'wantedpages-badtitle' => 'Saan nga umisu a titulo idiay naikabil a pagbanagan: $1',
 'wantedfiles' => 'Dagiti makidkiddaw a papeles',
 'wantedfiletext-cat' => 'Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles a naggapu kadagiti ganganaet a repositorio ket mailista uray pay no addaan da. No adda dagiti kasla adda dagitoy ket <del>maikkat</del> to. A maipanayon pay, dagiti pampanid nga agisengngat kadagiti papeles nga awan ket nailista idiay [[:$1]].',
-'wantedfiletext-nocat' => '    Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles a naggapu kadagiti ganganaet a repositorio ket mailista uray pay no addaan da. No adda dagiti kasla adda dagitoy ket <del>maikkat</del> to.',
+'wantedfiletext-nocat' => 'Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles a naggapu kadagiti ganganaet a repositorio ket mailista uray pay no addaan da. No adda dagiti kasla adda dagitoy ket <del>maikkat</del> to.',
 'wantedtemplates' => 'Dagiti makidkiddaw a plantilia',
 'mostlinked' => 'Dagiti panid a kaaduan iti nakasilpo',
 'mostlinkedcategories' => 'Dagiti kategoria a kaaduan iti nakasilpo',
@@ -1947,7 +1959,7 @@ Mapabassit mo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti gar-arama
 'prevpage' => 'Napalabas a panid ($1)',
 'allpagesfrom' => 'Ipakita dagiti panid a mangrugi iti:',
 'allpagesto' => 'Ipakita dagiti panid a nalpasan iti:',
-'allarticles' => 'Amin nga artikulo',
+'allarticles' => 'Amin a pampanid',
 'allinnamespace' => 'Amin a pampanid ($1 nagan ti lugar)',
 'allnotinnamespace' => 'Amin a pampanid (awan iti $1 nagan ti lugar)',
 'allpagesprev' => 'Napalabas',
@@ -1999,7 +2011,7 @@ Natapayaen a protokol: <code>$1</code> (saanmo nga inayon dagitoy iti panagbiruk
 'activeusers-intro' => 'Daytoy ti listaan dagiti agar-aramat nga adda inararamidda kadagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga alaldaw}}.',
 'activeusers-count' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}} idi kalpasan ti  {{PLURAL:$3|nga aldaw|$3 nga alaldaw}}',
 'activeusers-from' => 'Iparang dagiti agar-aramat a mangrugi iti:',
-'activeusers-hidebots' => 'Ilemmeng dagiti bots',
+'activeusers-hidebots' => 'Ilemmeng dagiti bot',
 'activeusers-hidesysops' => 'Ilemmeng dagiti administrador',
 'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
 
@@ -2161,9 +2173,9 @@ Kitaen ti $2 para iti panakrehistro dagiti naudi a naikkat.',
 'deletionlog' => 'listaan ti panagikkat',
 'reverted' => 'Naisubli iti immuna a panagbalbaliw',
 'deletecomment' => 'Rason:',
-'deleteotherreason' => 'Sabali/dadduma pay a rason:',
+'deleteotherreason' => 'Sabali/maipatinayon a rason:',
 'deletereasonotherlist' => 'Sabali a rason',
-'deletereason-dropdown' => '*Kadawyan a gapgapu dagiti pannakaikkat
+'deletereason-dropdown' => '*Kadawyan a rasrason ti panagikkat
 ** Kiddaw ti mannurat
 ** Panaglabsing iti karbengan ti panagipablaak
 ** Bandalismo',
@@ -2183,15 +2195,15 @@ agal-aluad ka a mangrugi.',
 'rollbackfailed' => 'Napaay ti panangisubli',
 'cantrollback' => 'Saan a maisubli ti panagurnos;
 ti naudi a nakaaramid ket iti laeng nagsurat daytoy a panid..',
-'alreadyrolled' => 'Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] ni [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+'alreadyrolled' => 'Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] babaen ni [[User:$2|$2]] ([[User talk:$2|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
 adda sabali a naurnos wenno nagipasubli ti panid.
 
-Ti kinaudi a panagurnos daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Ti panagurnos a pakabuklan ket: \"''\$1''\".",
-'revertpage' => 'Insubli ti panagurnos ni [[Special:Contributions/$2|$2]] ([[User talk:$2|pagtutungtongan]]), naisubli ti kinaudi a panagbaliw ni [[User:$1|$1]]',
-'revertpage-nouser' => 'Naisubli ti panagurnos ni (naikkat ti nagan ti agar-aramat) ti kinaudi a panagbaliw ni [[User:$1|$1]]',
-'rollback-success' => 'Naibabawi dagiti panag-urnos ni $1;
-naisubli manen ti naudi a panagbaliw ni $2.',
+Ti kinaudi a panagurnos daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "Ti panagurnos a pakabuklan idi ket: \"''\$1''\".",
+'revertpage' => 'Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]',
+'revertpage-nouser' => 'Naisubli ti panagurnos babaen ni (naikkat ti nagan ti agar-aramat) ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]',
+'rollback-success' => 'Naibabawi dagiti panag-urnos babaen ni $1;
+naisubli manen ti naudi a panagbaliw babaen ni $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Napaay ti gimong',
@@ -2204,11 +2216,11 @@ Agsubli ka ti naggapuam a panid, ikargam ti panid ken padasem manen.',
 'protectlogtext' => 'Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.
 Kitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.',
 'protectedarticle' => 'nasalakniban ti "[[$1]]"',
-'modifiedarticleprotection' => 'nasukatan ti lessaad ti salaknib para iti "[[$1]]"',
+'modifiedarticleprotection' => 'nasukatan ti agpang ti salaknib para iti "[[$1]]"',
 'unprotectedarticle' => 'naikkat ti salaknib ti "[[$1]]"',
 'movedarticleprotection' => 'iyalis ti kasasaad ti salaknib manipud iti "[[$2]]" idiay "[[$1]]"',
-'protect-title' => 'Sukatan ti lessaad ti salaknib para iti "$1"',
-'protect-title-notallowed' => 'Kitaen ti lessaad ti salaknib ti "$1"',
+'protect-title' => 'Sukatan ti agpang ti salaknib para iti "$1"',
+'protect-title-notallowed' => 'Kitaen ti agpang ti salaknib ti "$1"',
 'prot_1movedto2' => '[[$1]] naiyalis iti [[$2]]',
 'protect-badnamespace-title' => 'Saan a mabalin a salakniban a nagan ti lugar',
 'protect-badnamespace-text' => 'Dagiti panid ditoy  a nagan ti lugar ket saan a mabalin a masalakniban.',
@@ -2227,7 +2239,7 @@ Adda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
 Dagitoy dagiti agdama a kasasaad ti panid a '''$1''':",
 'protect-cascadeon' => 'Daytoy a panid ket agdama a  nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} ti sipapakat a salaknib ti amin-amin.
 Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignayen ti salaknib nga amin-amin.',
-'protect-default' => 'Mabalin amin nga agar-aramat',
+'protect-default' => 'Palubosan amin nga agar-aramat',
 'protect-fallback' => 'Masapul ti "$1" a pammalubos',
 'protect-level-autoconfirmed' => 'Serraan dagiti baro ken saan a nakarehistro nga agar-aramat',
 'protect-level-sysop' => 'Dagiti administrador laeng',
@@ -2236,13 +2248,13 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 'protect-expiring-local' => 'agpaso $1',
 'protect-expiry-indefinite' => "inggana't inggana",
 'protect-cascade' => 'Salakniban dagiti pampanid a nairaman iti daytoy a panid (babaen ti sariap a salaknib)',
-'protect-cantedit' => 'Saanmo a masuktan ti lessaad ti salaknib iti daytoy a panid, gapu ta awan ti pammalubosmo nga agurnos iti daytoy.',
+'protect-cantedit' => 'Saanmo a masuktan ti agpang ti salaknib iti daytoy a panid, gapu ta awan ti pammalubosmo nga agurnos iti daytoy.',
 'protect-othertime' => 'Sabali nga oras:',
 'protect-othertime-op' => 'sabali nga oras',
 'protect-existing-expiry' => 'Ti adda a panagpaso ti oras: $3, $2',
-'protect-otherreason' => 'Sabali/dadduma a rason:',
+'protect-otherreason' => 'Sabali/maipatinayon a rason:',
 'protect-otherreason-op' => 'Sabali a rason',
-'protect-dropdown' => '*Kadawyan a rason ti panagsalaknib
+'protect-dropdown' => '*Kadawyan a rasrason ti panagsalaknib
 ** Adu unay a bandalismo
 ** Adu unay a panagspam
 ** Saan a produktibo ti kasinnungat a panag-urnos
@@ -2250,7 +2262,7 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 'protect-edit-reasonlist' => 'Urnosen dagiti rason ti salaknib',
 'protect-expiry-options' => '1 nga oras:1 hour,1 nga aldaw:1 day,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite',
 'restriction-type' => 'Pammalubos:',
-'restriction-level' => 'Lessaad ti pannakaiparit:',
+'restriction-level' => 'Agpang ti pannakaiparit:',
 'minimum-size' => 'Kinababa a kadakkel:',
 'maximum-size' => 'Kinangato a kadakkel:',
 'pagesize' => '(bytes)',
@@ -2264,30 +2276,30 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 # Restriction levels
 'restriction-level-sysop' => 'napno a nasalakniban',
 'restriction-level-autoconfirmed' => 'nasalakniban bassit',
-'restriction-level-all' => 'ania man a lessaad',
+'restriction-level-all' => 'aniaman nga agpang',
 
 # Undelete
 'undelete' => 'Kitaen dagiti naikkat a pampanid',
 'undeletepage' => 'Kitaen ken isubli dagiti naikkat a panid',
-'undeletepagetitle' => "'''TI sumaganad ket buklen dagiti naikkat a panagbaliw ti [[:$1|$1]]'''.",
+'undeletepagetitle' => "'''TI sumaganad ket buklen dagiti naikkat a panagbaliw ni [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Kitaen dagiti naikkat a pampanid',
 'undeletepagetext' => 'Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .
 Ti arkibo ket mabalin a sagpaminsan a madalusan.',
 'undelete-fieldset-title' => 'Ipasubli dagiti pinagbaliwan',
 'undeleteextrahelp' => "Ti panagisubli dagiti amin a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken agtakla ti '''''{{int:undeletebtn}}'''''.
 Ti agaramid ti napilian a pagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken agtakla ti '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => '$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}} ti nailebben',
+'undeleterevisions' => '$1 {{PLURAL:$1|a binalbaliwan|kadagiti binalbaliwan}} ti nailebben',
 'undeletehistory' => 'No ipasublim daytoy a panid, amin dagiti pinagbaliwan ket maipasubli idiay pakasaritaan.
 Ket no adda baro a panid a kanagnagan na a naaramid ti napalabas a pinagikkat, dagiti naipasubli a pinagbaliwan ket agparang idiay napalabas a pakasaritaan.',
 'undeleterevdel' => 'Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti pinagbaliwan ti papeles ket maikkatan ti bassit.
-Iti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a pinagbaliwan.',
+Iti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a binalbaliwan.',
 'undeletehistorynoadmin' => 'Daytoy a panid ket naikkaten.
-Ti rason ti panagikkat ket naipakita ti pinakabuklan dita baba, ken dagita dsalaysay ti agar-aramat a nagpabaliw ditoy a panid sakbay a naikkat.
+Ti rason ti panagikkat ket naipakita ti pakabuklan dita baba, ken dagita dsalaysay ti agar-aramat a nagpabaliw ditoy a panid sakbay a naikkat.
 Ti husto a testo ti nabaliwan a panagbaliw ket adda kadagiti administrador laeng.',
 'undelete-revision' => 'Naikkat ti binaliwan a $1 (manipud idi $4, idi $5) babaen ni $3:',
 'undeleterevision-missing' => 'Imbalido wenno napukaw a panagbaliw.
 Addaan ka ngata ti madi a panilpo, wenno ti panagbaliw ket naipasubli wenno naikkat manipud idiay nailebbeng.',
-'undelete-nodiff' => 'Awan ti nasarakan a kallabes a binaliwan.',
+'undelete-nodiff' => 'Awan ti nasarakan kadagiti dati a nabalbaliwan.',
 'undeletebtn' => 'Isubli',
 'undeletelink' => 'kitaen/isubli',
 'undeleteviewlink' => 'kitaen',
@@ -2396,7 +2408,7 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 ** Agikabil ti spam a silpo iti ruar
 ** Agikabil ti minamaag/saan a maawatan a pampanid
 ** Nabutbuteng a panagkukua /agriribok
-** Ab-abuso kadagiti sabsabali a pakabilangan
+** Agab-abuso kadagiti sabsabali a pakabilangan
 ** Saan a maawat a nagan ti agar-aramat',
 'ipb-hardblock' => 'Iparit kadagiti nakastrek nga agar-aramat ti agpabaliw iti naggapo ditoy nga IP a pagtaengan',
 'ipbcreateaccount' => 'Pawilan ti panagpartuat iti pakabilangan',
@@ -2591,7 +2603,7 @@ Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
 'movelogpage' => 'Listaan ti naiyalis',
 'movelogpagetext' => 'Adda dita baba ti listaan dagiti naiyalis a pampanid.',
 'movesubpage' => '{{PLURAL:$1|Apo ti panid|Dagiti apo ti panid}}',
-'movesubpagetext' => 'Daytoy a panid ket adda $1 {{PLURAL:$1|apo ti panid|dagiti apo ti panid}} a naipakita dita baba..',
+'movesubpagetext' => 'Daytoy a panid ket adda $1 {{PLURAL:$1|apo ti panid|dagiti apo ti panid}} a naipakita dita baba.',
 'movenosubpage' => 'Daytoy a panid ket awan ti apo na a panid.',
 'movereason' => 'Rason:',
 'revertmove' => 'isubli',
@@ -2628,7 +2640,7 @@ Pangngaasi nga agpilika ti sabali a nagan.',
 'exporttext' => 'Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.
 Daytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].
 
-Ti pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a pinagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a pinagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a pinagurnos.
+Ti pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a pinagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a pinagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a pinagurnos.
 
 No iti kinaudi a kaso mabalinmo nga usaren ti panilpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid "[[{{MediaWiki:Mainpage}}]]".',
 'exportall' => 'Ipan amin a pampanid',
@@ -2749,7 +2761,7 @@ Pangngaasi ta padasem manen.',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Daytoy ti panid mo',
 'tooltip-pt-anonuserpage' => 'Ti panid ti agar-aramat daytoy nga IP a pagtaengan nga urnosem a  kasla',
-'tooltip-pt-mytalk' => 'Pakitungtongam a panid',
+'tooltip-pt-mytalk' => 'Pakitungtungam a panid',
 'tooltip-pt-anontalk' => 'Pakitungtungan ti pinagurnos a naggapu ditoy nga IP a pagtaengan',
 'tooltip-pt-preferences' => 'Dagiti kaykayatmo',
 'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem ti panagsuksutda',
@@ -2757,7 +2769,7 @@ Pangngaasi ta padasem manen.',
 'tooltip-pt-login' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
 'tooltip-pt-anonlogin' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
 'tooltip-pt-logout' => 'Rummuar',
-'tooltip-ca-talk' => 'Pagtutungtongan a maipapan ti linaon ti panid',
+'tooltip-ca-talk' => 'Pagtungtungan a maipapan ti linaon ti panid',
 'tooltip-ca-edit' => 'Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin',
 'tooltip-ca-addsection' => 'Mangirugi ti baro a paset',
 'tooltip-ca-viewsource' => 'Nasalakniban daytoy a panid.
@@ -2784,7 +2796,7 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-t-whatlinkshere' => 'Listaan ti am-amin a pampanid ti wiki a nakasilpo ditoy',
 'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan  dagiti panid a nakasilpo ditoy a panid',
 'tooltip-feed-rss' => 'RSS a pakan para iti daytoy a panid',
-'tooltip-feed-atom' => 'Atom a pakan para itoy a panid',
+'tooltip-feed-atom' => 'Atomo a pakan para itoy a panid',
 'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramidan daytoy nga agar-aramat',
 'tooltip-t-emailuser' => 'Patulodan ti e-surat daytoy nga agar-aramat',
 'tooltip-t-upload' => 'Agipan iti papeles',
@@ -2849,7 +2861,7 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-header-properties' => 'Tagtagikua ti panid',
 'pageinfo-display-title' => 'Iparang ti titulo',
 'pageinfo-default-sort' => 'Kasisigud a kangrunaan a panagilasin',
-'pageinfo-length' => 'Kaatiddog ti panid (kadagiti bytes)',
+'pageinfo-length' => 'Kaatiddog ti panid (kadagiti byte)',
 'pageinfo-article-id' => 'ID ti panid',
 'pageinfo-robot-policy' => 'Kasasaad ti panagbiruk a makina',
 'pageinfo-robot-index' => 'Mabalin a maipasurotan',
@@ -3101,7 +3113,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-citydest' => 'Naipakita a siudad',
 'exif-sublocationdest' => 'Sabali pay a lokasion ti siudad a naipakita',
 'exif-objectname' => 'Pandek a titulo',
-'exif-specialinstructions' => 'Kangrunaan a pinagipalpalawag',
+'exif-specialinstructions' => 'Kangrunaan a panagipalpalawag',
 'exif-headline' => 'Paulo',
 'exif-credit' => 'Pammadayaw/Nangted',
 'exif-source' => 'Taudan',
@@ -3120,7 +3132,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-datetimeexpires' => 'Saan nga usaren ti kallabes nga',
 'exif-datetimereleased' => 'Nakairuar idi',
 'exif-originaltransmissionref' => 'Kinasigud a pinagipatulod iti kodigo ti papanan',
-'exif-identifier' => 'Pinaglasin',
+'exif-identifier' => 'Panagilasin',
 'exif-lens' => 'Lente nga inusar',
 'exif-serialnumber' => 'Agsasaruno a numero ti kamera',
 'exif-cameraownername' => 'Akinkukua ti kamera',
@@ -3325,7 +3337,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-dc-contributor' => 'Dagiti nakaaramid',
 'exif-dc-date' => 'Petsa (dagiti petsa)',
 'exif-dc-publisher' => 'Nangipablaak',
-'exif-dc-relation' => 'Minaig a midia',
+'exif-dc-relation' => 'Mainaig a midia',
 'exif-dc-rights' => 'Dagiti Kaberngan',
 'exif-dc-source' => 'Taudan ti midia',
 'exif-dc-type' => 'Kita ti midia',
index 9720672..d998911 100644 (file)
@@ -23,46 +23,50 @@ $messages = array(
 'tog-hidepatrolled' => 'Керда хувцама дагарчеча дӀанийсъя хувцамаш къайлаяккха',
 'tog-newpageshidepatrolled' => 'Керда оагӀувни дагарчеча дӀанийсъя хувцамаш къайлаяккха',
 'tog-extendwatchlist' => 'Шеръя теркама дагарче, массайола хувцамаш чулоацаш',
-'tog-usenewrc' => 'Тоая керда хувцама дагаршкара пайда эца (JavaScript эша)',
-'tog-numberheadings' => 'Ð\9aеÑ\80Ñ\82еÑ\80а-деÑ\88а Ñ\82аÑ\8cÑ\80аÑ\85Ñ\8c Ñ\88ий Ð»Ð¾Ó\80амаÑ\86а Ð¾Ñ\82Ñ\82айе',
-'tog-showtoolbar' => 'ГӀалатнийcдара юкъе лакхера гӀирсий гартакх хьахокха (JavaScript)',
-'tog-editondblclick' => 'Шозза цлицкацa oагӀув хувца (JavaScript)',
-'tog-editsection' => 'ХӀара дакъа "хувца" яха Ӏинк хьахокха',
-'tog-editsectiononrightclick' => 'Декъам хувца кертмугӀа аьтта цлицка я (JavaScript)',
+'tog-usenewrc' => 'Тоая керда хувцама дагаршкара пайда эца (JavaScript)',
+'tog-numberheadings' => 'Кертера-деша таьрахь ший лоӀамаца оттае',
+'tog-showtoolbar' => 'ГӀалатнийcдара юкъе лакхера гӀирсий гартакх хьахьокха (JavaScript)',
+'tog-editondblclick' => 'Шозза Ñ\86лиÑ\86акаÑ\86a oагÓ\80Ñ\83в Ñ\85Ñ\83вÑ\86а (JavaScript)',
+'tog-editsection' => 'ХӀара дакъа "хувца" яха Ӏинк хьахьокха',
+'tog-editsectiononrightclick' => 'Ð\94екÑ\8aам Ñ\85Ñ\83вÑ\86а ÐºÐµÑ\80Ñ\82мÑ\83гÓ\80а Ð°Ñ\8cÑ\82Ñ\82а Ñ\86лиÑ\86ака Ñ\8f (JavaScript)',
 'tog-showtoc' => 'Кортанче хьокха (кхьаннена дукхагӀа кертмугӀанаш йoлa оагӀувна)',
-'tog-rememberpassword' => '(укх $1 {{PLURAL:$1|ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац',
-'tog-watchcreations' => 'Аз яь йола оагӀувнаш теркама дагарчеча чуяккха',
-'tog-watchdefault' => 'Аз хийца йола оагӀувнаш теркама дагарчеча чуяккха',
-'tog-watchmoves' => 'Аз цӀи хийца йола оагӀувнаш теркама дагарчеча чуяккха',
-'tog-watchdeletion' => 'Аз дӀаяккха йола оагӀувнаш теркама дагарчеча чуяккха',
+'tog-rememberpassword' => '(укх $1 {{PLURAL:$1|ден|деношк}}) мара са чувалара/чуялара дагалоаца дезаш дац',
+'tog-watchcreations' => 'Аз яь йола оагӀувнаш теркама дагарче йолач чуяьккха',
+'tog-watchdefault' => 'Аз хийца йола оагӀувнаш теркама дагарче йолач чуяьккха',
+'tog-watchmoves' => 'Аз цӀи хийца йола оагӀувнаш теркама дагарче йолач чуяьккха',
+'tog-watchdeletion' => 'Аз дӀаяьккха йола оагӀувнаш теркама дагарче йолач чуяьккха',
 'tog-minordefault' => 'Теркамза хувцамаш лоархӀамза белгалде',
 'tog-previewontop' => 'ГӀалатнийсдара кора хьалхе бӀаргтассам оттае',
 'tog-previewonfirst' => 'ГӀалатнийсдаре дехьавоалаш/йоалаш бӀаргтассам хьахьокха',
 'tog-nocache' => 'Укхазара оагӀувнаший лочкъараш дӀадоаде',
-'tog-enotifwatchlistpages' => 'Ð\9eагÓ\80Ñ\83внаÑ\88ий Ñ\85Ñ\83вÑ\86амаÑ\85Ñ\8c Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80Ñ\87еÑ\80а Ð»Ð°Ñ\8cÑ\86а, Ð´-Ñ\84оÑ\88Ñ\82аÑ\86а хоам бе',
-'tog-enotifusertalkpages' => 'Са Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илаÑ\87а, Ð´-Ñ\84оÑ\88Ñ\82аÑ\86а хоам бе',
-'tog-enotifminoredits' => 'Ð\93еÑ\82Ñ\82аÑ\80а Ð·Ó\80амига Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илаÑ\87а, Ð´-Ñ\84оÑ\88Ñ\82аÑ\86а хоам бе',
-'tog-enotifrevealaddr' => 'Ð\97Ó\80Ñ\8b Ñ\85оамаÑ\88 Ñ\82Ó\80а Ñ\81а Ñ\84оÑ\88Ñ\82моттиг хьахьокха',
+'tog-enotifwatchlistpages' => 'Ð\9eагÓ\80Ñ\83вний Ñ\85Ñ\83вÑ\86амаÑ\85 Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80Ñ\87еÑ\80а Ð»Ð°Ñ\8cÑ\86а, Ð´-Ñ\85оамнеÑ\86 хоам бе',
+'tog-enotifusertalkpages' => 'Са Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илаÑ\87а, Ð´-Ñ\85оамнеÑ\86 хоам бе',
+'tog-enotifminoredits' => 'Ð\93еÑ\82Ñ\82аÑ\80а Ð·Ó\80амига Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илаÑ\87а, Ð´-Ñ\85оамнеÑ\86 хоам бе',
+'tog-enotifrevealaddr' => 'Ð\97Ó\80Ñ\8b Ñ\85оамаÑ\88 Ñ\82Ó\80а Ñ\81а Ñ\85оамни моттиг хьахьокха',
 'tog-shownumberswatching' => 'Ший теркама дагарченгахь оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
-'tog-fancysig' => 'Ший кулга яздара вики-хоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
+'tog-oldsig' => 'Дола кулгайоазув:',
+'tog-fancysig' => 'Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
+'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
+'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
 'tog-showjumplinks' => '"Дехьадала" яха новкъостала Ӏинк хьахьокха',
 'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (Экспериментально)',
-'tog-forceeditsummary' => 'Хоам Ð±Ðµ, Ñ\85Ñ\83вÑ\86амий Ð»Ð¾Ð°Ñ\86ам Ð±ÐµÐ»Ð³Ð°Ð» Ð´Ð°Ñ\8c Ð´ÐµÑ\86и',
+'tog-forceeditsummary' => 'Хоам Ð±Ðµ, Ñ\85Ñ\83вÑ\86амий Ð»Ð¾Ð°Ñ\86ам Ð±ÐµÐ»Ð³Ð°Ð» Ð´Ð°Ñ\8c Ð´ÐµÑ\86е',
 'tog-watchlisthideown' => 'Са хувцамаш теркама дагарчера къайладаккха',
 'tog-watchlisthidebots' => 'БӀатий хувцамаш теркама дагарчера къайладаккха',
 'tog-watchlisthideminor' => 'Са зӀамига хувцамаш теркама дагарчера къайладаккха',
-'tog-watchlisthideliu' => 'Чубаьнна дакъалаьцархой хувцамаш теркама дагaрчеча къайлаяккха',
-'tog-watchlisthideanons' => 'ЦӀи йоаца дакъалаьцархой хувцамаш теркама дагрчеча къайлаяккха',
-'tog-watchlisthidepatrolled' => 'Теркама дагарчера дӀанийсъя хувцамаш къайлаяккха',
-'tog-ccmeonemails' => 'Ð\90з Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\88оа Ð´Ð°Ñ\85Ñ\82а ÐºÐ°Ñ\8cÑ\85аÑ\82аÑ\88 Ñ\81а Ð´-Ñ\84оÑ\88Ñ\82а тӀа хьатӀадайта',
-'tog-diffonly' => 'Диста къал йоалаж йола оагӀувна дакъа ма хьокха',
+'tog-watchlisthideliu' => 'Чубаьнна дакъалаьцархой хувцамаш теркама дагaрчеча къайлаяьккха',
+'tog-watchlisthideanons' => 'ЦӀи йоаца дакъалаьцархой хувцамаш теркама дагрчеча къайлаяьккха',
+'tog-watchlisthidepatrolled' => 'Теркама дагарчера дӀанийсъя хувцамаш къайлаяьккха',
+'tog-ccmeonemails' => 'Ð\90з Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\88оа Ð´Ð°Ñ\85Ñ\82а ÐºÐ°Ñ\8cÑ\85аÑ\82аÑ\88 Ñ\81а Ð´-Ñ\85оамни тӀа хьатӀадайта',
+'tog-diffonly' => 'Диста кIал йоалаж йола оагӀувна дакъа ма хьокха',
 'tog-showhiddencats' => 'Къайла цатегаш хьахьокха',
 
 'underline-always' => 'Массаза',
 'underline-never' => 'ЦӀаккха',
-'underline-default' => 'МазбӀарглокхарий оттамаш хайрамбе',
+'underline-default' => 'МазабӀарглокхарий оттамаш хайрамбе',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'ТIеракуц хувца',
 
 # Dates
 'sunday' => 'КӀиранди',
@@ -130,20 +134,21 @@ $messages = array(
 'category-article-count-limited' => 'Укх цатегчоахь {{PLURAL:$1|$1 оагӀув|$1 оагӀувнаш|}}.',
 'category-file-count' => '{{PLURAL:$2|Укх цатего ца паьла мара чулоацац.|{{PLURAL:$1|$1 паьла хьахьекха я|$1 паьлаш хьахьекха я}} укх цатегий $2 долачаьрахь.}}',
 'category-file-count-limited' => 'Укх цатегчоахь {{PLURAL:$1|$1 паьл|$1 паьлаш}}.',
-'listingcontinuesabbrev' => 'дӀахьо',
-'noindex-category' => 'Моттигза оагӀувнаш',
+'listingcontinuesabbrev' => 'дӀахо',
+'index-category' => 'ДIахьожаман оагӀувнаш',
+'noindex-category' => 'ДIахьожаманза оагӀувнаш',
 'broken-file-category' => 'Болхбеш йоаца паьла Ӏинкашца оагӀувнаш',
 
 'about' => 'Лоацам',
 'article' => 'Йоазув',
 'newwindow' => '(керда кора)',
-'cancel' => 'Юхавал',
+'cancel' => 'Юхавалa/ялa',
 'moredotdotdot' => 'ДӀахо',
 'mypage' => 'Са оагӀув',
 'mytalk' => 'Са дувцама оагӀув',
 'anontalk' => 'Укх IP-моттига дувцам',
-'navigation' => 'Ð\9dикÑ\8aÑ\82ахкар',
-'and' => '&#32;кха',
+'navigation' => 'Ð\9dикÑ\8aÑ\82охкар',
+'and' => '&#32;кхы',
 
 # Cologne Blue skin
 'qbfind' => 'Лахар',
@@ -163,18 +168,18 @@ $messages = array(
 'vector-action-protect' => 'Лораде',
 'vector-action-undelete' => 'Юхаоттаде',
 'vector-action-unprotect' => 'Лорам хувца',
-'vector-simplesearch-preference' => 'Яьржа лахарий довзамаш чуяккха (Vector skin only)',
+'vector-simplesearch-preference' => 'Яьржа лахарий довзамаш чуяьккха (Vector skin only)',
 'vector-view-create' => 'Кхоллам',
 'vector-view-edit' => 'Хувцар',
 'vector-view-history' => 'Искар',
 'vector-view-view' => 'Дешам',
 'vector-view-viewsource' => 'Зембакхама бӀаргтассам',
-'actions' => 'Дулархам',
+'actions' => 'ДулархIам',
 'namespaces' => 'ЦӀерий аренаш',
 'variants' => 'Дошаламаш',
 
 'errorpagetitle' => 'ГӀалат',
-'returnto' => '$1 оагӀув тӀа юхавалар',
+'returnto' => '$1 оагӀув тӀа юхавалар/ялар',
 'tagline' => 'Кечал укхазара я {{SITENAME}}',
 'help' => 'Новкъoстал',
 'search' => 'Тохкам',
@@ -192,8 +197,8 @@ $messages = array(
 'create' => 'Хьаде',
 'editthispage' => 'Ер оагӀув хувца',
 'create-this-page' => 'Ep oагӀув хьае',
-'delete' => 'ДӀадакха',
-'deletethispage' => 'Ер оагӀув дӀаяккха',
+'delete' => 'ДӀадаккха',
+'deletethispage' => 'Ер оагӀув дӀаяьккха',
 'undelete_short' => 'Меттаоттае {{PLURAL:$1|хувцам|$1 хувцамаш}}',
 'viewdeleted_short' => 'БӀаргтасса {{PLURAL:$1|дӀадаьккха хувцам тӀа|$1 дӀадаьккха хувцамаш тӀа}}',
 'protect' => 'Лораде',
@@ -214,7 +219,7 @@ $messages = array(
 'userpage' => 'Дакъалаьцачунна оагӀуве бӀаргтасса',
 'projectpage' => 'Хьахьоадайтама оагӀуве бӀаргтасса',
 'imagepage' => 'Паьла оагӀув тӀа бӀаргтасса',
-'mediawikipage' => 'Xоама оагӀув хьахокха',
+'mediawikipage' => 'Xоаман оагӀув хьахьокха',
 'templatepage' => 'ЧӀабла оагӀув тӀа бӀаргтасса',
 'viewhelppage' => 'ГӀо деха',
 'categorypage' => 'Цатега оагӀув тӀа бӀаргтасса',
@@ -223,10 +228,10 @@ $messages = array(
 'redirectedfrom' => '($1 тӀера хьадейта да)',
 'redirectpagesub' => 'ДӀа-хьа дайта оагӀув',
 'lastmodifiedat' => 'Укх оагӀув тӀехьара  хувцам: $2, $1.',
-'viewcount' => 'Укх оагӀув тӀа бӀаргтасса хиннад {{PLURAL:$1|цкъа|$1 шозза}}.',
+'viewcount' => 'Укх оагӀув тӀа бӀаргтасса хиннад {{PLURAL:$1|цхьазза|$1 шозза}}.',
 'protectedpage' => 'Лорама оагӀув',
-'jumpto' => 'Укхаза дехьавала:',
-'jumptonavigation' => 'никÑ\8aÑ\82ахкар',
+'jumpto' => 'Укхаза дехьавала/яла:',
+'jumptonavigation' => 'никÑ\8aÑ\82охкар',
 'jumptosearch' => 'леха',
 'pool-queuefull' => 'Хаттарий цӀа хьалдизад',
 'pool-errorunknown' => 'Довзаш доаца гӀалат',
@@ -234,7 +239,7 @@ $messages = array(
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Лоацам {{SITENAME}}',
 'aboutpage' => 'Project:Лоацам',
-'copyright' => '$1 чулоацамаца такхоачаш да.',
+'copyright' => '$1 чулоацамаца тIакхоачаш да.',
 'copyrightpage' => '{{ns:project}}:Яздаьчунна бокъо',
 'currentevents' => 'ХӀанзара хоамаш',
 'currentevents-url' => 'Project:ХӀанзара хоамаш',
@@ -252,7 +257,7 @@ $messages = array(
 'privacypage' => 'Project:Паьлбокъо',
 
 'badaccess' => 'Чуваларa гӀалат',
-'badaccess-group0' => 'Оаш хьадийха дулархам шунна де йийшяц.',
+'badaccess-group0' => 'Оаш хьадийха дулархIам шун де йишяц.',
 'badaccess-groups' => 'Дахта кхоачашдар {{PLURAL:$2|тоабачара|тоабашкара}} $1 дакъалаьцархой мара де бокъо яц.',
 
 'versionrequired' => '$1 MediaWiki доржам эша',
@@ -268,16 +273,16 @@ $messages = array(
 'editold' => 'хувца',
 'viewsourceold' => 'xьадоагӀа къайладоагӀа тӀа бӀаргтасса',
 'editlink' => 'хувца',
-'viewsourcelink' => 'xьадоагӀа къайладоагӀа тӀа бӀаргтасса',
+'viewsourcelink' => 'xьадоагӀа къайладӀоагӀа тӀа бӀаргтасса',
 'editsectionhint' => 'Декъам хувца: $1',
 'toc' => 'Чулоацам',
-'showtoc' => 'хьахокха',
+'showtoc' => 'хьахьокха',
 'hidetoc' => 'къайладаккха',
 'collapsible-collapse' => 'чудерзаде',
 'collapsible-expand' => 'хьадоаржаде',
 'thisisdeleted' => '$1 бӀаргтасса е юхаметтаоттаде?',
 'viewdeleted' => '$1 бӀаргтасса?',
-'restorelink' => '{{PLURAL:$1|дӀаяккха хувцам|$1 дӀаяккха хувцамаш}}',
+'restorelink' => '{{PLURAL:$1|дӀаяьккха хувцам|$1 дӀаяьккха хувцамаш}}',
 'feedlinks' => 'Цу тайпара:',
 'site-rss-feed' => '$1 RSS мугӀ',
 'site-atom-feed' => '$1 Atom мугӀ',
@@ -290,7 +295,7 @@ $messages = array(
 'nstab-user' => 'Дакъалаьцархо',
 'nstab-media' => 'Медифаг',
 'nstab-special' => 'ГӀулакха оагӀув',
-'nstab-project' => 'Хьахьоадайтамахь лаьца',
+'nstab-project' => 'Хьахьоадайтамах лаьца',
 'nstab-image' => 'Паьл',
 'nstab-mediawiki' => 'Хоам',
 'nstab-template' => 'Куцкеп',
@@ -298,14 +303,14 @@ $messages = array(
 'nstab-category' => 'Цатег',
 
 # Main script and global functions
-'nosuchaction' => 'Цу тайпара дулархам бац',
+'nosuchaction' => 'Цу тайпара дулархIам бац',
 'nosuchspecialpage' => 'Изза мо гӀооагӀув яц',
 
 # General errors
 'error' => 'ГӀалат',
 'missing-article' => 'Кораде дезаш хинна оагӀувни яздам корадаьдац «$1» $2.
 
-Из мо гӀалат нийсалуш хула, саг тишъенна Ӏинкаца, д|адаькха дола оагӀувни хувца искара тӀа чувала гӀиртача.
+Из мо гӀалат нийсалуш хула, саг тишъенна Ӏинкаца, д|адаьккха дола оагӀувни хувца искара тӀа чувала гӀертача.
 
 Наггахь санна из иштта децe, шоана гӀирса Ӏалаш деча гӀалат кораяь хила мега.
 Дехар да, [[Special:ListUsers/sysop|мазакулгалхочоа]] хоам бе, URL хьахьокхаш.',
@@ -313,44 +318,52 @@ $messages = array(
 'internalerror' => 'Чура гӀалат',
 'internalerror_info' => 'Чура гӀалат: $1',
 'badtitle' => 'Мегаш йоаца цӀи',
-'badtitletext' => 'Дехаш дола оагӀувни цӀи, нийса яц, яьсса я е меттаюкъара е вIикъaюкъара цӀи харцахь я. ЦӀера юкъе мегаш доаца харакъаш нийсаденна хила мегаш да.',
-'viewsource' => 'Тахкам',
+'badtitletext' => 'Дехаш дола оагӀувни цӀи, нийса яц, яьсса я е меттаюкъара е массаюкъара цӀи харцахь я. ЦӀера юкъе мегаш доаца харакъаш нийсаденна хила мегаш да.',
+'viewsource' => 'Тохкам',
+'actionthrottled' => 'Сихален овзамал',
+'protectedpagetext' => 'Хувцаман белхаш долаш ер оагIув къайла я.',
+
+# Virus scanner
+'virus-unknownscanner' => 'довзашдоаца мазаундохьалург:',
 
 # Login and logout pages
 'yourname' => 'Дакъалаьцархочунна цӀи:',
-'yourpassword' => 'КъайладоагӀа:',
-'yourpasswordagain' => 'КъайладоагӀа юха Ӏоязаде:',
+'yourpassword' => 'КъайладIоагӀа:',
+'yourpasswordagain' => 'КъайладIоагӀа юха Ӏоязаде:',
 'remembermypassword' => '(укх $1 {{PLURAL:$1|ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац',
 'yourdomainname' => 'Шун цӀеноагӀув:',
 'login' => 'Чувала/яла',
-'nav-login-createaccount' => 'ЦӀи яькха/Ший oагӀув ела',
+'nav-login-createaccount' => 'ЦӀи яьккха/Ший oагӀув ела',
 'loginprompt' => 'Укх болхaоагӀуваца доттагӀал лаца, шун "cookies" йийла хьалдеза.',
-'userlogin' => 'ЦӀи яькха/ОагӀув ела',
+'userlogin' => 'ЦӀи яьккха/ОагӀув ела',
 'userloginnocreate' => 'Чувала/яла',
 'logout' => 'Аравала/яла',
 'userlogout' => 'Аравала/яла',
 'notloggedin' => 'Оаш шоай цӀи хьааьннадац',
 'nologin' => "Теркама йоазув яц? '''$1'''.",
-'nologinlink' => 'Лархама йоазув де',
+'nologinlink' => 'ЛархIама йоазув де',
 'createaccount' => 'Керда дакъалаьцархо кхолла',
 'gotaccount' => "Укхаза дӀаязабенна дий шо? '''$1'''.",
 'gotaccountlink' => 'Чувала/яла',
-'userlogin-resetlink' => 'ЧÑ\83вала/Ñ\8fла Ñ\86Ó\80еи Ð´Ð¾Ð°Ð³Ó\80еи дийцаденнадий?',
-'createaccountmail' => 'Ð\94\84оÑ\88Ñ\82аÑ\86а',
+'userlogin-resetlink' => 'ЧÑ\83вала/Ñ\8fла Ñ\86Ó\80ии Ð´IоагÓ\80аи дийцаденнадий?',
+'createaccountmail' => 'Ð\94\85оамнеÑ\86',
 'createaccountreason' => 'Бахьан:',
-'mailmypassword' => 'Керда къайладоагӀа хьаэца',
+'badretype' => 'Оаша яьккха дIоагIий цIераш шоайл таралуш яц.',
+'loginerror' => 'Дакъалаьцархочун цIи нийса яц',
+'mailmypassword' => 'Керда къайладIоагӀа хьаэца',
 'loginlanguagelabel' => 'Мотт: $1',
 
 # Change password dialog
-'oldpassword' => 'Къаьна къайладоагӀ:',
-'newpassword' => 'Керда къайладоагӀ:',
-'retypenew' => 'Керда къайладоагӀа юха Ӏоязаде:',
-'resetpass-submit-loggedin' => 'КъайладогӀа дӀахувца',
+'resetpass' => 'КъайладIоагIа дIахувцар',
+'oldpassword' => 'Къаьна къайладIоагӀа:',
+'newpassword' => 'Керда къайладIоагӀа:',
+'retypenew' => 'Керда къайладIоагӀа юха Ӏоязаде:',
+'resetpass-submit-loggedin' => 'КъайладIоагӀа дӀахувца',
 'resetpass-submit-cancel' => 'Юхавал/ялa',
 
 # Special:PasswordReset
 'passwordreset-username' => 'Дакъалаьцархочунна цӀи:',
-'passwordreset-email' => 'Ð\94\84оÑ\88Ñ\82а моттиг:',
+'passwordreset-email' => 'Ð\94\85оамни моттиг:',
 
 # Edit page toolbar
 'bold_sample' => 'Сома яздам',
@@ -364,8 +377,8 @@ $messages = array(
 'headline_sample' => 'KертмугӀa яздама',
 'headline_tip' => '2-гӀа кертмугӀa лагӀа',
 'nowiki_sample' => 'Укхаза кийчаде дезаш доаца яздам оттаде',
-'nowiki_tip' => 'Ð\92|икÑ\8aa-бӀасоттамахь теркам ма бе',
-'image_tip' => 'Чуяькха паьла',
+'nowiki_tip' => 'Ð\9cаÑ\81Ñ\81а-бӀасоттамахь теркам ма бе',
+'image_tip' => 'Чуяьккха паьла',
 'media_tip' => 'Паьла Ӏинк',
 'sig_tip' => 'Шун кулгаяздар а, хӀанзара ха а',
 'hr_tip' => 'Мухала мугӀ (могаш тайпара к|еззига хайраде)',
@@ -380,31 +393,31 @@ $messages = array(
 'showpreview' => 'Хьалхе бӀаргтaссар',
 'showlivepreview' => 'Сиха бӀаргтассар',
 'showdiff' => 'Даь хувцамаш',
-'anoneditwarning' => 'Ð\97ем Ñ\85ила! Ð¨Ð¾ ÐºÑ\85Ñ\8b Ñ\87Ñ\83даÑ\8cннадаÑ\86. Ð¨Ñ\83н IP-моÑ\82Ñ\82иг Ñ\83кÑ\85 Ñ\85ийÑ\86а Ð¾Ð°Ð³Ó\80Ñ\83в Ð¸Ñ\81каÑ\80еÑ\87Ñ\83 Ð´Ó\80аÑ\8fздаÑ\8c Ñ\85Ñ\83Ñ\80гÑ\8aе.',
+'anoneditwarning' => 'Ð\97ем Ñ\85ила! Ð¨Ð¾ ÐºÑ\85Ñ\8b Ñ\87Ñ\83даÑ\8cннадаÑ\86. Ð¨Ñ\83н IP-моÑ\82Ñ\82иг Ñ\83кÑ\85 Ñ\85ийÑ\86а Ð¾Ð°Ð³Ó\80Ñ\83в Ð¸Ñ\81каÑ\80еÑ\87Ñ\83 Ð´Ó\80аÑ\8fздаÑ\8c Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f.',
 'summary-preview' => 'Лоацам ба:',
 'subject-preview' => 'Кортяздам:',
 'blockedtitle' => 'Дакъалаьцархо чӀега бела ва/я',
 'blockednoreason' => 'бахьан доацаш да',
 'loginreqlink' => 'чувала/яла',
 'loginreqpagetext' => 'Кхыйола оагӀувнашка хьожаргдолаш, оаш $1 де деза.',
-'accmailtitle' => 'КъайладоагӀ дӀадахатад',
+'accmailtitle' => 'КъайладIоагӀа дӀадахьийтад',
 'newarticle' => '(Kерда)',
 'newarticletext' => 'Шо йоаца оагӀув тӀа Ӏинкаца дехьадаьннад.
 Из хьае, кӀалхагӀа доала корачу яздам очуязаде (кхета хала дале [[{{MediaWiki:Helppage}}|новкъостала оагӀув тӀа]] бӀаргтасса).
 Цаховш укхаза нийсадена дале, юхавала/яла яха тоӀобама тӀа пӀелга тоӀобе.',
-'noarticletext' => "У Ñ\81аÑ\85Ñ\8cаÑ\82е укх оагӀув тӀа яздам доацаш да.
+'noarticletext' => "Ð¥Iанз укх оагӀув тӀа яздам доацаш да.
 [[Special:Search/{{PAGENAME}}|цу тайпара цӀи дувцам кораде]] кхыдола йоазувашках йийша я шун, вешта
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола таптарий йоазув карае], е
 '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув ела]'''</span>.",
-'noarticletext-nopermission' => 'УкÑ\85 Ñ\81аÑ\85Ñ\8cаÑ\82е укх оагӀув тӀа яздам дац.
+'noarticletext-nopermission' => 'Ð¥Iанз укх оагӀув тӀа яздам дац.
 Шун йийшая, кхыдола йоазувнашкахь [[Special:Search/{{PAGENAME}}|дола цӀерий хаттам корае]] е <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийсамий тептара йоазувнаш корае].</span>',
 'note' => "'''ХӀамоалар:'''",
 'previewnote' => "'''Хьалхе б|аргтассам мара бац.'''
-Яздам кха яздаь дац!",
+Яздам кхы яздаь дац!",
 'editing' => 'ГӀалатнийсдар: $1',
 'editingsection' => 'ГIалатнийсдар $1 (оагӀувдакъа)',
 'editingcomment' => 'ГӀалатнийсдар $1 (керда декъам)',
-'editconflict' => 'Ð\93Ó\80алаÑ\82нийÑ\81даÑ\80а ÐºÑ\85овсам: $1',
+'editconflict' => 'Ð\93Ó\80алаÑ\82нийÑ\81даÑ\80а ÐºÑ\8aовсам: $1',
 'yourtext' => 'Хьа яздам',
 'copyrightwarning' => "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, тӀахьежама кӀала уллаш, оаш мел чуяккхаш дола хоамаш, яздамаш долга.
 Наггахь санна шоай яздамаш пурам доацаш мала волашву саго хувца е кхы дола моттиге яздердолаш, безам беци, укхаз Ӏочуцаяздеча, дикаьгӀа да.<br />
@@ -416,17 +429,17 @@ $messages = array(
 'template-semiprotected' => '(дакъа-лорам)',
 'hiddencategories' => 'Ер оагӀув укх {{PLURAL:$1|къайла цатегаца|къайла цатегашца}} дакъа лоаца:',
 'permissionserrorstext-withaction' => '$2 де бокъо яц {{PLURAL:$1|из бахьан долаш|из бахьанаш долаш}}:',
-'recreate-moveddeleted-warn' => "'''Зем бе! Шо хьалххе дайоаккхаш хина оагӀув хьае гӀарта.'''
+'recreate-moveddeleted-warn' => "'''Зем бе! Шо хьалххе дIайоаккхаш хинна оагӀув хьае гӀерта.'''
 
 Хьажа, бокъонцахь езаш йолга.
-КӀалхагIа укх оагӀуви дӀадаккхамeи цӀи хувцамeи тептараш хьекха да.",
-'moveddeleted-notice' => 'Ер оагӀув дӀаяккха хиннай.
+КӀалхагIа укх оагӀуви дӀадаккхами цӀи хувцами тептараш хьекха да.",
+'moveddeleted-notice' => 'Ер оагӀув дӀаяьккха хиннай.
 Новкъостала, кӀалха дӀадаккхама а хувцама а тептарашкера нийсама йоазувнаш хьахьекха я.',
 'log-fulllog' => 'Деррига таптара бӀаргтасса',
-'edit-conflict' => 'Ð¥Ñ\83вÑ\86амий ÐºÑ\85овсам.',
+'edit-conflict' => 'Ð¥Ñ\83вÑ\86амий ÐºÑ\8aовсам.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => 'Зембакхам: дагара куцкепаш чулоаца дустам геттара доккха да.
+'post-expand-template-inclusion-warning' => 'Зембаккхам: дагара куцкепаш чулоаца дустам геттара доккха да.
 Цхьадола куцкепаш чулоацалургдац.',
 'post-expand-template-inclusion-category' => 'Чулоаца куцкепий мегаш дола дустам дукхалена тӀехьайоала оагӀувнаш',
 'post-expand-template-argument-warning' => 'Зем бе! Ер оагӀув цаӀ куцкепа |аьлдош мара чулоацац, юхадастара сел доккха дустам йолаш.
@@ -439,7 +452,7 @@ $messages = array(
 'revisionasof' => '$1 доржам',
 'revision-info' => '$1; $2 хувцам',
 'previousrevision' => '← Xьалхйоаг|араш',
-'nextrevision' => 'TӀадоагӀа →',
+'nextrevision' => 'ТIехьайоагIараш →',
 'currentrevisionlink' => 'Дола доржам',
 'cur' => 'хӀанз.',
 'next' => 'тӀехь.',
@@ -448,9 +461,10 @@ $messages = array(
 'page_last' => 'тӀехьара',
 'histlegend' => "Кхетам: (хӀанз.) = хӀанза йолачунна бӀаргоагӀувни хьакъоастам ба; (хьалх.) = хьалха хинначунна бӀаргоагӀувни хьакъоастам ба; '''зӀ''' = зӀамига хьахувцам ба.",
 'history-fieldset-title' => 'Искара бӀаргтасса',
-'history-show-deleted' => 'ДӀадаькхараш мара',
+'history-show-deleted' => 'ДӀадаьккхараш мара',
 'histfirst' => 'къаьнараш',
 'histlast' => 'ха яннараш',
+'historyempty' => '(даьсса)',
 
 # Revision feed
 'history-feed-title' => 'Хувцамий искар',
@@ -458,54 +472,55 @@ $messages = array(
 'history-feed-item-nocomment' => '$1гӀара $2гӀачу',
 
 # Revision deletion
-'rev-delundel' => 'хьахьокха/къайлаяькха',
-'rev-showdeleted' => 'хьахокха',
+'rev-delundel' => 'хьахьокха/къайлаяьккха',
+'rev-showdeleted' => 'хьахьокха',
 'revdelete-show-file-submit' => 'XӀаа',
 'revdelete-radio-set' => 'XӀаа',
 'revdelete-radio-unset' => 'A',
 'revdelete-log' => 'Бахьан',
 'revdel-restore' => 'БӀасанче хувца',
-'revdel-restore-deleted' => 'дӀадаькха доржамаш',
+'revdel-restore-deleted' => 'дӀадаьккха доржамаш',
 'revdel-restore-visible' => 'бӀаргагушдола доржамаш',
 'pagehist' => 'ОагӀува искар',
-'deletedhist' => 'ДӀадакхамий искар',
+'deletedhist' => 'ДӀадаккхамий искар',
+'revdelete-reasonotherlist' => 'Кхыдола бахьан',
 
 # History merging
 'mergehistory-list' => 'ВIашагIатоха хувцамий искар',
 'mergehistory-go' => 'ВIашагIатоха хувцамаш хьахьокха',
 'mergehistory-submit' => 'Хувцамаш вIашагIатоха',
-'mergehistory-empty' => 'Ð\92IаÑ\88агIаÑ\82оÑ\85аÑ\80а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐ¾Ñ\80аÑ\8fÑ\8fÑ\86',
+'mergehistory-empty' => 'Ð\92IаÑ\88агIаÑ\82оÑ\85аÑ\80а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÐ¾Ñ\80аÑ\8fÑ\8c Ñ\8fÑ\86.',
 'mergehistory-reason' => 'Бахьан:',
 
 # Merge log
 'revertmerge' => ' Декъа',
 
 # Diffs
-'history-title' => '"$1" хувцамий искар',
+'history-title' => '"$1" — хувцамий искар',
 'lineno' => 'МугI $1:',
 'compareselectedversions' => 'Хьаржа доржамаша тарона тIа хьажа',
 'editundo' => 'юхавала/яла',
 'diff-multi' => '({{PLURAL:$1|$1 юкъара доржам хьахьекха дац|$1 юкъара доржамаш хьахьекха дац}} {{PLURAL:$2|$2 дакъалаьцархочунна|$2 дакъалаьцархоший}})',
 
 # Search results
-'searchresults' => 'ТаÑ\85кама Ð³IÑ\83лакÑ\85хилар',
-'searchresults-title' => '"$1" Ñ\82ахка',
-'searchresulttext' => 'Ð¥Ñ\8cаÑ\85Ñ\8cоадайÑ\82ама Ð¾Ð°Ð³IÑ\83внаÑ\88 Ñ\82Iа Ñ\82аÑ\85камаÑ\85Ñ\8c лаьца лоаца маIандар эца [[{{MediaWiki:Helppage}}|новкъостала декъамага]] хьажа.',
-'searchsubtitle' => 'Хоаттамахь лаьца «[[:$1]]» ([[Special:Prefixindex/$1|цу цIерахь ювалу оагIувнаш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|цу цIерахь Iинкаш еж йола]])',
+'searchresults' => 'ТоÑ\85кама Ð³IÑ\83лакÑ\85ахилар',
+'searchresults-title' => '"$1" Ñ\82охка',
+'searchresulttext' => 'Ð¥Ñ\8cаÑ\85Ñ\8cоадайÑ\82ама Ð¾Ð°Ð³IÑ\83внаÑ\88 Ñ\82Iа Ñ\82оÑ\85камаÑ\85 лаьца лоаца маIандар эца [[{{MediaWiki:Helppage}}|новкъостала декъамага]] хьажа.',
+'searchsubtitle' => 'Хоаттамах лаьца «[[:$1]]» ([[Special:Prefixindex/$1|цу цIерах ювалу оагIувнаш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|цу цIерах Iинкаш еш йола]])',
 'searchsubtitleinvalid' => "'''$1''' хаттара",
 'notitlematches' => 'ОагIувни цIераш вIашагIа кхеташ яц',
-'notextmatches' => 'ОагIувнаша ядамий вIашагIакхетараш дац',
+'notextmatches' => 'Ð\9eагIÑ\83внаÑ\88а Ñ\8fздамий Ð²IаÑ\88агIакÑ\85еÑ\82аÑ\80аÑ\88 Ð´Ð°Ñ\86',
 'prevn' => '{{PLURAL:$1|хьалхйоаг|ар $1|хьалхйоаг|араш $1|хьалхйоаг|араш $1}}',
 'nextn' => '{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}',
 'prevn-title' => '{{PLURAL:$1|$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}',
 'nextn-title' => '{{PLURAL:$1|$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}',
 'shown-title' => 'Укх оагIувни $1 {{PLURAL:$1|йоазув|йоазувнаш}} хьахьокха',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) хьажа',
-'searchmenu-exists' => "'''УкÑ\85 Ð²IикÑ\8aa-Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82ама Ñ\87Ñ\83 ер оаг|ув \"[[:\$1]]\" я'''",
-'searchmenu-new' => "'''УкÑ\85 \"[[:\$1]]\" Ð²|икÑ\8aa-Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82амÑ\87оÑ\85 Ð¾Ð°Ð³IÑ\83в Ð´е!'''",
+'searchmenu-exists' => "'''УкÑ\85 Ð¼Ð°Ñ\81Ñ\81а-Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82амаÑ\87 ер оаг|ув \"[[:\$1]]\" я'''",
+'searchmenu-new' => "'''УкÑ\85 \"[[:\$1]]\" Ð¼Ð°Ñ\81Ñ\81а-Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82амаÑ\87 Ð¾Ð°Ð³IÑ\83в е!'''",
 'searchhelp-url' => 'Help:Чулоацам',
 'searchprofile-articles' => 'ЛардоагIувнаш',
-'searchprofile-project' => 'Ð\94агаÑ\80Ñ\87еи Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82амеи оагIувнаш',
+'searchprofile-project' => 'Ð\94агаÑ\80Ñ\87и Ñ\85Ñ\8cаÑ\85Ñ\8cоадайÑ\82ами оагIувнаш',
 'searchprofile-images' => 'Медифаг',
 'searchprofile-everything' => 'Массана',
 'searchprofile-advanced' => 'Шера я',
@@ -513,17 +528,18 @@ $messages = array(
 'searchprofile-project-tooltip' => '$1чу лахар',
 'searchprofile-images-tooltip' => 'Паьлий лахар',
 'searchprofile-everything-tooltip' => 'Массадола оагIувний лахар (дувцама оагIувнаш чулоацаш)',
-'searchprofile-advanced-tooltip' => 'Iочуязьяь цIераренашках лаха',
+'searchprofile-advanced-tooltip' => 'Iочуязаяь цIераренашках лаха',
 'search-result-size' => ' $1 ({{PLURAL:$2|1 дош|$2 дешаш}})',
 'search-result-category-size' => '{{PLURAL:$1|$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|$3 паьла|$3 паьлий|$3 паьлий}})',
-'search-redirect' => '($1 дехьачуяькхар)',
+'search-redirect' => '($1 дехьачуяьккхар)',
 'search-section' => ' (дакъа $1)',
 'search-suggest' => 'Iа лохар из хила мега: $1',
-'search-interwiki-caption' => 'Гаргалона хьахьоадайтамаш',
+'search-interwiki-caption' => 'Гаргалон хьахьоадайтамаш',
 'search-interwiki-default' => '$1 толамчаш:',
 'search-interwiki-more' => '(кха)',
 'search-mwsuggest-enabled' => ' Хьехамашца',
 'search-mwsuggest-disabled' => ' Хьехамаш боацаш',
+'search-relatedarticle' => 'шоайл дола',
 'searchrelated' => 'гаргара',
 'searchall' => 'деррига',
 'showingresultsheader' => "{{PLURAL:$5|'''$1''' толамче укх '''$3''' долачарах|'''$1 — $2''' толамчаш укх '''$3''' долачарах}} '''$4'''а",
@@ -545,42 +561,42 @@ $messages = array(
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
 'prefsnologin' => 'Шо чудаьнна дац',
-'changepassword' => 'КъайладоaгIа дIахувцар',
+'changepassword' => 'КъайладIоaгIа дIахувцар',
 'prefs-skin' => 'БIагала куц',
 'skin-preview' => 'Хьажа',
-'prefs-datetime' => 'ТаÑ\8cÑ\80аÑ\85Ñ\8cеи Ñ\81аÑ\85Ñ\8cаÑ\82еи',
+'prefs-datetime' => 'ТаÑ\8cÑ\80аÑ\85Ñ\8cи Ñ\81аÑ\85Ñ\8cаÑ\82и',
 'prefs-personal' => 'Хьа хьай далам',
 'prefs-rc' => 'Керда хувцамаш',
 'prefs-watchlist' => 'Теркама дагарче',
 'prefs-watchlist-days' => 'Ден дукхал',
-'prefs-resetpass' => 'КъайладогIа хувца',
+'prefs-resetpass' => 'КъайладIоагIа хувца',
 'prefs-rendering' => 'ТIера бIаса',
 'saveprefs' => 'Дита',
 'prefs-editing' => 'ГIалатнийсдар',
 'searchresultshead' => 'Лахаp',
 'timezonelegend' => 'Сахьати юкъ:',
 'localtime' => 'Вола/Йола моттиги ха:',
-'timezoneregion-africa' => 'Эприк',
+'timezoneregion-africa' => 'Ð\90Ñ\8cприк',
 'timezoneregion-america' => 'Iаьмрик',
 'timezoneregion-antarctica' => 'Энтарцит',
 'timezoneregion-arctic' => 'Эрцит',
 'timezoneregion-asia' => 'Iаьзик',
-'timezoneregion-atlantic' => 'IаÑ\82ланÑ\82иÑ\86форд',
+'timezoneregion-atlantic' => 'IаÑ\8cÑ\82ланÑ\82а форд',
 'timezoneregion-australia' => 'Устралик',
 'timezoneregion-europe' => 'Аьроп',
 'timezoneregion-indian' => 'ХIинда форд',
 'timezoneregion-pacific' => 'Тийна форд',
-'prefs-searchoptions' => 'Тахкама оттамаш',
+'prefs-searchoptions' => 'Тохкама оттамаш',
 'prefs-files' => 'Паьлаш',
-'youremail' => 'Ð\94\84оÑ\88Ñ\82:',
+'youremail' => 'Ð\94\85оамни:',
 'username' => 'Дакъалаьцархочунна цIи:',
 'yourrealname' => 'Шун цIи:',
 'yourlanguage' => 'Мотт:',
 'gender-male' => 'МаIа',
 'gender-female' => 'Кхал',
-'email' => 'Ð\94\84оÑ\88Ñ\82',
-'prefs-help-email' => 'Ð\94\84оÑ\88Ñ\82ий Ð¼Ð¾Ñ\82Ñ\82иг Ð°Ð»Ð° Ñ\8dÑ\88аÑ\88 Ð´Ð°Ñ\86, Ð°Ð¼Ð¼Ð° Ð½Ð¾Ð²ÐºÐ° Ð´Ð°Ñ\86а, Ð½Ð°Ð³Ð³Ð°Ñ\85 Ñ\81анна ÐºÑ\8aайладоагIа Ñ\88оан дийцалой, цу тIа хьатIадайтаргда.',
-'prefs-help-email-others' => 'Ð\9aÑ\85Ñ\8bбола Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\88а Ñ\88оаÑ\86а Ð±Ñ\83взам Ñ\8f Ð¹Ð¸Ð¹Ñ\88Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ñ\88Ñ\83н Ð¾Ð°Ð³IÑ\83ва Ñ\82Iа Ð³Iолла, Ð´-Ñ\84оÑ\88Ñ\82 хьаела ца езаш.',
+'email' => 'Ð\94\85оамни',
+'prefs-help-email' => 'Ð\94\85оамни Ð¼Ð¾Ñ\82Ñ\82иг Ð°Ð»Ð° Ñ\8dÑ\88аÑ\88 Ð´Ð°Ñ\86, Ð°Ð¼Ð¼Ð° Ð½Ð¾Ð²ÐºÑ\8aа Ð´Ð°Ñ\86а, Ð½Ð°Ð³Ð³Ð°Ñ\85Ñ\8c Ñ\81анна ÐºÑ\8aайладIоагIа Ñ\88оана дийцалой, цу тIа хьатIадайтаргда.',
+'prefs-help-email-others' => 'Ð\9aÑ\85Ñ\8bбола Ð´Ð°ÐºÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\88а Ñ\88оаÑ\86а Ð±Ñ\83взам Ñ\8f Ð¹Ð¸Ð¹Ñ\88Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ñ\88Ñ\83н Ð¾Ð°Ð³IÑ\83ва Ñ\82Iа Ð³Iолла, Ð´-Ñ\85оамни хьаела ца езаш.',
 'prefs-signature' => 'Кулгяздар',
 
 # User rights
@@ -627,34 +643,36 @@ $messages = array(
 'recentchanges' => 'Керда хувцамаш',
 'recentchanges-legend' => 'Керда хувцамий оттамаш',
 'recentchanges-summary' => 'КIалхагIа лоарамий доаламе тIехьара оагIувний хувцамаш дIаязадаь да{{grammar:genitive|{{SITENAME}}}}.',
-'recentchanges-feed-description' => 'УкÑ\85 Ð»Ð°Ñ\80амÑ\86а Ñ\82IеÑ\85Ñ\8cаÑ\80а Ð²Ð¸ÐºÐ¸хувцамашт теркам бе.',
+'recentchanges-feed-description' => 'УкÑ\85 Ð»Ð°Ñ\80амÑ\86а Ñ\82IеÑ\85Ñ\8cаÑ\80а Ð¼Ð°Ñ\81Ñ\81ахувцамашт теркам бе.',
 'recentchanges-label-newpage' => 'Укх хувцамаца керда оагIув даь хиннад',
 'recentchanges-label-minor' => 'ЗIамига хувцам я',
 'recentchanges-label-bot' => 'Ер хувцам бIатаца яь е',
-'recentchanges-label-unpatrolled' => 'Ер хувцам ший моттиге кхы дIадехьаяькхаяц.',
+'recentchanges-label-unpatrolled' => 'Ер хувцам ший моттиге кхы дIадехьаяьккхаяц.',
 'rcnote' => "{{PLURAL:$1|Тlехьара '''$1''' хувцам|Тlехьара '''$1''' хувцамаш}} дола '''$2''' {{PLURAL:$2|ден|деношкахь}}, укх сахьате $5 $4.",
 'rcnotefrom' => 'КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).',
 'rclistfrom' => '$1 тIара хувцамаш хьахьокха',
 'rcshowhideminor' => 'зIамига хувцамаш $1',
 'rcshowhidebots' => '$1 шабелхалой',
 'rcshowhideliu' => 'Чубаьнначара дакъалаьцархочий $1',
-'rcshowhideanons' => 'цIияькханза дакъалаьцархой $1',
+'rcshowhideanons' => 'цIияьккханза дакъалаьцархой $1',
 'rcshowhidepatr' => '$1 теркам даь хувцамаш',
 'rcshowhidemine' => '$1 сай хувцамаш',
 'rclinks' => '$2 динах<br />$3 $1 хинна тIехьара хувцамаш хьахьокха',
 'diff' => 'кхы.',
 'hist' => 'искар',
-'hide' => 'Къайлдакха',
+'hide' => 'Къайлдаккха',
 'show' => 'Хьахьокха',
 'minoreditletter' => 'м',
 'newpageletter' => 'Н',
 'boteditletter' => 'б',
+'rc_categories_any' => 'МоллагIа а',
 'rc-enhanced-expand' => 'Ма дарра чулоацамаш хьахьокха (JavaScriptаца)',
-'rc-enhanced-hide' => 'Ма дарра чулоацамаш къайладакха',
+'rc-enhanced-hide' => 'Ма дарра чулоацамаш къайладаккха',
 
 # Recent changes linked
-'recentchangeslinked' => 'Гаргалона хувцамаш',
-'recentchangeslinked-toolbox' => 'Гаргалона хувцамаш',
+'recentchangeslinked' => 'Гаргалон хувцамаш',
+'recentchangeslinked-feed' => 'Гаргалон хувцамаш',
+'recentchangeslinked-toolbox' => 'Гаргалон хувцамаш',
 'recentchangeslinked-title' => '$1ца хьалаьца хувцамаш',
 'recentchangeslinked-noresult' => 'Укх заманашка гаргарон оагIувнаш тIа хувцамаш хиннаяц.',
 'recentchangeslinked-summary' => "Ер, Iинк яь йола оагIув (е укх цатегачу чуйоагIараш), дукха ха йоацаш хьийца оагIувнашкий дагарче я.
@@ -663,11 +681,12 @@ $messages = array(
 'recentchangeslinked-to' => 'ОагIувнаш тIа хувцамаш хьахьокха, хьахьекха йола оагIув тIа Iинкаш еш йола.',
 
 # Upload
-'upload' => 'Паьл чуяькха',
-'uploadlogpage' => 'Чуяккхамий тептар',
+'upload' => 'Паьл чуяьккха',
+'uploadbtn' => 'Паьл чуяьккха',
+'uploadlogpage' => 'Чуяьккхамий тептар',
 'filedesc' => 'Лоаца лоацам',
 'fileuploadsummary' => 'Лоаца лоацам:',
-'uploadedimage' => '"[[$1]]" чуяккхай',
+'uploadedimage' => '"[[$1]]" чуяьккхай',
 
 'license' => 'ЦIийяздар',
 'license-header' => 'ЦIийяздар',
@@ -686,7 +705,7 @@ $messages = array(
 'file-anchor-link' => 'Паьл',
 'filehist' => 'Паьла искар',
 'filehist-help' => 'Хьалхе паьла мишта хиннай хьожаpгволаш/хьожаpгйолаш, дентаьрах/сахьата тIа пIелга тIообе.',
-'filehist-revert' => 'юхаяккха',
+'filehist-revert' => 'юхаяьккха',
 'filehist-current' => 'xIанзара',
 'filehist-datetime' => 'Дентаьрах/Ха',
 'filehist-thumb' => 'ЗIамигасуртанче',
@@ -698,11 +717,11 @@ $messages = array(
 'filehist-missing' => 'Паьла йоацаш я',
 'imagelinks' => 'Паьлий пайда эца',
 'linkstoimage' => '{{PLURAL:$1|ТIехьайоагIа $1 оагIув Iинк ду|ТIехьайоагIа $1 оагIувнаш Iинкаш ду}} укх паьла тIа:',
-'nolinkstoimage' => 'Йола паьлат  Iинк ю оагIувнаш дац',
+'nolinkstoimage' => 'Йола паьла тIа  Iинк ю оагIувнаш дац',
 'sharedupload' => 'Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.',
 'sharedupload-desc-here' => 'Ер паьл $1чара я, кхыдола хьахьоадайтамача хайрамбе йийш йолаш да.
 Цун [$2 лоацама оагIувца] лоаца маIандар кIалхагIа латта.',
-'uploadnewversion-linktext' => 'Укх паьлий керда бIаса чуяккха',
+'uploadnewversion-linktext' => 'Укх паьлий керда бIаса чуяьккха',
 
 # File reversion
 'filerevert-comment' => 'Бахьан:',
@@ -713,7 +732,7 @@ $messages = array(
 'filedelete-reason-otherlist' => 'Кхыдола бахьан',
 
 # MIME search
-'download' => 'хьачуяккха',
+'download' => 'хьачуяьккха',
 
 # Unwatched pages
 'unwatchedpages' => 'Теркамза оагIувнаш',
@@ -730,7 +749,7 @@ $messages = array(
 'brokenredirects-edit' => 'хувца',
 'brokenredirects-delete' => 'дIадаккха',
 
-'withoutinterwiki-submit' => 'Хьахокха',
+'withoutinterwiki-submit' => 'Хьахьокха',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бIат|бIаташ}}',
@@ -747,7 +766,7 @@ $messages = array(
 
 # Book sources
 'booksources' => 'Китабий гIувам',
-'booksources-search-legend' => 'Ð\9aиÑ\82аба Ð»Ð¾Ð°Ñ\86а Ð¼Ð°IандаÑ\80а Ñ\82ахкам',
+'booksources-search-legend' => 'Ð\9aиÑ\82аба Ð»Ð¾Ð°Ñ\86а Ð¼Ð°IандаÑ\80а Ñ\82охкам',
 'booksources-go' => 'Лаха',
 
 # Special:Log
@@ -777,7 +796,7 @@ $messages = array(
 'listgrouprights-members' => '(тоабий дагарче)',
 
 # E-mail user
-'emailuser' => 'Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87оа Ð´-Ñ\84оÑ\88Ñ\82:',
+'emailuser' => 'Ð\94акÑ\8aалаÑ\8cÑ\86аÑ\80Ñ\85оÑ\87оа Ð´-Ñ\85оамни:',
 
 # Watchlist
 'watchlist' => 'Теркама дагарче',
@@ -786,11 +805,11 @@ $messages = array(
 'addedwatchtext' => '"[[:$1]]" оагIув, шун [[Special:Watchlist|теркама дагаршкахь]] чуяккха я. 
 Техьара мел йола укх оагIувни хувцамаш цу дагаршкахь хоам беш хургья. Вешта [[Special:RecentChanges|керда хувцама дагаршкаехь]] сома къоалмаца хьакъоастлуш хургья.',
 'removedwatchtext' => '"[[:$1]]" оагIув, шун [[Special:Watchlist|теркама дарагчера]] дIаяккха хиннай.',
-'watch' => 'Тaхкам бе',
+'watch' => 'Тохкам бе',
 'watchthispage' => 'Укх оагIува теркам бе',
 'unwatch' => 'Лора ма де',
-'watchlist-details' => 'Шун теркама дагарченгахь йола  $1 {{PLURAL:$1|оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархаш.',
-'wlshowlast' => 'Тlехьара $1 сахьаташ $2 денош $3 хьахокха',
+'watchlist-details' => 'Шун теркама дагарченгахь йола  $1 {{PLURAL:$1|оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархIаш.',
+'wlshowlast' => 'Тlехьара $1 сахьаташ $2 денош $3 хьахьокха',
 'watchlist-options' => 'Зем баккха дагарена хувцамаш',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -798,39 +817,39 @@ $messages = array(
 'unwatching' => 'Тохкам беча оагIув тIера дIадаккха',
 
 # Delete
-'deletepage' => 'ОагIув дIаяккха',
+'deletepage' => 'ОагIув дIаяьккха',
 'confirmdeletetext' => 'Оаш оагIувни (е сурти) барча дIадаккхар хьайийхай кха еррига хувцамий искар долама ковчера. 
 Дехар да, жоп дала, шоай из бокъонцахь де безам болаш да, шоай даьчоахь хургдолчоахь кхеташ долга, [[{{MediaWiki:Policy-url}}]] декъамачу Iоязадаь дола адаташ ца из деш долга.',
-'actioncomplete' => 'Дулархам баьб',
+'actioncomplete' => 'ДулархIам баьб',
 'actionfailed' => 'Оттам даьдац',
-'deletedtext' => '"$1" дIаяккха хиннай.
+'deletedtext' => '"$1" дIаяьккха хиннай.
 ТIехьара дIадаьккха дагарчена хьожаргволаш/хьожаргьйолаш, $2 хьажа.',
-'dellogpage' => 'ДIадакхара тептар',
+'dellogpage' => 'ДIадаккхара тептар',
 'deletecomment' => 'Бахьан:',
 'deleteotherreason' => 'Кхыдола бахьан/тIатохар:',
 'deletereasonotherlist' => 'Кхыдола бахьан',
 
 # Rollback
-'rollbacklink' => 'юхаяькха',
+'rollbacklink' => 'юхаяьккха',
 
 # Protect
 'protectlogpage' => 'Лорама тептар',
 'protectedarticle' => '"[[$1]]" оагIув лорам деж я',
-'modifiedarticleprotection' => '"[[$1]]" оагIувни лорама лагIа хувцаеннай',
+'modifiedarticleprotection' => '"[[$1]]" оагIувни лорама лагIа хувцаяьннай',
 'protectcomment' => 'Бахьан:',
 'protectexpiry' => 'Кхоачалуш латта:',
-'protect_expiry_invalid' => 'Чаккхабоала лорама харца ха',
-'protect_expiry_old' => 'Чаккхайоала ха - яха зама я.',
+'protect_expiry_invalid' => 'Чакхабоала лорама харца ха',
+'protect_expiry_old' => 'Чакхайоала ха - яха зама я.',
 'protect-text' => "'''$1''' укхаз шоана шоай оагIув лорамлагIа хувца a бIаргтасса a йийш хургья.",
-'protect-locked-access' => "Шун лархама йоазуви нидза кхоачаш бац оагIувни лорама лагIа хувца. '''$1''' оагIувни дIаоттамаш:",
+'protect-locked-access' => "Шун лархIама йоазуви нидза кхоачаш бац оагIувни лорама лагIа хувца. '''$1''' оагIувни дIаоттамаш:",
 'protect-cascadeon' => '{{PLURAL:$1|КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.',
 'protect-default' => 'Лорамза',
 'protect-fallback' => '"$1" пурам эша',
 'protect-level-autoconfirmed' => 'Керда а, дакъалаьцабоацачаьрахь а лораде',
 'protect-level-sysop' => 'Мазакулгалхо мара чувала бокъо яц',
 'protect-summary-cascade' => 'хурхала',
-'protect-expiring' => 'чаккхайоала',
-'protect-cascade' => 'Укх оагIувче чуяккха оагIуваш лорае (хурхала лорам)',
+'protect-expiring' => 'чакхайоала $1 (UTC)',
+'protect-cascade' => 'Укх оагIувач чуяьккха оагIуваш лорае (хурхала лорам)',
 'protect-cantedit' => 'Шун укх оагIувни лорама лагIа хувца мегаш дац, гIалатнийсдара шун бокъо йоацандаь.',
 'restriction-type' => 'Бокъонаш:',
 'restriction-level' => 'Чувоала лагIа:',
@@ -847,7 +866,7 @@ $messages = array(
 
 # Namespace form on various pages
 'namespace' => 'ЦIерий аренаш',
-'invert' => 'Харжар юхадакха',
+'invert' => 'Хьаржар юхадаккха',
 'blanknamespace' => '(Корта)',
 
 # Contributions
@@ -856,12 +875,12 @@ $messages = array(
 'mycontris' => 'Са къахьегам',
 'contribsub2' => '$1 ($2) баь болх',
 'uctop' => '(тIехьара)',
-'month' => 'Цхьа бутт хьалхагIа (кха хьалхагIа)',
-'year' => 'Цхьа шу хьалхагIа (кха хьалхагIа):',
+'month' => 'Цхьа бутт хьалхагIа (кхы хьалхагIа)',
+'year' => 'Цхьа шу хьалхагIа (кхы хьалхагIа):',
 
-'sp-contributions-newbies' => 'Керда даязья йоазоначера мара баь бола къахьегам ма хокха',
+'sp-contributions-newbies' => 'Керда даязья йоазоначера мара баь бола къахьегам ма хьокха',
 'sp-contributions-blocklog' => 'чIегаш',
-'sp-contributions-uploads' => 'чуяккхамаш',
+'sp-contributions-uploads' => 'чуяьккхамаш',
 'sp-contributions-logs' => 'тептараш',
 'sp-contributions-talk' => 'дувцам',
 'sp-contributions-search' => 'Къахьегама лахар',
@@ -876,13 +895,13 @@ $messages = array(
 'linkshere' => "ТIехьара оагIувнаш '''[[:$1]]''' тIа Iинкаш ю:",
 'nolinkshere' => "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
 'isredirect' => 'дIа-хьа оагIув',
-'istemplate' => 'чудакхар',
+'istemplate' => 'чудаккхар',
 'isimage' => 'паьла Iинк',
 'whatlinkshere-prev' => '{{PLURAL:$1|хьалхайоагIа|хьалхайоагIараш}} $1',
 'whatlinkshere-next' => '{{PLURAL:$1|тIехьайоагIа|тIехьайоагIараш}} $1',
 'whatlinkshere-links' => '← Iинкаш',
-'whatlinkshere-hideredirs' => '$1 дIа-хьа чуяькхамаш',
-'whatlinkshere-hidetrans' => '$1 чуяькхамаш',
+'whatlinkshere-hideredirs' => '$1 дIа-хьа чуяьккхамаш',
+'whatlinkshere-hidetrans' => '$1 чуяьккхамаш',
 'whatlinkshere-hidelinks' => '$1 Iинкаш',
 'whatlinkshere-hideimages' => '$1 суртIинкаш',
 'whatlinkshere-filters' => 'ЦIенъераш',
@@ -898,7 +917,7 @@ $messages = array(
 'blocklogpage' => 'ЧIегаш тoха таптар',
 'blocklogentry' => '[[$1]] чIега белаб,  $2 $3 ха ялалца',
 'unblocklogentry' => '$1 юха яста я',
-'block-log-flags-nocreate' => 'Лархамий дагарчена цIи яккхар пурам янза я.',
+'block-log-flags-nocreate' => 'ЛархIамий дагарчена цIи яьккхар пурам янза я.',
 'blockme' => 'ЧIега бола сона',
 'proxyblocksuccess' => 'Хьадаьд.',
 
@@ -946,7 +965,7 @@ $messages = array(
 'allmessagesdefault' => 'Сатийна улла яздам',
 'allmessages-filter-all' => 'Дерригаш',
 'allmessages-language' => 'Мотт:',
-'allmessages-filter-submit' => 'Дехьавала',
+'allmessages-filter-submit' => 'Дехьавала/яла',
 
 # Thumbnails
 'thumbnail-more' => 'Хьадоккхаде',
@@ -961,10 +980,10 @@ $messages = array(
 'tooltip-pt-preferences' => ' Шун оттамаш',
 'tooltip-pt-watchlist' => 'Оаш хувцамаш тIа бIарглакха оагIувнаша дагарче',
 'tooltip-pt-mycontris' => 'Шун хувцамаш',
-'tooltip-pt-login' => 'Укхаза хьай цIи аьле чувала/чуяла йийша я, амма чуцаваьлача/чуцаялача хIамма а дац',
+'tooltip-pt-login' => 'Укхаза хьай цIи аьле чувала/чуяла йиша я, амма чуцаваьлача/чуцаялача хIама а дац',
 'tooltip-pt-logout' => 'Аравала/яла',
 'tooltip-ca-talk' => 'ОагIува чулоацамий дувцам',
-'tooltip-ca-edit' => 'Ер оагIув хувца йийшйолаш я. Дехар да, Iалаш елаьх, хьалхе бIаргтассама оагIув тIа бIаргтасса.',
+'tooltip-ca-edit' => 'Ер оагIув хувца йишйолаш я. Дехар да, Iалаш елаьх, хьалхе бIаргтассама оагIув тIа бIаргтасса.',
 'tooltip-ca-addsection' => 'Керда декъам хьаде',
 'tooltip-ca-viewsource' => 'Ер оагIув хувцамах лораяь я, амма шун цунна гIувамага хьажа бокъо я.',
 'tooltip-ca-history' => 'Укх оагIувни хувцама таптар',
@@ -979,7 +998,7 @@ $messages = array(
 'tooltip-p-logo' => 'Кертера оагIув тIа дехьавала',
 'tooltip-n-mainpage' => 'Кертера оагIув тIа дехьавала',
 'tooltip-n-mainpage-description' => 'Кертера оагIув тIа дехьавала',
-'tooltip-n-portal' => 'Хьахьоадайтамахь лаьца, хьа де йийшдар, фа а мичча а йоала',
+'tooltip-n-portal' => 'Хьахьоадайтамахь лаьца, хьа де йишдар, фу а мичча а йоала',
 'tooltip-n-currentevents' => 'ХIанзара хоамий дагарче',
 'tooltip-n-recentchanges' => 'ТӀехьара хувцамий дагарче',
 'tooltip-n-randompage' => 'Бе йоаца оагӀув ела',
@@ -990,7 +1009,7 @@ $messages = array(
 'tooltip-feed-atom' => 'Укх оаг|увна Atomчу гойтар',
 'tooltip-t-contributions' => 'Укх дакъалаьцархочу хьийца йола оагIувнаш хьахьокха',
 'tooltip-t-emailuser' => 'Укх дакъалаьцархочоа зIы яхьийта',
-'tooltip-t-upload' => 'Паьлаш чуяькха',
+'tooltip-t-upload' => 'Паьлаш чуяьккха',
 'tooltip-t-specialpages' => 'ГIулакха оагIувний дагарчe',
 'tooltip-t-print' => 'Укх зарба оаугIувни дагарче',
 'tooltip-t-permalink' => 'Укх оагIув доржама даим латта Iинк',
@@ -1007,8 +1026,8 @@ $messages = array(
 'tooltip-diff' => 'Яздам тIа яь йола хувцамаш хьахьокха',
 'tooltip-compareselectedversions' => 'Укх оагIувни шин доржамаш тIа юкъера хувцамаш зе.',
 'tooltip-watch' => 'Ер оагIув теркам беча каьхата тIа яькха',
-'tooltip-rollback' => 'Ð\93IалaÑ\82нийÑ\81адаÑ\80о Ñ\82IеÑ\85Ñ\8cаÑ\80а Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88, Ð¿Iелг Ñ\82оIоби Ð´IаÑ\8fÑ\8cкха.',
-'tooltip-undo' => 'Яь хувцам дIаяькхe, бIаргатассар хьахьокха, кара дале, дIаяькха бахьан Iочуязаде моттигаца.',
+'tooltip-rollback' => 'Ð\93IалaÑ\82нийÑ\81адаÑ\80о Ñ\82IеÑ\85Ñ\8cаÑ\80а Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88, Ð¿Iелг Ñ\82оIобе Ð´IаÑ\8fÑ\8cккха.',
+'tooltip-undo' => 'Яь хувцам дIаяьккхe, бIаргатассар хьахьокха, кара дале, дIаяьккха бахьан Iочуязаде моттигаца.',
 'tooltip-summary' => 'Лоаца чулоацам Iочуязаде',
 
 # Browsing diffs
@@ -1028,14 +1047,14 @@ $messages = array(
 # Bad image list
 'bad_image_list' => 'Бустам цу тайпара хила беза:
 
-Дагарена хьаракъаш мара лоархаш хургьяц (укх тамагIалгацa * дувлашду мугIараш).
-МугIарена хьалхара Iинк, сурт Iоттае пурам доаца Iинка, хила еза. 
-Цу мугIар тIа тIехьайоагIа Iинкаш, арадаккхар мо лоархаш хургья, вешта аьлча, йоазувашка чуIоттаде мегаш дола сурт санна ларха мега.',
+Дагарен хьаракъаш мара лоарх|аш хургьяц (укх тамагIалгацa * дувлашду мугIараш).
+МугIарен хьалхара Iинк, сурт Iоттае пурам доаца Iинка, хила еза. 
+Цу мугIар тIа тIехьайоагIа Iинкаш, арадаккхар мо лоарх|аш хургья, вешта аьлча, йоазувашка чуIоттаде мегаш дола сурт санна ларх|а мега.',
 
 # Metadata
 'metadata' => 'МетахIамаш',
 'metadata-help' => 'Паьлас чулоаца, кхыдола хIамаш, таьрахьа суртдоакхаргца е тIагIолладоакхаргца чудакхаш дола. Хьаяь паьл, гIалатахь мукъадаькха хинна дале, хьахьокхаш дола сурт, деррига хIамаш чулоацаргдац.',
-'metadata-expand' => 'Кхыдола хIамаш хьахокха',
+'metadata-expand' => 'Кхыдола хIамаш хьахьокха',
 'metadata-collapse' => 'Кхыдола хIамаш къайладаккха',
 'metadata-fields' => 'Укх дагарченгахь дагaрадаь метахIамаша суртий мугIаш, сурт оагIув тIа хьахьекха хургья, чуерзaяь метахIамашийца. Вож мугIанаш ха йоалаш къайла хургья.
 * make
@@ -1055,11 +1074,11 @@ $messages = array(
 # EXIF tags
 'exif-imagewidth' => 'Шерал',
 'exif-imagelength' => 'Лакхал',
-'exif-imagedescription' => 'СÑ\83Ñ\80Ñ\82и цIи',
+'exif-imagedescription' => 'СÑ\83Ñ\80Ñ\82а цIи',
 'exif-artist' => 'Яздархо',
 'exif-colorspace' => 'Басара аре',
-'exif-pixelydimension' => 'СÑ\83Ñ\80Ñ\82и шерал',
-'exif-pixelxdimension' => 'СÑ\83Ñ\80Ñ\82и лакхал',
+'exif-pixelydimension' => 'СÑ\83Ñ\80Ñ\82а шерал',
+'exif-pixelxdimension' => 'СÑ\83Ñ\80Ñ\82а лакхал',
 'exif-writer' => 'Яздама да',
 'exif-languagecode' => 'Мотт',
 'exif-iimcategory' => 'Цатег',
@@ -1068,18 +1087,18 @@ $messages = array(
 'exif-scenecapturetype-2' => 'Сурт',
 
 'exif-iimcategory-edu' => 'Дешар',
-'exif-iimcategory-evn' => 'Арена буне',
+'exif-iimcategory-evn' => 'Арен буне',
 'exif-iimcategory-hth' => 'Могар',
 'exif-iimcategory-hum' => 'Адамий искараш',
-'exif-iimcategory-rel' => 'Ð\94инеи Ñ\82еÑ\88аÑ\80еи',
-'exif-iimcategory-sci' => 'Iилмеи ÐºÑ\83лгболÑ\85еи',
+'exif-iimcategory-rel' => 'Ð\94ини Ñ\82еÑ\88аÑ\80и',
+'exif-iimcategory-sci' => 'Iилмаи ÐºÑ\83лгболÑ\85и',
 'exif-iimcategory-soi' => 'Сагий хаттараш',
 'exif-iimcategory-spo' => 'Нидзоамал',
-'exif-iimcategory-war' => 'ТIомаÑ\88, ÐºÑ\85овÑ\81амаÑ\88еи Ð»Ð°Ñ\82Ñ\82аÑ\80аÑ\88еи',
+'exif-iimcategory-war' => 'ТIемаÑ\88, ÐºÑ\85овÑ\81амаÑ\88и Ð»Ð°Ñ\82Ñ\82аÑ\80аÑ\88и',
 'exif-iimcategory-wea' => 'Хаоттам',
 
 # External editor support
-'edit-externally' => 'Йола болхоагIувца паьла гIалатахь мукъаяькха',
+'edit-externally' => 'Йола болхоагIувца паьла гIалатах мукъаяьккха',
 'edit-externally-help' => '(ма даррачунга хьажа [//www.mediawiki.org/wiki/Manual:External_editors хьаоттама кулгалхо])',
 
 # 'all' in various places, this might be different for inflected languages
@@ -1092,7 +1111,7 @@ $messages = array(
 'confirm_purge_button' => 'ХIаа',
 
 # Multipage image navigation
-'imgmultigo' => 'Дехьавала!',
+'imgmultigo' => 'Дехьавала/яла!',
 'imgmultigoto' => '$1 оагIув тIа дехьавала',
 
 # Table pager
@@ -1115,7 +1134,7 @@ $messages = array(
 # Special:FilePath
 'filepath' => 'Паьлачу никъ',
 'filepath-page' => 'Паьл:',
-'filepath-submit' => 'Дехьавала',
+'filepath-submit' => 'Дехьавала/яла',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'ПаьлацIи:',
@@ -1153,11 +1172,11 @@ $messages = array(
 'compare-rev2' => '2. Доржам',
 
 # Database error messages
-'dberr-header' => 'УкÑ\85 Ð²Ð¸ÐºÐ¸Ñ\81 халонаш ловш латта',
+'dberr-header' => 'УкÑ\85 Ð¼Ð°Ñ\81Ñ\81ано халонаш ловш латта',
 
 # HTML forms
-'htmlform-submit' => 'ДIадахийта',
-'htmlform-reset' => 'Хувцамаш юхадакха',
+'htmlform-submit' => 'ДIадахьийта',
+'htmlform-reset' => 'Хувцамаш юхадаккха',
 'htmlform-selectorother-other' => 'Кхыдола',
 
 );
index b5eef99..fcb4db1 100644 (file)
@@ -256,7 +256,7 @@ $messages = array(
 'tog-nocache' => 'Slökkva á flýtiminni vafrans',
 'tog-enotifwatchlistpages' => 'Senda mér tölvupóst þegar síðu eða skrá á vaktlistanum mínu er breytt',
 'tog-enotifusertalkpages' => 'Senda mér tölvupóst þegar notandaspjallinu mínu er breytt',
-'tog-enotifminoredits' => 'Senda mér einnig tölvupóst vegna minniháttar breytinga á síðum',
+'tog-enotifminoredits' => 'Senda mér einnig tölvupóst vegna minniháttar breytinga á síðum og skrám',
 'tog-enotifrevealaddr' => 'Gefa upp netfang mitt í tilkynningarpóstum',
 'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
 'tog-oldsig' => 'Núverandi undirskrift:',
@@ -496,6 +496,10 @@ Sjá [[Special:Version|útgáfusíðuna]].',
 'youhavenewmessages' => 'Þú hefur fengið $1 ($2).',
 'newmessageslink' => 'ný skilaboð',
 'newmessagesdifflink' => 'síðasta breyting',
+'youhavenewmessagesfromusers' => 'Þú hefur $1 frá {{PLURAL:$3|öðrum notanda|$3 notendum}} ($2)',
+'youhavenewmessagesmanyusers' => 'Þú hefur $1 frá mörgum notendum ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ein|}} ný skilaboð',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|síðasta breyting|síðustu breytingar}} spjallsíðunnar',
 'youhavenewmessagesmulti' => 'Þín bíða ný skilaboð á $1',
 'editsection' => 'breyta',
 'editold' => 'breyta',
@@ -548,9 +552,9 @@ Sjá [[Special:Version|útgáfusíðuna]].',
 'dberrortext' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
 Þetta gæti verið vegna villu í hugbúnaðinum.
 Síðasta gagnagrunnsfyrirspurnin var:
-<blockquote><tt>$1</tt></blockquote>
-úr aðgerðinni: „<tt>$2</tt>“.
-MySQL skilar villuboðanum „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+úr aðgerðinni: „<code>$2</code>".
+MySQL skilar villuboðunum „<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
 Síðasta gagnagrunnsfyrirspurnin var:
 „$1“
@@ -603,10 +607,11 @@ Spurn: $2',
 'protectedpagetext' => 'Þessari síðu hefur verið læst til að koma í veg fyrir breytingar.',
 'viewsourcetext' => 'Þú getur skoðað og afritað kóða þessarar síðu:',
 'viewyourtext' => "Þú getur skoðað og afritað kóða '''breytinganna þinna''' yfir á þessa síðu:",
-'protectedinterface' => 'Þessi síða útvegar textann sem birtist í viðmóti hugbúnaðarins, og er læst til að koma í veg fyrir misnotkun.',
+'protectedinterface' => 'Þessi síða útvegar textann sem birtist í viðmóti hugbúnaðarins sem keyrir þessa síðu, og er læst til að koma í veg fyrir misnotkun.
+Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/ translatewiki.net], staðfæringaverkefni MediaWiki',
 'editinginterface' => "'''Aðvörun:''' Þú ert að breyta síðu sem hefur að geyma texta fyrir notendaumhverfi hugbúnaðarins.
-Breytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda.
-Fyrir þýðingar, gjörðu svo vel að nota [//translatewiki.net/wiki/Main_Page?setlang=is translatewiki.net], staðfæringverkefni MediaWiki.",
+Breytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda á þessu vefsvæði.
+Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/wiki/Main_Page?setlang=is translatewiki.net], staðfæringaverkefni MediaWiki.",
 'sqlhidden' => '(SQL-fyrirspurn falin)',
 'cascadeprotected' => 'Þessi síða hefur verið vernduð fyrir breytingum, vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er vernduð|síðum, sem eru verndaðar}} með „keðjuverndun“:
 $2',
@@ -891,6 +896,9 @@ Ef þú ert óþekktur notandi og finnst að óviðkomandi athugasemdum hafa ver
 'noarticletext-nopermission' => 'Enginn texti er á þessari síðu enn sem komið er.
 Þú getur [[Special:Search/{{PAGENAME}}|leitað í öðrum síðum]],
 eða <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} leitað í tengdum skrám]</span>.',
+'missing-revision' => 'Útgáfa #$1 síðunnar „{{PAGENAME}}" er ekki til.
+
+Þetta gerist oftast þegar úreld breytingarskrá tengir á síðu sem hefur verið eytt. Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].',
 'userpage-userdoesnotexist' => 'Notandaaðgangurinn „<nowiki>$1</nowiki>“ er ekki skráður.
 Gjörðu svo vel og athugaðu hvort að þú viljir skapa/breyta þessari síðu.',
 'userpage-userdoesnotexist-view' => 'Notandinn "$1" er ekki skráður.',
@@ -2888,14 +2896,15 @@ Vinsamlegast reyndu aftur.',
 'spambot_username' => 'MediaWiki amapósts hreinsun',
 'spam_reverting' => 'Tek aftur síðustu breytingu sem inniheldur ekki tengil á $1',
 'spam_blanking' => 'Allar útgáfur innihéldu tengla á $1, tæmi síðuna',
+'spam_deleting' => 'Allar útgáfur innihéldu tengla á $1, eyði síðunni',
 
 # Info page
 'pageinfo-title' => 'Upplýsingar um $1',
-'pageinfo-header-edits' => 'Breytingar',
+'pageinfo-header-edits' => 'Breytingarskrá',
 'pageinfo-views' => 'Fjöldi innlita',
-'pageinfo-watchers' => 'Fjöldi notenda',
-'pageinfo-edits' => 'Fjöldi breytinga',
-'pageinfo-authors' => 'Fjöldi einstakra höfunda',
+'pageinfo-watchers' => 'Fjöldi notenda, sem vakta síðuna',
+'pageinfo-edits' => 'Heildarfjöldi breytinga',
+'pageinfo-authors' => 'Heildarfjöldi einstakra höfunda',
 
 # Skin names
 'skinname-standard' => 'Sígilt',
@@ -3512,6 +3521,7 @@ MediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÁN ALLRAR ÁBYR
 'version-software' => 'Uppsettur hugbúnaður',
 'version-software-product' => 'Vara',
 'version-software-version' => 'Útgáfa',
+'version-entrypoints-header-url' => 'vefslóð',
 
 # Special:FilePath
 'filepath' => 'Slóð skráar',
@@ -3674,10 +3684,11 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-emptypage' => 'Stofnun nýrra, tómra síðna er óheimil.',
 'api-error-fetchfileerror' => 'Innri villa: Mistókst að sækja skránna.',
 'api-error-fileexists-forbidden' => 'Skrá með nafninu "$1" er þegar til og ekki er hægt að yfirskrifa hana.',
+'api-error-fileexists-shared-forbidden' => 'Skrá með nafninu "$1" er þegar til á miðlæga gagnaþjóninum og ekki er hægt að yfirskrifa hana.',
 'api-error-file-too-large' => 'Skráin sem þú valdir er of stór.',
 'api-error-filename-tooshort' => 'Skráarnafnið er of stutt',
 'api-error-filetype-banned' => 'Þessi gerð skráar er bönnuð.',
-'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|er ekki leifileg skráargerð|eru ekki leifilegar skráargerðir}}. {{PLURAL:$3|Leyfileg skráargerð er|Leyfilegar skráargerðir eru}} $2.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|er óleyfileg skráargerð|eru óleyfilegar skráargerðir}}. {{PLURAL:$3|Leyfð skráargerð er|Leyfðar skráargerðir eru}} $2.',
 'api-error-filetype-missing' => 'Skráin hefur enga skráarendingu.',
 'api-error-hookaborted' => 'Hætt var við breytinguna sem þú reyndir að gera með viðbót.',
 'api-error-http' => 'Innri villa: Get ekki tengst vefþjón.',
index a7b899c..e485f08 100644 (file)
@@ -646,8 +646,8 @@ Query: $2',
 'viewsourcetext' => 'È possibile visualizzare e copiare il codice sorgente di questa pagina:',
 'viewyourtext' => "È possibile visualizzare e copiare il codice sorgente delle '''tue modifiche''' a questa pagina:",
 'protectedinterface' => "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software; è quindi protetta per evitare possibili abusi.",
-'editinginterface' => "'''Attenzione:''' Il testo di questa pagina fa parte dell'interfaccia utente del sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti.
-Per le traduzioni, considera la possibilità di usare [//translatewiki.net/wiki/Main_Page?setlang=it translatewiki.net], il progetto MediaWiki per la localizzazione.",
+'editinginterface' => "'''Attenzione:''' Il testo di questa pagina fa parte dell'interfaccia utente del sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.
+Per aggiungere o modificare le traduzioni valide su tutti i wiki, considera la possibilità di usare [//translatewiki.net/wiki/Main_Page?setlang=it translatewiki.net], il progetto MediaWiki per la localizzazione.",
 'sqlhidden' => '(la query SQL è stata nascosta)',
 'cascadeprotected' => 'Su questa pagina non è possibile effettuare modifiche perché è stata inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione "ricorsiva":
 $2',
@@ -1776,7 +1776,7 @@ $1',
 'backend-fail-internal' => 'Si è verificato un errore sconosciuto nel backend di memoria "$1".',
 'backend-fail-contenttype' => 'Impossibile determinare la tipologia del file da archiviare in "$1".',
 'backend-fail-batchsize' => 'Il backend di memoria ha programmato una serie di $1 {{PLURAL:$1|operazione|operazioni}} su file; il limite è di $2 {{PLURAL:$2|operazione|operazioni}}.',
-'backend-fail-usable' => 'Impossibile scrivere il file $1 a causa di autorizzazione insufficienti o directory/recipienti mancanti.',
+'backend-fail-usable' => 'Impossibile leggere o scrivere il file "$1" a causa di autorizzazione insufficienti o directory/contenitori mancanti.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Impossibile connettersi al database journal per l\'archiviazione back-end "$1".',
index fcdaec2..a6622fb 100644 (file)
@@ -1429,9 +1429,9 @@ $1",
 'searcheverything-enable' => 'すべての名前空間を検索',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
-'showingresults' => "'''$2'''件目以降の{{PLURAL:$1|'''$1'''件の結果}}を表示しています。",
-'showingresultsnum' => "'''$2'''件目以降の{{PLURAL:$3|'''$3'''件の結果}}を表示しています。",
-'showingresultsheader' => "ã\80\8c'''$4'''ã\80\8dã\81«å¯¾ã\81\99ã\82\8b{{PLURAL:$5|'''$3'''件中ã\81®'''$1'''件ã\81®çµ\90æ\9e\9c|'''$3'''件中ã\81®'''$1'''件ç\9b®ã\81\8bã\82\89'''$2'''件ç\9b®ã\81®çµ\90æ\9e\9c}}",
+'showingresults' => "'''$2''' 件目以降の {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
+'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
+'showingresultsheader' => "ã\80\8c'''$4'''ã\80\8dã\81®æ¤\9cç´¢çµ\90æ\9e\9c {{PLURAL:$5|'''$3''' ä»¶ä¸­ã\81® '''$1''' ä»¶ç\9b®|'''$3''' ä»¶ä¸­ã\81® '''$1''' ä»¶ç\9b®ã\81\8bã\82\89 '''$2''' ä»¶ç\9b®}}",
 'nonefound' => "'''注意''':既定では一部の名前空間のみを検索します。
 ''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
@@ -1508,7 +1508,7 @@ $1",
 'localtime' => 'ローカルの時刻:',
 'timezoneuseserverdefault' => 'ウィキの既定を使用 ($1)',
 'timezoneuseoffset' => 'その他(時差を指定)',
-'timezoneoffset' => '時差¹',
+'timezoneoffset' => '時差¹:',
 'servertime' => 'サーバーの時刻:',
 'guesstimezone' => 'ブラウザーの設定から入力',
 'timezoneregion-africa' => 'アフリカ',
@@ -1963,6 +1963,7 @@ $1',
 'backend-fail-internal' => 'ストレージバックエンド「$1」内で不明なエラーが発生しました。',
 'backend-fail-contenttype' => '「$1」に保存するコンテンツの種類が判断できませんでした。',
 'backend-fail-batchsize' => 'ストレージバックエンドは $1 件のファイル{{PLURAL:$1|操作}}のバッチを与えられました; 上限は $2 件の{{PLURAL:$2|操作}}です。',
+'backend-fail-usable' => '権限が不足している、またはディレクトリ/コンテナーがないため、ファイル「$1」の読み取り/書き込みができません。',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'ストレージバックエンド「$1」のジャーナルデータベースに接続できません。',
@@ -2038,7 +2039,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'license' => 'ライセンス:',
 'license-header' => 'ライセンス',
 'nolicense' => '選択なし',
-'license-nopreview' => '(プレビューはありません)',
+'license-nopreview' => '(プレビューはありません)',
 'upload_source_url' => '(有効かつ一般に公開されているURL)',
 'upload_source_file' => '(あなたのコンピューター上のファイル)',
 
@@ -2215,7 +2216,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'nviews' => '$1回の閲覧',
 'nimagelinks' => '$1ページで使用',
 'ntransclusions' => '$1ページで使用',
-'specialpage-empty' => '合致するものがありません。',
+'specialpage-empty' => '該当するものはありません。',
 'lonelypages' => '孤立しているページ',
 'lonelypagestext' => '以下のページは、{{SITENAME}}の他のページからリンクも参照読み込みもされていません。',
 'uncategorizedpages' => 'カテゴリ分類されていないページ',
@@ -2285,7 +2286,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
-'speciallogtitlelabel' => '対象(ページまたは利用者):',
+'speciallogtitlelabel' => '対象 (ページまたは利用者):',
 'log' => '記録',
 'all-logs-page' => 'すべての公開記録',
 'alllogstext' => '{{SITENAME}}の取得できる記録をまとめて表示しています。
@@ -3159,8 +3160,8 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'tooltip-ca-nstab-category' => 'カテゴリページを閲覧',
 'tooltip-minoredit' => 'この編集に細部の変更の印を付ける',
 'tooltip-save' => '変更を保存する',
-'tooltip-preview' => '変更をプレビューで確認できます。保存前に使用してください!',
-'tooltip-diff' => '文章中で変更した箇所を表示する',
+'tooltip-preview' => '変更内容をプレビューで確認できます。保存前に使用してください!',
+'tooltip-diff' => '文章への変更箇所を表示する',
 'tooltip-compareselectedversions' => '選択した2つの版の差分を表示する',
 'tooltip-watch' => 'このページをウォッチリストに追加する',
 'tooltip-watchlistedit-normal-submit' => 'ページを除去する',
@@ -4198,9 +4199,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-select-badoption' => '指定した値は有効な選択肢ではありません。',
 'htmlform-int-invalid' => '指定した値は整数ではありません。',
 'htmlform-float-invalid' => '指定した値は数値ではありません。',
-'htmlform-int-toolow' => '指定した値は$1の最小値未満です',
-'htmlform-int-toohigh' => '指定した値は$1の最大値を超えています',
-'htmlform-required' => 'この値は必です',
+'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です',
+'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています',
+'htmlform-required' => 'この値は必です',
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
@@ -4233,8 +4234,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 'logentry-move-move-noredirect' => '$1 がページ「$3」を「$4」に、リダイレクトを残さずに移動しました',
 'logentry-move-move_redir' => '$1 がページ「$3」をリダイレクトの「$4」に移動しました',
 'logentry-move-move_redir-noredirect' => '$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに移動しました',
-'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 をパトロール済みとしました',
-'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 をパトロール済みとしました',
+'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 を巡回済みとしました',
+'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 を巡回済みとしました',
 'logentry-newusers-newusers' => '$1 が利用者アカウントを作成しました',
 'logentry-newusers-create' => '$1 が利用者アカウントを作成しました',
 'logentry-newusers-create2' => '$1 が利用者アカウント $3 を作成しました',
index d70c2a7..8d08a14 100644 (file)
@@ -974,6 +974,7 @@ $2
 'expansion-depth-exceeded-warning' => 'გვერდზე გადამეტებულია ჩადგმების ზღვარი',
 'parser-unstrip-loop-warning' => 'აღმოჩენილია ციკლური ბმული',
 'parser-unstrip-recursion-limit' => 'გადამეტებულია რეკურსიის ზღვარი ($1)',
+'converter-manual-rule-error' => 'შეცდომა ენის ხელით გარდაქმნის წესში',
 
 # "Undo" feature
 'undo-success' => 'რედაქტირების გაუქმება შესაძლებელია. გთხოვთ შეამოწმოთ განსხვავება ქვევით, რათა დარწმუნდეთ, რომ ეს ის არის რაც თქვენ გსურთ, შემდეგ კი შეინახეთ ცვლილებები რათა დაასრულოთ რედაქტირების გაუქმება.',
@@ -1110,8 +1111,8 @@ $1",
 'revdelete-reason-dropdown' => '*წაშლის გავრცელებული მიზეზები
 ** საავტორო უფლებების დარღვევა
 ** მიუღებელი პირადი ინფორმაცია
-** á\83\9eá\83\9dá\83¢á\83\94á\83\9cá\83ªá\83\98á\83£á\83 á\83\90á\83\93 á\83¦á\83\98á\83 á\83¡á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9bá\83\9aá\83\90á\83®á\83\95á\83\94á\83\9aá\83\98 á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\90
-** á\83£á\83ªá\83\94á\83\9cá\83\96á\83£á\83 á\83\9d á\83¡á\83\98á\83¢á\83§á\83\95á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9bá\83ªá\83\95á\83\94á\83\9aá\83\98 á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98',
+** á\83\9bá\83\98á\83£á\83¦á\83\94á\83\91á\83\94á\83\9aá\83\98 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98
+** á\83\9eá\83\9dá\83¢á\83\94á\83\9cá\83ªá\83\98á\83£á\83 á\83\90á\83\93 á\83¦á\83\98á\83 á\83¡á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9bá\83\9aá\83\90á\83®á\83\95á\83\94á\83\9aá\83\98 á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\90',
 'revdelete-otherreason' => 'სხვა/დამატებითი მიზეზი:',
 'revdelete-reasonotherlist' => 'სხვა მიზეზი',
 'revdelete-edit-reasonlist' => 'წაშლის მიზეზების რედაქტირება',
@@ -1716,7 +1717,7 @@ $1',
 'backend-fail-internal' => '"$1" საცავში მოხდა დაუდგენელი შეცდომა.',
 'backend-fail-contenttype' => 'ფაილის შემადგენლობის ტიპის დადგენა ვერ მოხერხდა, "$1"-ში შესანახად.',
 'backend-fail-batchsize' => 'საცავმა მიიღო {{PLURAL:$1|ფაილის ოპერაციის|ფაილების ოპერაციების}} ბლოკი $1-დან, შეზღუდვა შეადგენს $2 {{PLURAL:$1|ოპერაციას}}.',
-'backend-fail-usable' => 'Не удалось записать файлფაილი $1 ჩაწერა ვერ მოხერხდა უფლებების უკმარისობის ან საჭირო საქაღალდეების არქონის გამო.',
+'backend-fail-usable' => 'ფაილი $1 წაკითხვა ან ჩაწერა ვერ მოხერხდა უფლებების უკმარისობის ან საჭირო საქაღალდეების არქონის გამო.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'ჟურნალის მონაცემთა ბაზებთან დაკავშირება "$1" მონაცემთა შესანახად ვერ მოხერხდა.',
@@ -2013,7 +2014,7 @@ $1',
 'usercreated' => '{{GENDER:$3|შექმნილია}} $2-ზე $1-ში',
 'newpages' => 'ახალი გვერდები',
 'newpages-username' => 'მომხმარებლის სახელი:',
-'ancientpages' => 'á\83®á\83\90á\83\9cá\83\93á\83\90á\83\96á\83\9bá\83£á\83\9aი გვერდები',
+'ancientpages' => 'á\83£á\83«á\83\95á\83\94á\83\9aá\83\94á\83¡ი გვერდები',
 'move' => 'გადატანა',
 'movethispage' => 'ამ გვერდის გადატანა',
 'unusedimagestext' => 'ეს ფაილი არ გამოიყენება არც-ერთ გვერდზე.
@@ -2025,7 +2026,7 @@ $1',
 'nopagetitle' => 'ამგვარი სამიზნე გვერდი არ არსებობს',
 'nopagetext' => 'მოცემული სამიზნო გვერდი არ არის მიითებული.',
 'pager-newer-n' => '{{PLURAL:$1|უახლესი 1|უახლესი $1}}',
-'pager-older-n' => '{{PLURAL:$1|á\83®á\83\90á\83\9cá\83\93á\83\90á\83\96á\83\9bá\83£á\83\9aá\83\98 1|á\83®á\83\90á\83\9cá\83\93á\83\90á\83\96á\83\9bá\83£ლი $1}}',
+'pager-older-n' => '{{PLURAL:$1|á\83£á\83¤á\83 á\83\9d á\83«á\83\95á\83\94á\83\9aá\83\98 1|á\83£á\83¤á\83 á\83\9d á\83«á\83\95á\83\94ლი $1}}',
 'suppress' => 'დამალვა',
 'querypage-disabled' => 'ეს სპეცგვერდი გამორთულია წარმადობის გასაზრდელად.',
 
@@ -2311,7 +2312,7 @@ $UNWATCHURL
 'protectlogpage' => 'დაცვის ისტორია',
 'protectlogtext' => 'ქვემოთ წარმოდგენილია გვერდის დაცვის დონის ცვლილებების სია. 
 იხილეთ ასევე [[Special:ProtectedPages|დაცული გვერდების სია]] ამ მომენტისთვის.',
-'protectedarticle' => 'დაცულია „[[$1]]“',
+'protectedarticle' => 'დაცულია გვერდი: „[[$1]]“',
 'modifiedarticleprotection' => 'შეცვლილია დაცვის დონე გვერდისთვის „[[$1]]“',
 'unprotectedarticle' => '„[[$1]]“-დან დაცვა მოხსნილია',
 'movedarticleprotection' => 'დაცვის პარამეტრების გადატანა გვერდიდან „[[$2]]“ გვერდზე „[[$1]]“',
@@ -2351,9 +2352,9 @@ $UNWATCHURL
 'protect-otherreason-op' => 'სხვა/დამატებითი მიზეზი',
 'protect-dropdown' => '* დაცვის ტიპიური მიზეზები
 ** გადაჭარბებული ვანდალიზმი
-** სპამი
+** á\83\92á\83\90á\83\93á\83\90á\83­á\83\90á\83 á\83\91á\83\94á\83\91á\83£á\83\9aá\83\98 á\83¡á\83\9eá\83\90á\83\9bá\83\98
 ** რედაქტირებათა ომი
-** á\83\9eá\83\9dá\83\9eá\83£á\83\9aá\83\90á\83 á\83£á\83\9aá\83\98 გვერდი',
+** á\83\9bá\83\90á\83¦á\83\90á\83\9aá\83\98 á\83 á\83\98á\83¡á\83\99á\83\98á\83¡ გვერდი',
 'protect-edit-reasonlist' => 'დაცვის მიზეზთა რედაქტირება',
 'protect-expiry-options' => '1 საათი:1 hour,1 დღე:1 day,1 კვირა:1 week,2 კვირა:2 weeks,1 თვე:1 month,3 თვე:3 months,6 თვე:6 months,1 წელი:1 year,განუსაზღვრელი ვადით:infinite',
 'restriction-type' => 'უფლება',
@@ -2952,17 +2953,22 @@ $1',
 'pageinfo-length' => 'გვერდის სიგრძე (ბაიტებში)',
 'pageinfo-article-id' => 'გვერდის ID',
 'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი',
+'pageinfo-robot-index' => 'ინდექსირდება',
+'pageinfo-robot-noindex' => 'არ ინდექსირდება',
 'pageinfo-views' => 'ხილვების რაოდენობა',
 'pageinfo-watchers' => 'გვერდის დამკვირვებელთა რაოდენობა',
 'pageinfo-redirects-name' => 'გადამისამართება ამ გვერდზე',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'ამ გვერდის ქვეგვერდები',
+'pageinfo-subpages-value' => '$1($2 {{PLURAL:$2|გადამისამართება|გადამისამართება}}; $3 {{PLURAL:$3|ჩვეულებრივი|ჩვეულებრივი}})',
 'pageinfo-firstuser' => 'გვერდის შემქნელი',
 'pageinfo-firsttime' => 'გვერდის შექმნის თარიღი',
 'pageinfo-lastuser' => 'ბოლო რედაქტორი',
 'pageinfo-lasttime' => 'ბოლო რედაქტირების თარიღი',
 'pageinfo-edits' => 'რედაქტირებების ჯამური რაოდენობა',
 'pageinfo-authors' => 'განსხვავებულ ავტორთა ჯამური რაოდენობა',
+'pageinfo-recent-edits' => 'ბოლო ცვლილებები (უკანასკნელი $1 განმავლობაში)',
+'pageinfo-recent-authors' => 'უნიკალური ავტორების უკანასკნელი რაოდენობა',
 'pageinfo-restriction' => 'გვერდის დაცვა ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'ჯადოსნური {{PLURAL:$1|სიტყვა|სიტყვა}} ($1)',
 'pageinfo-hidden-categories' => 'დამალული {{PLURAL:$1|კატეგორია|კატეგორია}} ($1)',
@@ -3853,10 +3859,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე',
 
 # New logging system
-'logentry-delete-delete' => '$1 წაშალა გვერდი: $3',
+'logentry-delete-delete' => '$1 წაშალა გვერდი: „$3“',
 'logentry-delete-restore' => '$1 აღადგინა გვერდი $3',
 'logentry-delete-event' => '$1 შეცვალა {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
-'logentry-delete-revision' => '$1 შეცვალა {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა $3 გვერდზე: $4',
+'logentry-delete-revision' => '$1 შეცვალა {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4',
 'logentry-delete-event-legacy' => '$1 შეცვალა ჩანაწერების ჟურნალის ხილვადობა $3-ზე',
 'logentry-delete-revision-legacy' => '$1 შეცვალა რედაქტირების კომენტარი გვერდზე $3',
 'logentry-suppress-delete' => '$1 ჩაახშო $3 გვერდი',
index bb67198..be6a28d 100644 (file)
@@ -373,8 +373,8 @@ $messages = array(
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '외부 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '외부 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
+'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
+'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
 'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요) (시험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
@@ -611,7 +611,7 @@ $1',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1란에 글을 남겼습니다. ($2)',
 'youhavenewmessagesmanyusers' => '여러 사용자가 $1란에 글을 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
-'newmessagesdifflinkplural' => '최근 {{PLURAL:$1|바뀜}}',
+'newmessagesdifflinkplural' => '마지막 {{PLURAL:$1|바뀐 내용}}',
 'youhavenewmessagesmulti' => '다른 사용자가 $1란에 글을 남겼습니다.',
 'editsection' => '편집',
 'editold' => '편집',
@@ -724,10 +724,11 @@ $1',
 'protectedpagetext' => '이 문서는 편집할 수 없도록 보호되어 있습니다.',
 'viewsourcetext' => '문서의 원본을 보거나 복사할 수 있습니다:',
 'viewyourtext' => "당신은 이 문서에 남긴 '''당신의 편집''' 내용을 보거나 복사할 수 있습니다:",
-'protectedinterface' => '이 문서는 소프트웨어 인터페이스에 쓰이는 문서로, 잠겨 있습니다.',
-'editinginterface' => "'''경고''': 소프트웨어에서 사용하는 메시지 문서를 고치고 있습니다.
-이는 모든 사용자에게 영향을 끼칩니다.
-번역되지 않은 메시지를 번역하려는 경우에는 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하면 메시지 번역을 미디어위키에 직접 반영할 수 있습니다.",
+'protectedinterface' => '이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.
+모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.',
+'editinginterface' => "'''경고''': 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.
+이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.
+모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
 'sqlhidden' => '(SQL 쿼리 숨겨짐)',
 'cascadeprotected' => '이 문서는 연쇄 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다. 연쇄 보호된 문서:
 $2',
@@ -765,7 +766,7 @@ $2',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
-'externaldberror' => '외부 인증 데이터베이스에 오류가 있거나 외부 계정을 새로 고칠 권한이 없습니다.',
+'externaldberror' => '바깥 인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.',
 'login' => '로그인',
 'nav-login-createaccount' => '로그인 / 계정 만들기',
 'loginprompt' => '{{SITENAME}}에 로그인하려면 쿠키를 사용할 수 있어야 합니다.',
@@ -1191,8 +1192,8 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 설명: '''({{int:cur}})''' = 최신 판과 비교, '''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
 'history-fieldset-title' => '문서의 바뀜 내역 찾기',
 'history-show-deleted' => '삭제된 것만',
-'histfirst' => 'ì´\88기',
-'histlast' => '최신',
+'histfirst' => 'ì²\98ì\9d\8c',
+'histlast' => '마지막',
 'historysize' => '($1 바이트)',
 'historyempty' => '(비었음)',
 
@@ -1414,7 +1415,7 @@ $1",
 'powersearch-togglelabel' => '확인:',
 'powersearch-toggleall' => '모두 선택',
 'powersearch-togglenone' => '모두 선택하지 않음',
-'search-external' => '외부 찾기',
+'search-external' => '바깥 찾기',
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
@@ -1931,7 +1932,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
 'backend-fail-batchsize' => '저장 백엔드에서 파일 {{PLURAL:$1|작업}} $1개가 쌓여 있습니다. 한계는 $2개입니다.',
-'backend-fail-usable' => 'í\8c\8cì\9d¼ ì \80ì\9e¥ ê¶\8cí\95\9cì\9d´ ì\97\86ê±°ë\82\98 ì \80ì\9e¥ ì\9c\84ì¹\98ê°\80 ë¹ ì¡\8c기 ë\95\8c문ì\97\90 $1 í\8c\8cì\9d¼ì\9d\84 ì \80ì\9e¥í\95  수 없습니다.',
+'backend-fail-usable' => 'í\8c\8cì\9d¼ ì\9d½ê¸°/ì\93°ê¸° ê¶\8cí\95\9cì\9d´ ì\97\86ê±°ë\82\98 ì \80ì\9e¥ ì\9c\84ì¹\98ê°\80 ë¹ ì¡\8c기 ë\95\8c문ì\97\90 "$1" í\8c\8cì\9d¼ì\9d\84 ì\9d½ê±°ë\82\98 ì\93¸ 수 없습니다.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '저장소 백엔드 "$1"에 대한 저널 데이터베이스에 연결할 수 없습니다.',
@@ -1964,7 +1965,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'uploadstash-nofiles' => '임시 저장한 파일이 없습니다.',
 'uploadstash-badtoken' => '이 동작을 수행하는 데 실패했습니다. 편집 토큰이 만료되었을 가능성이 있습니다. 다시 시도하세요.',
 'uploadstash-errclear' => '파일을 제거하는 데 실패했습니다.',
-'uploadstash-refresh' => '파일 목록을 새로고침',
+'uploadstash-refresh' => '파일 목록을 새로 고침',
 'invalid-chunk-offset' => '청크 오프셋이 잘못되었습니다.',
 
 # img_auth script messages
@@ -1980,7 +1981,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'img-auth-isdir' => '"$1" 디렉토리에 접근을 시도했습니다.
 파일에만 접근할 수 있습니다.',
 'img-auth-streaming' => '"$1" 파일을 전송하는 중입니다.',
-'img-auth-public' => 'img_auth.php는 개인 위키 파일을 외부 사이트로 전송하는 기능입니다.
+'img-auth-public' => 'img_auth.php는 개인 위키 파일을 바깥 사이트로 전송하는 기능입니다.
 이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.
 보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.',
 'img-auth-noread' => '"$1" 파일을 볼 권한이 없습니다.',
@@ -2008,13 +2009,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'license' => '라이선스:',
 'license-header' => '라이선스',
 'nolicense' => '선택하지 않음',
-'license-nopreview' => '(미리보기 불가능)',
+'license-nopreview' => '(미리 보기 불가능)',
 'upload_source_url' => ' (유효하고, 모든 사람이 접근 가능한 URL)',
 'upload_source_file' => ' (당신의 컴퓨터에 있는 파일)',
 
 # Special:ListFiles
 'listfiles-summary' => '이 위키에 올라와 있는 모든 파일이 나열되어 있습니다.
-사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 버전만이 표시됩니다.',
+사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 버전만이 보여집니다.',
 'listfiles_search_for' => '다음 이름을 가진 미디어 찾기:',
 'imgfile' => '파일',
 'listfiles' => '파일 목록',
@@ -2199,8 +2200,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'wantedpages' => '필요한 문서 목록',
 'wantedpages-badtitle' => '문서 제목이 잘못되었습니다: $1',
 'wantedfiles' => '필요한 파일 목록',
-'wantedfiletext-cat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 외부 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.',
-'wantedfiletext-nocat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 외부 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다.',
+'wantedfiletext-cat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.',
+'wantedfiletext-nocat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다.',
 'wantedtemplates' => '필요한 틀 목록',
 'mostlinked' => '가장 많이 연결된 문서 목록',
 'mostlinkedcategories' => '가장 많이 연결된 분류 목록',
@@ -2249,7 +2250,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'booksources' => '책 찾기',
 'booksources-search-legend' => '책 찾기',
 'booksources-go' => '찾기',
-'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 외부 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
+'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
 'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.',
 
 # Special:Log
@@ -2275,7 +2276,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allnotinnamespace' => '$1 이름공간을 제외한 모든 문서',
 'allpagesprev' => '이전',
 'allpagesnext' => '다음',
-'allpagessubmit' => '표시',
+'allpagessubmit' => '보기',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
 'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
@@ -2409,7 +2410,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
 'watchlist-details' => '토론을 제외하고 문서 $1개를 주시하고 있습니다.',
 'wlheader-enotif' => '* 이메일 알림 기능이 활성화되었습니다.',
-'wlheader-showupdated' => "* 마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 표시됩니다.",
+'wlheader-showupdated' => "* 마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
 'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
@@ -3082,7 +3083,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-pt-anonlogin' => '꼭 필요한 것은 아니지만, 로그인을 하면 편리한 점이 많습니다.',
 'tooltip-pt-logout' => '로그아웃',
 'tooltip-ca-talk' => '문서의 내용에 대한 토론 문서',
-'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리보기를 해 주세요.',
+'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리 보기를 해 주세요.',
 'tooltip-ca-addsection' => '문단 추가하기',
 'tooltip-ca-viewsource' => '문서가 잠겨 있습니다.
 문서의 내용만 볼 수 있습니다.',
@@ -3136,7 +3137,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-recreate' => '문서를 편집하는 중 삭제되어도 새로 만들기',
 'tooltip-upload' => '파일 올리기 시작',
 'tooltip-rollback' => '"되돌리기" 기능을 사용하면 이 문서에 대한 마지막 기여자의 편집을 모두 되돌릴 수 있습니다.',
-'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고, 차이보기 기능이 미리보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
+'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고 차이 보기 기능이 미리 보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 편집 요약을 적어주세요',
 
@@ -3368,7 +3369,7 @@ Variants for Chinese language
 'exif-ycbcrpositioning' => 'Y와 C 위치',
 'exif-xresolution' => '수평 해상도',
 'exif-yresolution' => '수직 해상도',
-'exif-stripoffsets' => '이미지 데이터 위치',
+'exif-stripoffsets' => '그림 데이터 위치',
 'exif-rowsperstrip' => '스트립당 줄의 수',
 'exif-stripbytecounts' => '압축된 스트립당 바이트 수',
 'exif-jpeginterchangeformat' => 'JPEG SOI와의 차이',
@@ -3388,7 +3389,7 @@ Variants for Chinese language
 'exif-flashpixversion' => '지원하는 플래시픽스 버전',
 'exif-colorspace' => '색 공간',
 'exif-componentsconfiguration' => '각 구성 요소의 의미',
-'exif-compressedbitsperpixel' => '이미지 압축 방식',
+'exif-compressedbitsperpixel' => '그림 압축 방식',
 'exif-pixelydimension' => '그림 너비',
 'exif-pixelxdimension' => '그림 높이',
 'exif-usercomment' => '사용자 주',
@@ -3424,7 +3425,7 @@ Variants for Chinese language
 'exif-sensingmethod' => '감지 방식',
 'exif-filesource' => '파일 출처',
 'exif-scenetype' => '촬영 모드',
-'exif-customrendered' => '이미지 처리 방식',
+'exif-customrendered' => '그림 처리 방식',
 'exif-exposuremode' => '노출 방식',
 'exif-whitebalance' => '화이트 밸런스',
 'exif-digitalzoomratio' => '디지털 줌 비율',
@@ -3436,7 +3437,7 @@ Variants for Chinese language
 'exif-sharpness' => '선명도',
 'exif-devicesettingdescription' => '장치 설정에 대한 설명',
 'exif-subjectdistancerange' => '대상과의 거리 범위',
-'exif-imageuniqueid' => '이미지 고유 ID',
+'exif-imageuniqueid' => '그림 고유 ID',
 'exif-gpsversionid' => 'GPS 태그 버전',
 'exif-gpslatituderef' => '북위 또는 남위',
 'exif-gpslatitude' => '위도',
@@ -3453,8 +3454,8 @@ Variants for Chinese language
 'exif-gpsspeed' => 'GPS 수신기 속도',
 'exif-gpstrackref' => '이동 방향에 대한 정보',
 'exif-gpstrack' => '이동 방향',
-'exif-gpsimgdirectionref' => '이미지 방향에 대한 정보',
-'exif-gpsimgdirection' => '이미지 방향',
+'exif-gpsimgdirectionref' => '그림 방향에 대한 정보',
+'exif-gpsimgdirection' => '그림 방향',
 'exif-gpsmapdatum' => '측지 조사 데이처 사용',
 'exif-gpsdestlatituderef' => '목적지의 위도 정보',
 'exif-gpsdestlatitude' => '목적지의 위도',
@@ -3508,7 +3509,7 @@ Variants for Chinese language
 'exif-cameraownername' => '카메라 소유자',
 'exif-label' => '라벨',
 'exif-datetimemetadata' => '메타데이터 최종 수정일',
-'exif-nickname' => '이미지의 비공식적 이름',
+'exif-nickname' => '그림의 비공식적 이름',
 'exif-rating' => '평가 (5점 만점)',
 'exif-rightscertificate' => '권리 관리 인증서',
 'exif-copyrighted' => '저작권 정보',
@@ -3530,8 +3531,8 @@ Variants for Chinese language
 'exif-event' => '묘사된 사건',
 'exif-organisationinimage' => '묘사된 기관',
 'exif-personinimage' => '묘사된 사람',
-'exif-originalimageheight' => '자르기 전 이미지의 세로 길이',
-'exif-originalimagewidth' => '자르기 전 이미지의 가로 길이',
+'exif-originalimageheight' => '자르기 전 그림의 세로 길이',
+'exif-originalimagewidth' => '자르기 전 그림의 가로 길이',
 
 # EXIF attributes
 'exif-compression-1' => '압축되지 않음',
@@ -3625,9 +3626,9 @@ Variants for Chinese language
 'exif-sensingmethod-7' => '3선 센서',
 'exif-sensingmethod-8' => '순차적 색 공간 선형 센서',
 
-'exif-filesource-3' => 'ë\94\94ì§\80í\84¸ ì\8a¤í\8b¸ 카메라',
+'exif-filesource-3' => 'ë\94\94ì§\80í\84¸ ì \95ì§\80 카메라',
 
-'exif-scenetype-1' => '직접 촬영된 이미지',
+'exif-scenetype-1' => '직접 촬영한 그림',
 
 'exif-customrendered-0' => '일반',
 'exif-customrendered-1' => '사용자 정의',
@@ -3749,7 +3750,7 @@ Variants for Chinese language
 'exif-urgency-other' => '사용자 정의 ($1)',
 
 # External editor support
-'edit-externally' => '이 파일을 외부 프로그램을 사용해서 편집하기',
+'edit-externally' => '이 파일을 바깥 프로그램을 사용해서 편집하기',
 'edit-externally-help' => '(자세한 정보는 [//www.mediawiki.org/wiki/Manual:External_editors 설치 방법]을 참고하세요)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -3999,7 +4000,7 @@ $5
 # External image whitelist
 'external_image_whitelist' => ' #이 줄은 그대로 두십시오<pre>
 #정규 표현식(// 사이에 있는 부분)을 아래에 입력하세요.
-#이 목록은 외부 이미지의 URL과 대조할 것입니다.
+#이 목록은 바깥 그림의 URL과 대조할 것입니다.
 #이 목록과 일치하는 것은 그림이 직접 보여지지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.
 # "#"으로 시작하는 줄은 주석으로 간주됩니다.
 #이 목록은 대소문자를 구별하지 않습니다.
@@ -4011,7 +4012,7 @@ $5
 'tag-filter' => '[[Special:Tags|태그]] 필터:',
 'tag-filter-submit' => '필터',
 'tags-title' => '태그',
-'tags-intro' => '이 페이지는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.',
+'tags-intro' => '이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.',
 'tags-tag' => '태그 이름',
 'tags-display-header' => '바뀜 목록의 모양',
 'tags-description-header' => '태그에 대한 설명',
index 87015da..5aba541 100644 (file)
@@ -476,6 +476,10 @@ $1',
 'youhavenewmessages' => 'Do häs $1 ($2).',
 'newmessageslink' => 'neu Metdeilunge op Dinger Klaafsigg',
 'newmessagesdifflink' => 'Ungerscheid zor vürletzte Version',
+'youhavenewmessagesfromusers' => 'Do häs $1 vun {{PLURAL:$3|enem|$3|keinem}} andere Metmaacher ($2)',
+'youhavenewmessagesmanyusers' => 'Do häs $1 vun andere Metmaacher ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|en neuje Nohreesch|neu Nohreeschte|kein neuje Nohreeschte}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|läzde Änderong|läzde Änderonge|kein Änderonge}}',
 'youhavenewmessagesmulti' => 'Do häs neu Nachrichte op $1',
 'editsection' => 'Ändere',
 'editsection-brackets' => '[$1]',
@@ -528,12 +532,12 @@ Et künnt sesch och öm ene Fäähler en dä Sofware fum Wiki handelle.',
 # General errors
 'error' => 'Fähler',
 'databaseerror' => 'Fähler en de Daatebank',
-'dberrortext' => 'Enne Fääler es opjefalle en dä Süntax vun ennem Befääl för de Datebank.
-Dat künnd_enne Fääler em Wikki-Projamm sin.
-De läzde Date_Bank_Befääl eß jewääse:
+'dberrortext' => 'Enne Fähler es opjefalle en dä Süntax vun ennem Befähl för de Daatebangk.
+Dat künnd_enne Fähler em Wikki-Projamm sin.
+De läzde Befähl för de Daatebangk eß jewääse:
 <blockquote><code>$1</code></blockquote>
-uß dä Funkzjohn: „<code>$2</code>“.
-De Datebank mälldt dä Fääler: „<code>$3: $4</code>“.',
+uß dä Fongxjohn: „<code>$2</code>“.
+De Daatebangk mälldt dä Fähler: „<code>$3: $4</code>“.',
 'dberrortextcl' => 'En dä Syntax vun enem Befähl för de Daatebank es
 ene Fähler es opjefalle.
 Dä letzte Befähl för de Daatebank es jewäse:
@@ -643,6 +647,7 @@ Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAM
 'remembermypassword' => 'Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
 'securelogin-stick-https' => 'Noh em Enlogge övver HTTPS verbonge blieve.',
 'yourdomainname' => 'Ding Domain',
+'password-change-forbidden' => 'Do kanns en heh däm Wiki kein Paßwööter ändere.',
 'externaldberror' => 'Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.',
 'login' => 'Enlogge',
 'nav-login-createaccount' => 'Enlogge, Aanmälde',
@@ -952,6 +957,10 @@ domet De dann donoh nit mieh met esu en Ömständ ze dun häs, wie de andere nam
 'noarticletext-nopermission' => 'Op dä Sigg es em Momang nix drop.
 Do kanns noh däm Tittel vun heh dä Sigg [[Special:Search/{{PAGENAME}}|em Tex op ander Sigge söhke]],
 udder en dä zopaß <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Logbööscher nohloore]</span>.',
+'missing-revision' => 'En Version $1 vun dä Sigg „{{PAGENAME}}“ jidd_et nit.
+
+Esu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob en Sigg follesch, di zweschedren fottjeschmeße woode es.
+Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].',
 'userpage-userdoesnotexist' => 'Enne Metmaacher „<nowiki>$1</nowiki>“ hammer nit, beß De secher, dat De die Metmaachersigg ändere oder aanläje wellss?.',
 'userpage-userdoesnotexist-view' => 'Ene Metmaacher mem Naame „$1“ hät sesch noch nih aanjemeldt',
 'blocked-notice-logextract' => 'Dä Metmaacher es jraad jesperrt.
@@ -1102,6 +1111,7 @@ Ene Jrond weße mer nit.',
 'expansion-depth-exceeded-warning' => 'Heh di Sigg hät  the expansion depth övverschredde',
 'parser-unstrip-loop-warning' => 'Ene Befähl em Täx betrick sesch op sesch sellef.',
 'parser-unstrip-recursion-limit' => 'Ene Befähl em Täx es mieh wi {{PLURAL:$1|eijmohl|$1 Mohl|jaa nit}} met  sesch sellef verschachtelt.',
+'converter-manual-rule-error' => 'Doh es ene Fähler en ene händesche Önwandelongsrääjel zwesche de Schprooche.',
 
 # "Undo" feature
 'undo-success' => 'De Änderung könnte mer zeröck nämme. Beloor Der de Ungerscheid un dann donn di Sigg avspeichere, wann De dengks, et es en Oodenung esu.',
@@ -1238,7 +1248,8 @@ $1",
 Do kanns kein Enndrääsch vör de Wiki_Köbeße verschteijsche, der oohne noch en Zoot Verschteijsche dobei ußzewähle.',
 'revdelete-reason-dropdown' => '*Jewöhnlijje Jrönd för et Fottschmiiße
 ** Vershtüß jääje et Uerhävverrääsch.
-** Esu en päsöönlesche Enfomazjuhne sin nit aanjebraach, udder esujaa jääje der Dateschoz.',
+** Esu en päsöönlesche Enfomazjuhne sin nit aanjebraach, udder esujaa jääje der Dateschoz.
+** Künnd en Verleundong sin',
 'revdelete-otherreason' => 'Ene andere ov zohsäzlejje Jrund:',
 'revdelete-reasonotherlist' => 'Ene andere Jrund',
 'revdelete-edit-reasonlist' => 'De Jrönde för et Fottschmieße beärbeide',
@@ -1289,6 +1300,10 @@ Donn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn
 'editundo' => 'De letzte Änderung zeröck nämme',
 'diff-multi' => '(Mer don hee {{PLURAL:$1|eij Version|$1 Versione|keij Version}} dozwesche beim Verjliesche översprenge. Di sin vun jesamp {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} jemaat woode)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein Version|$1 Versione|kei Version}} dozwesche vun mieh wi {{PLURAL:$2|einem Metmaacher|$2 Metmaachere|keinem Metmaacher}} wääde nit jezeish)',
+'difference-missing-revision' => '{{PLURAL:$2|Ein Version|$2 Versione}} vun heh däm Verjlisch zwesche Versione ($1) {{PLURAL:$2|hammer}} nit jefonge.
+
+Esu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob der Ongerscheid zwesche de Versione vun en Sigg follesch, di zweschedren fottjeschmeße woode es.
+Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].',
 
 # Search results
 'searchresults' => 'Wat beim Söke eruskom',
@@ -1422,7 +1437,7 @@ dat dänne ihr Daate topaktuell sin,
 Wä dä Schlößel weiß, kann ding Oppaßleß lesse. Donn alsu ene seschere un jeheime Wäät doför nämme.
 Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <code>$1</code>',
 'savedprefs' => 'Ding Enstellunge sin jetz jesechert.',
-'timezonelegend' => 'Ziggzon:',
+'timezonelegend' => 'Ziggzohn:',
 'localtime' => 'De Zigg op Dingem Kompjuter:',
 'timezoneuseserverdefault' => 'Nemm däm Server sing Zigg ($1)',
 'timezoneuseoffset' => 'Söns jet, jiff dä Ungerscheid aan',
@@ -1566,6 +1581,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'right-writeapi' => 'Darf de <tt>writeAPI</tt> bruche',
 'right-delete' => 'Sigge fottschmieße, die nit besönders vill ahle Versione han',
 'right-bigdelete' => 'Sigge fottschmiiße, och wann se ahle Versione ze baasch han',
+'right-deletelogentry' => 'Beschtemmpte Endrääsch em Logbooch fottschmiiße un zerök holle',
 'right-deleterevision' => 'Einzel Versione fun Sigge fottschmiiße un zeröck holle',
 'right-deletedhistory' => 'Fottjeschmeße Versione vun Sigge opleßte lohße — dat zeich ävver nit der Tex aan',
 'right-deletedtext' => 'Fotjeschmeße Täx un Ungerscheid zwesche de verschtoche Versione aanloore',
@@ -1647,7 +1663,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'action-sendemail' => '<i lang="en">e-mails</i> ze verschecke',
 
 # Recent changes
-'nchanges' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Kein Änderung}}',
+'nchanges' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderong}}',
 'recentchanges' => 'Neuste Änderunge',
 'recentchanges-legend' => 'Enstellunge',
 'recentchanges-summary' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
@@ -1901,8 +1917,9 @@ Als Jrond es aanjejovve: „$2“',
 'lockmanager-fail-acquirelock' => 'Mer kunnte kein Schpärr för „$1“ krijje.',
 'lockmanager-fail-openlock' => 'Mer kunnte di Schpärdatei för „$1“ nit opmaache.',
 'lockmanager-fail-releaselock' => 'Mer kunnte di Schpärr för „$1“ nit ophävve.',
-'lockmanager-fail-db-bucket' => 'Mer kunnet nit met jenooch  <i lang="en">lock databases in bucket$1</i> en Verbendong opnämme.',
+'lockmanager-fail-db-bucket' => 'Mer kunnte nit met jenooch Datebangke för Schpärre pä Sammeloproof „$1“ en Verbendong opnämme.',
 'lockmanager-fail-db-release' => 'Mer kunnte di Schpärre för de Daatebangk „$1“ nit ophävve.',
+'lockmanager-fail-svr-acquire' => 'Mer kunnte kein Schpärre op däm ẞööver „$1“ krijje.',
 'lockmanager-fail-svr-release' => 'Mer kunnte di Schpärre för dä ẞööver „$1“ nit ophävve.',
 
 # ZipDirectoryReader
@@ -2023,6 +2040,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'shared-repo-from' => 'uß $1',
 'shared-repo' => 'ene jemeinsame Beshtand',
 'filepage.css' => '/* Heh dat CSS küdd op Sigge övver Dateije, och di vun ander Wikis jehollt woode sin. */',
+'upload-disallowed-here' => 'Onjlöklescherwies kanns De heh dat Beld nit övverschriive.',
 
 # File reversion
 'filerevert' => '„$1“ zerök holle',
@@ -2109,10 +2127,10 @@ All de Sigge em Wiki, och Klaafsigge, Ömleitunge, un esu jet',
 
 'disambiguations' => 'Sigge met Lengks dren op „(Wat ėß dat?)“-Sigge',
 'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => 'En de Sigge hee noh sin Links dren, di op en „(Watt ėßß datt?)“-Sigg jonn.
+'disambiguations-text' => 'En dä Sigge onge sin Links dren, di op en „(Watt ėßß datt?)“-Sigg jonn.
 Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
 
-Ene Atikel jelld als en „(Watt ėßß datt?)“-Sigg, wann en dä Sigg [[MediaWiki:Disambiguationspage]] ene Link op en drop dren es. Alles wat keij Atikele sin, weed dobei jaa nit eez metjezallt.',
+Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
 
 'doubleredirects' => 'Ömleitunge op Ömleitunge',
 'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
@@ -2139,6 +2157,7 @@ Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
 # Miscellaneous special pages
 'nbytes' => '$1 Byte{{PLURAL:$1||s|}}',
 'ncategories' => '{{PLURAL:$1| ein Saachjrupp | $1 Saachjruppe | keij Saachjruppe }}',
+'ninterwikis' => '{{PLURAL:$1|Eine Engerwikilengk|$1 Engerwikilengks|Keine Engerwikilengk}}',
 'nlinks' => '{{PLURAL:$1|eine Link|$1 Links}}',
 'nmembers' => 'met {{PLURAL:$1|ein Sigg|$1 Sigge}} dren',
 'nrevisions' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Keij Änderung}}',
@@ -2172,6 +2191,7 @@ Di sin dann <del>dorschjeschtresche</del>.',
 'mostlinkedtemplates' => 'Schablone met de miehßte Lenks drop',
 'mostcategories' => 'Atikkele met de miehste Saachjruppe',
 'mostimages' => 'Dateie met de miehste Links drop',
+'mostinterwikis' => 'Atikkele met de miehste Engerwikilengks',
 'mostrevisions' => 'Atikkele met de miehste Änderunge',
 'prefixindex' => 'All Sigge, dänne ehr Name met enem bestemmte Wood oder Tex aanfängk',
 'prefixindex-namespace' => 'All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )',
@@ -2338,6 +2358,8 @@ Mieh övver de einzel Rääschte fenkt Er op de [[{{MediaWiki:Listgrouprights-he
 Adress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze
 schecke.',
 'emailuser' => 'E-mail aan dä Metmaacher',
+'emailuser-title-target' => '<i lang="en">E-mail</i> aan {{GENDER:$1|dä Metmaacher|di Metmaacherėn|dä Metmaacher|di Metmaacherėn|dä Metmaacher}} $1',
+'emailuser-title-notarget' => 'Verschegg en <i lang="en">e-mail</i> aan ene Metmaacher',
 'emailpage' => 'Verscheck <i lang="en">e-mail</i> aan ene Metmaacher',
 'emailpagetext' => 'Wann heh dä Metmaacher en Adräß för sing <i lang="en">e-mail</i> aanjejovve hätt en singe Enstellunge,
 un die deit et och, dann kanns De met däm Fomular hee unge en einzel <i lang="en">e-mail</i> aan dä Metmaacher schecke.
@@ -2489,6 +2511,8 @@ Do kanns hee noh Hölp luure:
 'rollback' => 'Em Letzte sing Änderunge zeröcknemme',
 'rollback_short' => 'Zeröcknemme',
 'rollbacklink' => 'All dem Letzte sing Änderunge zeröckdriehe',
+'rollbacklinkcount' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderonge}} schtantepee retuur nämme',
+'rollbacklinkcount-morethan' => '{{PLURAL:$1|Mieh wi ein Änderong|Övver $1 Änderonge|Kein Änderonge}} schtantepee retuur nämme',
 'rollbackfailed' => 'Dat Zeröcknemme jingk scheiv',
 'cantrollback' => 'De letzte Änderung zeröckzenemme es nit müjjelich. Dä letzte Schriever es dä einzije, dä aan dä Sigg hee jet jedon hät!',
 'alreadyrolled' => 'Mer künne de letzte Änderunge vun dä Sigg „[[:$1]]“ vum Metmaacher „[[User:$2|$2]]“ ([[User talk:$2|Klaaf]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nimieh zeröcknemme, dat hät ene Andere enzwesche ald jedon, udder de Sigg ömjeändert.
@@ -2994,6 +3018,7 @@ All de Trans Wiki Emporte wääde em [[Special:Log/import|Emport_Logboch]] fassj
 'import-interwiki-templates' => 'All Schablone metnämme',
 'import-interwiki-submit' => 'Huhlade!',
 'import-interwiki-namespace' => 'Dun de Sigge emporteere en dat Appachtemeng:',
+'import-interwiki-rootpage' => 'De Aanfangssigg (kann läddesch bliive):',
 'import-upload-filename' => 'Dä Name fun dä Datei:',
 'import-comment' => 'Jrond:',
 'importtext' => 'Dun de Daate met däm „[[Special:Export|Export]]“ vun doh vun enem Wiki Exporteere un - etwa bei Dir om Rechner - avspeichere, un dann heh wider huhlade.',
@@ -3027,6 +3052,9 @@ Bes esu joot, un versök et noch ens.',
 'import-error-interwiki' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name för et Verlengke noh ußerhallef, pä Engerwiki-Lengk, jebruch weed.',
 'import-error-special' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name en enem besöndere Appachtemang litt, woh kein Sigge dren zohjelohße sin.',
 'import-error-invalid' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name nit jöltesch es.',
+'import-options-wrong' => '{{PLURAL:$2|En verkiehrte Aanjab|Verkiehrte Aanjabe|Kein verkiehrte Aanjabe}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Di aanjejovve Aanfangssigg hät keine jölteje Tittel.',
+'import-rootpage-nosubpage' => 'Em Appachtemang „$1“ vun dä Aanfangssig sin kein Ongersigge zohjelohße.',
 
 # Import log
 'importlogpage' => 'Logboch met emporteerte Sigge',
@@ -3179,11 +3207,34 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Info page
 'pageinfo-title' => 'Övver di Sigg: „$1“',
+'pageinfo-header-basic' => 'Jrundlääje Aanjabe',
 'pageinfo-header-edits' => 'De Änderonge',
+'pageinfo-header-restrictions' => 'Siggeschoz',
+'pageinfo-header-properties' => 'De Eijeschaffte vun dä Sigg',
+'pageinfo-display-title' => 'De extra Övverschreff vun dä Sigg',
+'pageinfo-default-sort' => 'Shtandattmääßesch zottiere met däm Schlößel',
+'pageinfo-length' => 'Bytes en dä Sigg',
+'pageinfo-article-id' => 'Dä Sigg ier Nommer en dä Daatebangk',
+'pageinfo-robot-policy' => 'Eijeschaffte för de Söhkmaschiine',
+'pageinfo-robot-index' => 'kammer opnämme',
+'pageinfo-robot-noindex' => 'kammer nit opnämme',
 'pageinfo-views' => 'De Aanzahl Affroofe',
-'pageinfo-watchers' => 'De Aanzahl Oppaßer',
+'pageinfo-watchers' => 'De Aanzahl Oppaßer för di Sigg',
+'pageinfo-redirects-name' => 'Ömleidong(e) op heh di Sigg',
+'pageinfo-subpages-name' => 'Ongersigg(e) vun heh dä Sigg',
+'pageinfo-subpages-value' => '$1 (dovun {{PLURAL:$2|ein Ömleidong|$2 Ömleidonge|kein Ömleidong}} un {{PLURAL:$3|ein nomaale Sigg|$3 nomaale Sigge|kein nomaale Sigg}})',
+'pageinfo-firstuser' => 'Aanjelaat vun',
+'pageinfo-firsttime' => 'Aanjelaat aam',
+'pageinfo-lastuser' => 'Dä läzde Schriiver',
+'pageinfo-lasttime' => 'Et Dattom vun de läzde Änderong',
 'pageinfo-edits' => 'De Aanzahl Änderonge',
-'pageinfo-authors' => 'De Aanzahl ongerscheidlije Schriever',
+'pageinfo-authors' => 'De Aanzahl ongerscheidleje Schriever',
+'pageinfo-recent-edits' => 'De Aanzahl Änderonge en dä läzde Zik, ennerhallf vun $1',
+'pageinfo-recent-authors' => 'De Aanzahl ongerscheidleje Schriever en dä läzde Zik',
+'pageinfo-restriction' => 'Siggeschoz ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Ei Zauberwoot|$1 Zauberwööter|Kein Zauberwööter}}',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
+'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3236,7 +3287,8 @@ $1',
 'file-info-size' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, de Datei hät $3, dä MIME-Typ es: <code>$4</code>',
 'file-info-size-pages' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, Ömfang:&nbsp;$3, <i lang="en">MIME</i> Zoot: $4, met {{PLURAL:$5|ein Sigg|$5 Sigge|kein Sigge}}',
 'file-nohires' => 'Mer han kein hüütere Oplösung vun däm Beld.',
-'svg-long-desc' => 'SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle}} huh, dä Dateiömfang es $3',
+'svg-long-desc' => 'SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle|kei Pixel}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle|kei Pixel}} huh, dä Dateiömfang es $3',
+'svg-long-desc-animated' => 'SVG-Datei met Bewääjong, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle|kei Pixel}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle|kei Pixel}} huh, dä Dateiömfang es $3',
 'show-big-image' => 'Jröößer Oplöösung',
 'show-big-image-preview' => 'Heh di Vör_Aanseesch es $1 jruuß.',
 'show-big-image-other' => '{{PLURAL:$2|Ander Oplühsung|Ander Oplühsunge|kein ander Oplühsunge}}: $1.',
@@ -3246,6 +3298,8 @@ $1',
 'file-info-png-looped' => 'läuf emmer widder vun vürre',
 'file-info-png-repeat' => 'weed {{PLURAL:$1|eijmohl|$1 Mohl|keimohl}} affjespellt',
 'file-info-png-frames' => '{{PLURAL:$1|ei einzel Beld|$1 einzel Belder|kei einzel Beld}}',
+'file-no-thumb-animation' => "'''Opjepaß: Mer han täschnesche Jränze, dröm sind Minibeldscher vun dä Dattei ohne Bewääjong.'''",
+'file-no-thumb-animation-gif' => "'''Opjepaß: Mer han täschnesche Jränze, dröm sind Minibeldscher vun GIF-Datteije met enhuhe Oplöösung, wie die heh, ohne Bewääjong.'''",
 
 # Special:NewFiles
 'newimages' => 'Neu Dateie als Jaleri',
@@ -3990,7 +4044,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 * <span class="mw-specialpagecached">Em Zwescheshpeisher jehallde {{int:nstab-special}}e. Di künnte ovverhollt sind.</span>',
 'specialpages-group-maintenance' => 'Waadungsleste',
 'specialpages-group-other' => 'Ander {{int:nstab-special}}e',
-'specialpages-group-login' => 'Aamelde',
+'specialpages-group-login' => 'Enlogge udder Aanmälde',
 'specialpages-group-changes' => 'Letzte Änderunge un Logböcher',
 'specialpages-group-media' => 'Dateie — Huhlaade un Opliste',
 'specialpages-group-users' => 'Metmaacher un denne ier Rääschte',
@@ -4027,7 +4081,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 'tags-description-header' => 'Bedüggtening',
 'tags-hitcount-header' => 'Makeete Änderunge',
 'tags-edit' => 'ändere',
-'tags-hitcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|kein Änderunge}}',
+'tags-hitcount' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|kein Änderonge}}',
 
 # Special:ComparePages
 'comparepages' => 'Sigge verjliesche',
index 339816c..43ba774 100644 (file)
@@ -559,8 +559,12 @@ Ufro: $2',
 'protectedpagetext' => 'Dës Säit ass fir Ännerunge gespaart.',
 'viewsourcetext' => 'Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren:',
 'viewyourtext' => "Dir kënnt de Quelltext vun '''Ären Ännerungen''' op dëser Säit kucken a kopéieren:",
-'protectedinterface' => 'Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software an dofir ass si gespaart fir Mëssbrauch ze verhënneren.',
-'editinginterface' => "'''Opgepasst:''' Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. Ännerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer gesi ginn. Fir d'Iwwersetzungen z'änneren invitéiere mir Iech de [//translatewiki.net/wiki/Main_Page?setlang=lb Projet translatewiki.net] vun den internationale Messagen ze benotzen.",
+'protectedinterface' => "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.
+
+Fir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
+'editinginterface' => "'''Opgepasst:''' Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. 
+Ännerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn. 
+Fir d'Iwwersetzungen fir all Wikien derbäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
 'sqlhidden' => '(SQL-Offro verstoppt)',
 'cascadeprotected' => 'Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:
 $2',
index d2fb136..4e59e4f 100644 (file)
@@ -731,10 +731,11 @@ $1',
 'protectedpagetext' => 'Оваа страница е заклучена за уредувања.',
 'viewsourcetext' => 'Можете да го погледнете и копирате кодот на оваа страница:',
 'viewyourtext' => "Можете да го погледнете и копирате кодот на '''вашите уредувања''' на оваа страница:",
-'protectedinterface' => 'Оваа страница содржи текст од посредникот на програмот и е заклучена поради можна злоупотреба.',
+'protectedinterface' => 'Оваа страница содржи текст од посредникот на програмот на ова вики и е заштитена поради можна злоупотреба.
+За да додавате или менувате преводи на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?uselang=mk translatewiki.net] - проектот за локализација на МедијаВики.',
 'editinginterface' => "'''Предупредување:''' Уредувате страница која е дел од корисничкиот посредник на програмската опрема на МедијаВики.
\9fÑ\80омениÑ\82е Ð½Ð° Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\9cе Ð¿Ñ\80едизвикааÑ\82 Ð¿Ñ\80омена Ð½Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник ÐºÐ°Ñ\98 Ð¾Ñ\81Ñ\82анаÑ\82иÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\86и.
\97а Ð¿Ñ\80евод, Ð¸Ð¼Ð°Ñ\98Ñ\82е Ð³Ð¾ Ð¿Ñ\80едвид [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net], проектот за локализација на МедијаВики.",
\9fÑ\80омениÑ\82е Ð½Ð° Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\9cе Ð¿Ñ\80едизвикааÑ\82 Ð¿Ñ\80омени Ð²Ð¾ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник ÐºÐ°Ñ\98 Ð´Ñ\80Ñ\83гиÑ\82е ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð½Ð° Ð¾Ð²Ð° Ð²Ð¸Ðºи.
\97а Ð´Ð° Ð´Ð¾Ð´Ð°Ð´ÐµÑ\82е Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82е Ð¿Ñ\80евод Ð½Ð° Ñ\81иÑ\82е Ð²Ð¸ÐºÐ¸Ñ\98а, Ð¿Ð¾Ñ\98деÑ\82е Ð½Ð° [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] - проектот за локализација на МедијаВики.",
 'sqlhidden' => '(Барањето до SQL е скриено)',
 'cascadeprotected' => 'Оваа страница е заштитена од уредувања бидејќи е вклучена во {{PLURAL:$1|следнава страница, којашто е заштитена|следниве страници, коишто се заштитени}} со можноста „каскадна заштита“:
 $2',
@@ -1929,7 +1930,7 @@ $1',
 'backend-fail-internal' => 'Се појави непозната грешка во складишната основа „$1“.',
 'backend-fail-contenttype' => 'Не можев да утврдам каква содржина има податотеката што треба да ја складирам во „$1“.',
 'backend-fail-batchsize' => 'Складишната основа доби блок од $1 податочна {{PLURAL:$1|операција|операции}}, а ограничувањето е $2 {{PLURAL:$2|операција|операции}}.',
-'backend-fail-usable' => 'Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ñ\98а Ð·Ð°Ð¿Ð¸Ñ\88ам Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а $1 бидејќи немате доволно дозволи или поради тоа што недостасуваат именици/содржатели.',
+'backend-fail-usable' => 'Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ñ\98а Ð¿Ñ\80оÑ\87иÑ\82ам Ð¸Ð»Ð¸ Ð·Ð°Ð¿Ð¸Ñ\88ам Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а â\80\9e$1â\80\9c бидејќи немате доволно дозволи или поради тоа што недостасуваат именици/содржатели.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не можев да се поврзам со дневничката база за складишната основа „$1“.',
index 281ff04..1cb4b7c 100644 (file)
@@ -706,8 +706,10 @@ $1',
 'protectedpagetext' => 'ഈ താൾ തിരുത്തുവാൻ സാധിക്കാത്ത വിധം സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്.',
 'viewsourcetext' => 'താങ്കൾക്ക് ഈ താളിന്റെ മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും:',
 'viewyourtext' => "താങ്കൾക്ക് ഈ താളിലെ '''താങ്കളുടെ തിരുത്തലുകളുടെ''' മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും:",
-'protectedinterface' => 'ഈ താൾ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു.',
-'editinginterface' => "'''മുന്നറിയിപ്പ്:''' സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്. ഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താവ് വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം. മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പരിഭാഷകൾക്ക് മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ സംരംഭം ആയ [//translatewiki.net/wiki/Main_Page?setlang=ml ബീറ്റാവിക്കി] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
+'protectedinterface' => 'ഈ താൾ ഈ വിക്കിയുടെ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു. എല്ലാ വിക്കികൾക്കുമായി പരിഭാഷ കൂട്ടിച്ചേർക്കാനോ, പരിഭാഷയിൽ മാറ്റം വരുത്താനോ, ദയവായി മീഡിയവിക്കി പ്രാദേശീകരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുക.',
+'editinginterface' => "'''മുന്നറിയിപ്പ്:''' സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്.
+ഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താക്കൾ വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം.
+മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പരിഭാഷകൾ കൂട്ടിച്ചേർക്കാനും മാറ്റംവരുത്താനും മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
 'sqlhidden' => '(എസ്.ക്യു.എൽ. ക്വറി മറച്ചിരിക്കുന്നു)',
 'cascadeprotected' => 'നിർഝരിത (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്തുവാൻ സാധിക്കില്ല:
 $2',
@@ -1842,7 +1844,7 @@ $1',
 'backend-fail-internal' => '"$1" എന്ന സ്റ്റോറേജ് ബാക്കെൻഡിൽ അപരിചിതമായ പിഴവ് സംഭവിച്ചു.',
 'backend-fail-contenttype' => '"$1" എന്നതിൽ സംഭരിച്ചിരിക്കുന്ന പ്രമാണത്തിന്റെ ഉള്ളടക്ക തരം നിർണ്ണയിക്കാനായില്ല.',
 'backend-fail-batchsize' => 'ശേഖരണ ബാക്ക്എൻഡിൽ $1 ഫയൽ {{PLURAL:$1|പ്രവൃത്തി|പ്രവൃത്തികൾ}} ചെയ്യാൻ നൽകിയിരുന്നു; അതിന്റെ പരിധി $2 {{PLURAL:$2|പ്രവൃത്തി|പ്രവൃത്തികൾ}} ആണ്.',
-'backend-fail-usable' => 'ആവശ്യമായത്ര അനുമതിയില്ലാത്തതു കൊണ്ടോ ഡയറക്റ്ററികൾ/കണ്ടൈനറുകൾ ഇല്ലാത്തതു കൊണ്ടോ പ്രമാണം $1 എഴുതിച്ചേർക്കാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-usable' => 'ആവശ്യമായ അനുമതിയില്ലാത്തതു കൊണ്ടോ ഡയറക്റ്ററികൾ/കണ്ടൈനറുകൾ ഇല്ലാത്തതു കൊണ്ടോ പ്രമാണം $1 എഴുതിച്ചേർക്കാൻ അല്ലെങ്കിൽ എടുക്കാൻ കഴിഞ്ഞില്ല.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '"$1" എന്ന ശേഖരണ ബാക്ക്എൻഡിനായി ജേണൽ ഡേറ്റാബേസിനെ ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
@@ -2297,7 +2299,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 # Watchlist
 'watchlist' => 'ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക',
 'mywatchlist' => 'ഞാൻ ശ്രദ്ധിക്കുന്നവ',
-'watchlistfor2' => '$1 എന്ന ഉപയോക്താവ് $2.',
+'watchlistfor2' => 'ഉപയോക്താവ്:$1 $2',
 'nowatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ഇനങ്ങളൊന്നുമില്ല.',
 'watchlistanontext' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുവാനോ തിരുത്തുവാനോ $1.',
 'watchnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
@@ -2379,7 +2381,7 @@ $UNWATCHURL
 'delete-confirm' => '"$1" മായ്ക്കുക',
 'delete-legend' => 'മായ്ക്കുക',
 'historywarning' => "'''മുന്നറിയിപ്പ്''': താങ്കൾ മായ്ക്കുവാൻ പോകുന്ന താളിനു ഏകദേശം {{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}} ഉള്ള നാൾവഴി ഉണ്ട്:",
-'confirmdeletetext' => 'താà´\99àµ\8dà´\95ൾ à´\92à´°àµ\81 à´¤à´¾àµ¾ à´\85തിനàµ\8dà´±àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതൽ à´\9aà´°à´¿à´¤àµ\8dà´°à´®à´\9fà´\95àµ\8dà´\95à´\82 à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95àµ\81വാൻ à´ªàµ\8bà´µàµ\81à´\95യാണàµ\8d. à´¤à´¾à´\99àµ\8dà´\95ൾ à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´¨àµ\8dനതിനàµ\8dà´±àµ\86 à´ªà´°à´¿à´£à´¿à´¤à´«à´²à´\82 à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95റിയാമàµ\86à´¨àµ\8dà´¨àµ\81à´\82, à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\88 à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95ൽ [[{{MediaWiki:Policy-url}}|വിക്കിയുടെ നയം]] അനുസരിച്ചാണു ചെയ്യുന്നതെന്നും ഉറപ്പാക്കുക.',
+'confirmdeletetext' => 'താà´\99àµ\8dà´\95ൾ à´\92à´°àµ\81 à´¤à´¾àµ¾ à´\85തിനàµ\8dà´±àµ\86 à´¨à´¾àµ¾à´µà´´à´¿à´¯à´\9fà´\95àµ\8dà´\95à´\82 à´®à´¾à´¯àµ\8dà´\95àµ\8dà´\95àµ\81വാൻ à´ªàµ\8bà´µàµ\81à´\95യാണàµ\8d. à´\88 à´\9aàµ\86à´¯àµ\8dതിയàµ\81à´\9fàµ\86 à´ªà´°à´¿à´£à´¤à´«à´²à´\82 à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95റിയാമàµ\86à´¨àµ\8dà´¨àµ\81à´\82, à´\88 à´¨à´\9fà´ªà´\9fà´¿ [[{{MediaWiki:Policy-url}}|വിക്കിയുടെ നയം]] അനുസരിച്ചാണു ചെയ്യുന്നതെന്നും ഉറപ്പാക്കുക.',
 'actioncomplete' => 'പ്രവൃത്തി പൂർത്തിയായിരിക്കുന്നു',
 'actionfailed' => 'പ്രവൃത്തി പരാജയപ്പെട്ടിരിക്കുന്നു',
 'deletedtext' => '"$1" മായ്ച്ചിരിക്കുന്നു. പുതിയതായി നടന്ന മായ്ക്കലുകളുടെ വിവരങ്ങൾ $2 ഉപയോഗിച്ച് കാണാം.',
index e6b5d5f..1ddb365 100644 (file)
@@ -65,7 +65,7 @@ $messages = array(
 'tog-previewontop' => 'Засварлах талбарын өмнө урьдчилж харсан байдлыг үзүүлэх',
 'tog-previewonfirst' => 'Эхний засварын үед урьдчилж харсан байдлыг үзүүлэх',
 'tog-nocache' => 'Вэб хөтөчийн хуудасны кешингийг болиулах',
-'tog-enotifwatchlistpages' => 'Миний хянах жагсаалт дахь хуудас өөрчлөгдөхөд и-мэйл явуулах',
+'tog-enotifwatchlistpages' => 'Миний хянах жагсаалт дахь хуудас өөрчлөгдсөн бол и-мэйл явуулах',
 'tog-enotifusertalkpages' => 'Миний хэлэлцүүлгийн хуудас өөрчлөгдөхөд и-мэйл явуулах',
 'tog-enotifminoredits' => 'Хуудсууд бага зэргээр засварлагдахад ч и-мэйл явуулах',
 'tog-enotifrevealaddr' => 'Мэдэгдлийн и-мэйлд миний мэйл хаягийг илчлэх',
@@ -2864,6 +2864,15 @@ $1',
 'exif-gpsareainformation' => 'GPS бүсийн нэр',
 'exif-gpsdatestamp' => 'GPS огноо',
 'exif-gpsdifferential' => 'GPS дифференциал засвар',
+'exif-source' => 'Эх сурвалж',
+'exif-languagecode' => 'Хэл',
+'exif-iimcategory' => 'Ангилал',
+'exif-cameraownername' => 'Камерын эзэн',
+'exif-label' => 'Шошго',
+'exif-datetimemetadata' => 'метадатаг хамгийн сүүлд өөрчилсөн огноо',
+'exif-copyrighted' => 'Зохиогчийн эрхийн байдал',
+'exif-copyrightowner' => 'Зохиогчийн эрх эзэмшигч',
+'exif-originaldocumentid' => 'Ориг баримтын ID',
 
 # EXIF attributes
 'exif-compression-1' => 'Шахагдаагүй',
@@ -2986,6 +2995,8 @@ $1',
 'exif-gpsdestdistance-m' => 'Милл',
 'exif-gpsdestdistance-n' => 'бээр',
 
+'exif-objectcycle-a' => 'Зөвхөн өглөө',
+'exif-objectcycle-p' => 'Зөвхөн орой',
 'exif-objectcycle-b' => 'Өдөр ч шөнө ч',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
@@ -3178,6 +3189,7 @@ $5
 'version-parserhooks' => 'Парсер хүүкүүд',
 'version-variables' => 'Хувьсагчууд',
 'version-antispam' => 'Спамаас сэргийлэх',
+'version-skins' => 'Арьс',
 'version-other' => 'Бусад',
 'version-mediahandlers' => 'Медиа боловсруулагч',
 'version-hooks' => 'Гогцоо',
@@ -3210,6 +3222,7 @@ $5
 'fileduplicatesearch-info' => '$1 × $2 пиксэл<br />Файлын хэмжээ: $3<br />MIME төрөл: $4',
 'fileduplicatesearch-result-1' => '"$1"-тай яг ижилхэн, давхардсан файл байхгүй байна.',
 'fileduplicatesearch-result-n' => '"$1" файлтай яг ижилхэн, давхардсан {{PLURAL:$2|1 файл|$2 файл}} байна.',
+'fileduplicatesearch-noresults' => '"$1" нэртэй файл олдсонгүй.',
 
 # Special:SpecialPages
 'specialpages' => 'Тусгай хуудсууд',
index 8535f62..9378072 100644 (file)
@@ -576,8 +576,10 @@ Pertanyaan: $2',
 'protectedpagetext' => 'Laman ini telah dikunci untuk menghalang penyuntingan.',
 'viewsourcetext' => 'Anda boleh melihat dan menyalin sumber bagi laman ini:',
 'viewyourtext' => "Anda boleh melihat dan menyalin sumber '''suntingan anda''' kepada laman ini:",
-'protectedinterface' => 'Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.',
-'editinginterface' => "'''Amaran:''' Anda sedang menyunting laman yang digunakan untuk menghasilkan teks antara muka bagi perisian ini. Sebarang perubahan terhadap laman ini akan menjejaskan rupa antara muka bagi pengguna-pengguna lain. Untuk melakukan penterjemahan, anda boleh menggunakan [//translatewiki.net/wiki/Main_Page?setlang=ms translatewiki.net], sebuah projek penyetempatan MediaWiki.",
+'protectedinterface' => 'Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.
+Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].',
+'editinginterface' => "'''Amaran:''' Anda sedang menyunting laman yang digunakan untuk menghasilkan teks antara muka bagi perisian ini. Sebarang perubahan terhadap laman ini akan menjejaskan rupa antara muka bagi pengguna-pengguna lain di wiki ini.
+Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
 'sqlhidden' => '(Pertanyaan SQL disorokkan)',
 'cascadeprotected' => 'Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara "melata": $2',
 'namespaceprotected' => "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
@@ -1105,10 +1107,11 @@ Anda tidak memiliki capaian padanya.',
 'revdelete-concurrent-change' => 'Ralat ketika mengubahsuai item bertarikh $2, $1: kelihatan statusnya telah diubah oleh orang lain ketika anda cuba untuk mengubahsuainya.
 Mohon semak log.',
 'revdelete-only-restricted' => 'Ralat menyembunyikan item bertarikh $2, $1: anda tidak boleh menyekat item-item dari pandangan pentadbir-pentadbir tanpa memilih juga salah satu pilihan pandangan lain.',
-'revdelete-reason-dropdown' => '*Sebab penghapusan biasa
+'revdelete-reason-dropdown' => '*Sebab penghapusan yang biasa
 ** Pencabulan hak cipta
-** Maklumat peribadi tidak sesuai
-** Maklumat berpotensi fitnah',
+** Ulasan atau maklumat peribadi tidak sesuai
+** Nama pengguna tidak sesuai
+** Maklumat berkemungkinan fitnah',
 'revdelete-otherreason' => 'Sebab lain/tambahan:',
 'revdelete-reasonotherlist' => 'Sebab lain',
 'revdelete-edit-reasonlist' => 'Ubah sebab-sebab hapus',
@@ -1726,7 +1729,7 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
 'backend-fail-internal' => 'Berlakunya ralat yang tidak dikenali dalam backend storan "$1".',
 'backend-fail-contenttype' => 'Jenis kandungan fail untuk disimpan di "$1" tidak dapat ditentukan.',
 'backend-fail-batchsize' => 'Backend storan diberi $1 operasi fail dalam satu kelompok; hadnya ialah $2 operasi.',
-'backend-fail-usable' => 'Fail $1 tidak boleh ditulis kerana kebenaran tidak memadai atau tertinggal direktori/penyimpan.',
+'backend-fail-usable' => 'Fail "$1" tidak boleh dibaca atau ditulis kerana kebenaran tidak memadai atau tertinggal direktori/penyimpan.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Tidak dapat bersambung dengan pangkalan data jurnal untuk backend storan "$1".',
index bbd811d..80ce8a0 100644 (file)
@@ -1862,7 +1862,7 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-internal' => 'En ukjent feil oppsto i filbackend «$1».',
 'backend-fail-contenttype' => 'Kunne ikke avgjøre innholdstypen til filen som skal lagres på «$1».',
 'backend-fail-batchsize' => 'Bakgrunnsprosesseringen belastet med {{PLURAL:$1|en filoperasjon|en samling av $1 filoperasjoner}}; grensen er $2.',
-'backend-fail-usable' => 'Kunne ikke skrive fila $1 på grunn av utilstrekkelige tillatelser eller manglende mapper/beholdere.',
+'backend-fail-usable' => 'Kunne ikke lese eller skrive fila «$1» på grunn av utilstrekkelige tillatelser eller manglende mapper/beholdere.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kunne ikke koble til journaldatabasen for lagringssystemet «$1».',
index fc6380c..51d1313 100644 (file)
@@ -433,8 +433,8 @@ $messages = array(
 'category-file-count' => 'In disse kategorie {{PLURAL:$2|steet t volgende bestaand|staon de volgende $1 bestaanden, van in totaal $2}}.',
 'category-file-count-limited' => 'In disse kategorie {{PLURAL:$1|steet t volgende bestaand|staon de volgende $1 bestaanden}}.',
 'listingcontinuesabbrev' => '(vervolg)',
-'index-category' => 'Spul wat al indexeerd is',
-'noindex-category' => 'Spul wat nog niet indexeerd is',
+'index-category' => 'Te indexeren ziejen',
+'noindex-category' => 'Niet te indexeren ziejen',
 'broken-file-category' => 'Ziejen mit verkeerde bestaandsverwiezingen',
 
 'about' => 'Informasie',
@@ -1227,7 +1227,8 @@ Kiek de logboeken nao.',
 'revdelete-only-restricted' => 'Der is n fout op-etrejen bie t verbargen van t objekt van $1, $2: je kunnen gien objekten onderdrokken uut t zich van beheerders zonder oek n van de aandere zichtbaorheidsopsies te selekteren.',
 'revdelete-reason-dropdown' => '*Veulveurkoemde redens veur t vortdoon
 ** Schenden van de auteursrechten
-** Ongeschikte persoonlike informasie
+** Ongepast kommentaar of ongepaste persoonlike informasie
+** Ongepaste gebrukersnaam
 ** Meugelik lasterlike informasie',
 'revdelete-otherreason' => 'Aandere reden:',
 'revdelete-reasonotherlist' => 'Aandere reden',
@@ -1835,7 +1836,7 @@ As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/
 'backend-fail-internal' => 'Der is n onbekende fout op-etreden in t opslagbackend "$1".',
 'backend-fail-contenttype' => 'Kon t inhoudstype van t bestaand um op "$1" op te slaon niet bepaolen.',
 'backend-fail-batchsize' => 'Reeks van $1 bestaands{{PLURAL:$1|operasie|operasies}} in de opslagbackend; de limiet is $2 {{PLURAL:$2|operasie|operasies}}.',
-'backend-fail-usable' => 'Kon t bestaand $1 niet schrieven vanwegen te min rechten of niet-anwezige mappen of houwers.',
+'backend-fail-usable' => 'Kon t bestaand "$1" niet lezen of schrieven umda\'j niet genog rechten hebben of vanwegen niet-anwezige mappen of houwers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kon gien verbiending maken mit de journaaldatabanke veur t opslagbackend "$1".',
index 5ceb8cd..6c0184c 100644 (file)
@@ -1952,7 +1952,7 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
 'backend-fail-internal' => 'Er is een onbekende fout opgetreden in het opslagbackend "$1".',
 'backend-fail-contenttype' => 'Het inhoudstype van het bestand om in de opslag "$1" op te slaan kon niet bepaald worden.',
 'backend-fail-batchsize' => 'Taak met $1 {{PLURAL:$1|bestandshandeling|bestandshandelingen}} in het opslagbackend; de limiet is $2 {{PLURAL:$2|handeling|handelingen}}.',
-'backend-fail-usable' => 'Het was niet mogelijk naar het bestand $1 te schrijven vanwege onvoldoende rechten of niet-aanwezige mappen of containers.',
+'backend-fail-usable' => 'Het was niet mogelijk naar het bestand $1 te schrijven of eruit te lezen vanwege onvoldoende rechten of niet-aanwezige mappen of containers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Het was niet mogelijk een verbinding te maken met de journaldatabase voor het opslagbackend "$1".',
index b337715..97bba45 100644 (file)
@@ -325,9 +325,9 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Endre avsnitt ved å høgreklikke på avsnittsoverskrift (JavaScript)',
 'tog-showtoc' => 'Vis innhaldsliste (for sider med meir enn tre bolkar)',
 'tog-rememberpassword' => 'Hugs innlogginga mi med denne nettlesaren (for høgst {{PLURAL:$1|éin dag|$1 dagar}})',
-'tog-watchcreations' => 'Legg til sidene eg opprettar på overvakingslista mi',
-'tog-watchdefault' => 'Legg til sidene eg endrar på overvakingslista mi',
-'tog-watchmoves' => 'Legg til sidene eg flyttar på overvakingslista mi',
+'tog-watchcreations' => 'Legg til sidene eg opprettar og filene eg lastar opp på overvakingslista mi',
+'tog-watchdefault' => 'Legg til sidene og filene eg endrar på overvakingslista mi',
+'tog-watchmoves' => 'Legg til sidene og filene eg flytter på overvakingslista mi',
 'tog-watchdeletion' => 'Legg til sidene eg slettar på overvakingslista mi',
 'tog-minordefault' => 'Merk endringar som «småplukk» som standard',
 'tog-previewontop' => 'Vis førehandsvisinga før endringsboksen',
@@ -335,7 +335,7 @@ $messages = array(
 'tog-nocache' => 'Deaktiver nettlesaren sitt mellomlager («cache»)',
 'tog-enotifwatchlistpages' => 'Send e-post når dei overvaka sidene mine vert endra',
 'tog-enotifusertalkpages' => 'Send e-post når brukarsida mi vert endra',
-'tog-enotifminoredits' => 'Send e-post også for småplukk',
+'tog-enotifminoredits' => 'Send meg e-post sjølv for mindre endringar på sider og filer',
 'tog-enotifrevealaddr' => 'Vis e-postadressa mi i endrings-e-post',
 'tog-shownumberswatching' => 'Vis kor mange som overvakar sida',
 'tog-oldsig' => 'Noverande signatur:',
@@ -577,6 +577,10 @@ $1',
 'youhavenewmessages' => 'Du har $1 ($2).',
 'newmessageslink' => 'nye meldingar',
 'newmessagesdifflink' => 'sjå skilnad',
+'youhavenewmessagesfromusers' => 'Du har $1 frå {{PLURAL:$3|ein annan bruker| $3 brukarar}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du har $1 frå mange brukarar ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ei ny melding|nye meldingar}}',
+'newmessagesdifflinkplural' => 'siste {{PLURAL:$1|endringa|endringane}}',
 'youhavenewmessagesmulti' => 'Du har nye meldingar på $1',
 'editsection' => 'endre',
 'editold' => 'endre',
@@ -687,6 +691,7 @@ $2',
 Grunnen som er gjeven er: ''$2''.",
 'invalidtitle-knownnamespace' => 'Ugyldig tittel med namnerommet «$2» og teksten «$3»',
 'invalidtitle-unknownnamespace' => 'Ugyldig tittel med ukjend namneromstal $1 og teksten «$2»',
+'exception-nologin' => 'Ikkje innlogga',
 
 # Virus scanner
 'virus-badscanner' => "Dårleg konfigurasjon: ukjend virusskanner: ''$1''",
@@ -707,6 +712,7 @@ Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
 'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
 'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
 'yourdomainname' => 'Domenet ditt',
+'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
 'externaldberror' => 'Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.',
 'login' => 'Logg inn',
 'nav-login-createaccount' => 'Lag brukarkonto / logg inn',
@@ -863,11 +869,11 @@ Mellombels passord: $2',
 'subject' => 'Emne/overskrift:',
 'minoredit' => 'Småplukk',
 'watchthis' => 'Overvak sida',
-'savearticle' => 'Lagre',
+'savearticle' => 'Lagra sida',
 'preview' => 'Førehandsvising',
 'showpreview' => 'Førehandsvis',
 'showlivepreview' => 'Levande førehandsvising',
-'showdiff' => 'Vis skilnad',
+'showdiff' => 'Vis skilnader',
 'anoneditwarning' => "'''Åtvaring:''' Du er ikkje innlogga. IP-adressa di vert lagra i historikken for sida.",
 'anonpreviewwarning' => "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta førd opp i endringshistorikken til denne sida.''",
 'missingsummary' => "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
@@ -1753,6 +1759,9 @@ $1',
 'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
 'backend-fail-alreadyexists' => 'Fila $1 finst frå før.',
 
+# Special:UploadStash
+'uploadstash-refresh' => 'Oppdater fillista',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Tilgjenge avslått',
 'img-auth-nopathinfo' => 'PATH_INFO manglar.
@@ -1804,7 +1813,7 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'listfiles_name' => 'Namn',
 'listfiles_user' => 'Brukar',
 'listfiles_size' => 'Storleik',
-'listfiles_description' => 'Beskriving',
+'listfiles_description' => 'Skildring',
 'listfiles_count' => 'Versjonar',
 
 # File description page
@@ -1843,6 +1852,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 'uploadnewversion-linktext' => 'Last opp ny versjon av denne fila',
 'shared-repo-from' => 'frå $1',
 'shared-repo' => 'eit sams fillager',
+'upload-disallowed-here' => 'Diverre kan du ikkje overskriva dette biletet.',
 
 # File reversion
 'filerevert' => 'Rulla attende $1',
@@ -2567,23 +2577,24 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
 Merk at sida '''ikkje''' kan flyttast dersom det allereie finst ei side med den nye tittelen. Du kan likevel flytte ei side attende dit ho vart flytt frå dersom du gjer ein feil, så lenge den sida du flytter attende til ikkje er vorten endra sidan flyttinga.
 
 <b>ÅTVARING!</b> Dette kan vera ei drastisk og uventa endring for ei populær side; ver sikker på at du skjønner konsekvensane av dette før du fortset.",
-'movepagetext-noredirectfixer' => "Ved å bruke skjemaet under kan du få omdøypt ei side og flytt heile historikken til det nye namnet. 
-Den gamle tittelen vil omdirigere til den nye tittelen. 
-Pass på å sjekke for doble eller dårlege omdirigeringar. 
-Du er ansvarleg for at alle lenkjene stadig peiker dit det er meininga at dei skal peike.
+'movepagetext-noredirectfixer' => "Nyttar ein skjemaet under får ein døypt om ei side og flytt heile historikken til det nye namnet. 
+Den gamle tittelen vil verta ei omdirigeringsside for den nye tittelen. 
+Pass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|uverksame]] omdirigeringar. 
+Du er ansvarleg for at alle lenkjene stadig peikar dit det er meininga at dei skal føra.
 
-Merk at sida '''ikkje''' kan flyttast dersom det allereie finst ei side med den nye tittelen, om ho då ikkje er ei omdirigeringsside utan endringshistorikk. Dette vil seie at du kan flytte ei side attende dit ho vart flytt frå dersom du gjer ein feil, og at du ikkje kan skriva over ei side som finst.
+Merk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, om ho då ikkje er tom eller ei omdirigeringsside utan endringshistorikk.
+Dette vil seia at du kan døypa om ei side til det gamle namnet hennar om du gjer ein feil, og dessutan at du ikkje kan skriva over ei side som finst.
 
-<b>ÅTVARING!</b>
+'''ÅTVARING!'''
 Dette kan vera ei drastisk og uventa endring for ei populær side;
-ver sikker på at du skjøner konsekvensane av dette før du fortset.",
-'movepagetalktext' => "Den tilhøyrande diskusjonssida, om ho finst, vil automatisk bli flytt med sida '''med mindre:'''
-*Du flytter sida til eit anna namnerom, eller
-*Du fjernar merkinga i boksen nedanfor.
+ver viss på at du skjøner konsekvensane av flyttinga før du held fram.",
+'movepagetalktext' => "Den tilhøyrande diskusjonssida, om ho finst, vert automatisk flytt med sida '''minder:'''
+*ei ikkje-tom diskusjonsside alt finst under det nye namnet, eller
+*du fjernar avhakinga i boksen nedanfor.
 
-I desse falla lyt du flytte eller flette saman sida manuelt.",
+I desse falla lyt du flytta eller fletta sida manuelt, om ynskeleg.",
 'movearticle' => 'Flytt side:',
-'moveuserpage-warning' => "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vil verta flytt og at brukarnamnet '''ikkje''' vert endra.",
+'moveuserpage-warning' => "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vert flytt og at brukarnamnet '''ikkje''' vert endra.",
 'movenologin' => 'Ikkje innlogga',
 'movenologintext' => 'Du lyt vera registrert brukar og vera [[Special:UserLogin|innlogga]] for å flytte ei side.',
 'movenotallowed' => 'Du har ikkje tilgang til å flytte sider.',
@@ -2650,6 +2661,7 @@ Dette kan så importerast til ein annan wiki som brukar MediaWiki-programvara gj
 For å eksportere sider, skriv inn titlar i tekstboksen under, ein tittel per linje, og velg om du vil ha berre noverande versjon, eller alle versjonar i historikken.
 
 Dersom du berre vil ha noverande versjon, kan du også bruke ei lenkje, til dømes [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for sida «[[{{MediaWiki:Mainpage}}]]».',
+'exportall' => 'Eksporter alle sider',
 'exportcuronly' => 'Berre eksporter siste versjonen, ikkje med heile historikken.',
 'exportnohistory' => "----
 '''Merk:''' Å eksportere heile sidehistorikkar gjennom dette skjemaet er slått av grunna problem med ytinga.",
@@ -2686,6 +2698,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'thumbnail_error' => 'Feil ved oppretting av miniatyrbilete: $1',
 'djvu_page_error' => 'DjVu-sida er utanfor rekkjevidd',
 'djvu_no_xml' => 'Klarte ikkje hente inn XML for DjVu-fila',
+'thumbnail-temp-create' => 'Kan ikkje oppretta mellombels fil for miniatyrbilete',
 'thumbnail_invalid_params' => 'Ugyldige miniatyrparameterar',
 'thumbnail_dest_directory' => 'Klarte ikkje å opprette målmappe',
 'thumbnail_image-type' => 'Bilettypen er ikkje stødd',
@@ -2793,9 +2806,9 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'tooltip-ca-nstab-help' => 'Vis hjelpeside',
 'tooltip-ca-nstab-category' => 'Vis kategoriside',
 'tooltip-minoredit' => 'Merk dette som småplukk',
-'tooltip-save' => 'Lagre endringane dine',
+'tooltip-save' => 'Lagra endringane dine',
 'tooltip-preview' => 'Førehandsvis endringane dine, bruk denne funksjonen før du lagrar!',
-'tooltip-diff' => 'Vis skilnaden mellom din versjon og lagra versjon, utan å lagre.',
+'tooltip-diff' => 'Sjå kva endringar du gjorde i teksten',
 'tooltip-compareselectedversions' => 'Sjå endringane mellom dei valde versjonane av denne sida.',
 'tooltip-watch' => 'Legg sida til i overvakingslista di [alt-w]',
 'tooltip-watchlistedit-raw-submit' => 'Oppdater overvakingslista',
index b5018e9..a1bd01b 100644 (file)
@@ -520,7 +520,9 @@ $1',
 'youhavenewmessages' => 'ଆପଣଙ୍କର $1 ($2).',
 'newmessageslink' => 'ନୂଆ ମେସେଜ',
 'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
+'youhavenewmessagesfromusers' => 'ଆପଣଙ୍କର {{PLURAL:$3|another user|$3 users}} ($2)ରୁ $1 ଅଛି ।',
 'youhavenewmessagesmanyusers' => 'ଆପଣଙ୍କର ବହୁତ ବ୍ୟବହାରକାରୀ($2)ମାନଙ୍କଠାରୁ $1 ଅଛି ।',
+'newmessageslinkplural' => '{{PLURAL:$1|a new message|ନୂଆ ମେସେଜ}}',
 'newmessagesdifflinkplural' => 'ଶେଷ{{PLURAL:$1|change|changes}}',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
 'editsection' => 'ସମ୍ପାଦନା',
@@ -573,12 +575,11 @@ $1',
 # General errors
 'error' => 'ଭୁଲ',
 'databaseerror' => 'ଡାଟାବେସରେ ଭୁଲ',
-'dberrortext' => 'ଡାଟାବେସ ପ୍ରଶ୍ନ ଖୋଜା ଭୁଲ ଟିଏ ହୋଇଅଛି ।
-ଏହା ଏହି ସଫ୍ଟବେରରେ ଭୁଲଟିଏକୁ ମଧ୍ୟ ସୂଚାଇପାରେ ।
-ଶେଷ ଥର ଖୋଜାଯାଇଥିବା ଡାଟାବେସ ପ୍ରଶ୍ନ ଖୋଜାଟି ଥିଲା:
-"<tt>$2</tt>" କାମ ଭିତରୁ
-<blockquote><tt>$1</tt></blockquote> ।
-ଡାଟାବେସ ଫେରନ୍ତା ଭୁଲ "<tt>$3: $4</tt>".',
+'dberrortext' => 'ଏହା ଏହି ସଫ୍ଟବେରରେ ଭୁଲଟିଏକୁ ମଧ୍ୟ ସୂଚାଇପାରେ ।
+ଶେଷଥର ଖୋଜାଯାଇଥିବା ଡାଟାବେସ ପ୍ରଶ୍ନଟି ଥିଲା:
+<blockquote><code>$1</code></blockquote>
+ ଯାହାକି "<code>$2</code>"ରୁ ଥିଲା
+ଡାଟାବେସରେ ହୋଇଥିବା ଭୁଲ ହେଉଛି "<samp>$3: $4</samp>"।',
 'dberrortextcl' => 'ଡାଟାବେସ ପ୍ରଶ୍ନ ଖୋଜା ଭୁଲଟିଏ ହୋଇଅଛି ।
 ଶେଷ ଖୋଜା ଡାଟାବେସ ପ୍ରଶ୍ନଟି ଥିଲା:
 "$1"
@@ -647,6 +648,11 @@ $2',
 'ns-specialprotected' => 'ବିଶେଷ ପୃଷ୍ଠାସବୁକୁ ବଦଳାଯାଇପାରିବ ନାହିଁ ।',
 'titleprotected' => 'ଏହି ନାମଟି [[User:$1|$1]]ଙ୍କ ଦେଇ ନୂଆ ତିଆରିହେବାରୁ କିଳାଯାଇଅଛି ।
 ଏହାର କାରଣ ହେଲା "\'\'$2\'\'" ।',
+'filereadonlyerror' => 'ଫାଇଲ ଧାରକ "$2"ଟି ଖାଲି ପଢିବା ହେବାଭଳି ରହିଥିବା ହେତୁ ଏଥିରେ ଥିବା $1 ପାଇଲଟିକୁ ବଦଳା ଯାଇପାରିବ ନାହିଁ ।
+
+ଯେଉଁ ପରିଚ୍ଛା ଏହାକୁ ବନ୍ଦ କରିଛନ୍ତି ସେ ଏହି ବିବରଣୀ ଦେଇଛନ୍ତି: "$3"',
+'invalidtitle-knownnamespace' => '"$2" ନେମ୍ସ୍ପେସ ଏବଂ "$3" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
+'invalidtitle-unknownnamespace' => '"$1" ନେମ୍ସ୍ପେସ ଏବଂ "$2" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।',
 'exception-nologin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
 'exception-nologin-text' => 'ଏହା କରିବାକୁ ହେଲେ ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଲଗଇନ କରିବାକୁ ପଡିବ ।',
 
@@ -928,6 +934,10 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି],
 କିମ୍ବା [{{fullurl:{{FULLPAGENAME}}|action=edit}} ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରନ୍ତି]</span> ।',
+'missing-revision' => '"{{PAGENAME}}" ନାମରେ ଥିବା ପୃଷ୍ଠାଟିର #$1 ପୁନରାବୃତ୍ତି ନାହିଁ ।
+
+ପୁରୁଣା ହୋଇଯାଇଥିବା ଇତିହାସ ଲିଙ୍କ ଯାହା ଏକ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଦିଆଯାଇଥିବାରୁ ଏହା ସାଧାରଣତଃ ହୋଇଥାଏ ।
+ଅଧିକ ବିବରଣୀ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]ରେ ମିଳିପାରିବ ।',
 'userpage-userdoesnotexist' => 'ଇଉଜର ଖାତା "$1" ଟି ତିଆରି କରାଯାଇନାହିଁ ।
 ଆପଣ ଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରି କରିବାକୁ ଚାହାନ୍ତି କି ନାହିଁ ଦୟାକରି ପରଖି ନିଅନ୍ତୁ ।',
 'userpage-userdoesnotexist-view' => 'ଇଉଜର ନାମ "$1"ଟି ତିଆରି କରାଯାଇ ନାହିଁ ।',
@@ -937,7 +947,6 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 * '''Firefox / Safari:''' ''Reload'' କଲାବେଳେ ''Shift'' ଧରି, କିମ୍ବା ''Ctrl-F5'' ବା ''Ctrl-R'' (Macରେ ''⌘-R'') ଦବାନ୍ତୁ
 * '''Google Chrome:''' ''Ctrl-Shift-R'' (Macରେ ''⌘-Shift-R'') ଦବାନ୍ତୁ
 * '''Internet Explorer:'''  ''Refresh'' କଲାବେଳେ ''Ctrl'' ଦବାନ୍ତୁ, କିମ୍ବା ''Ctrl-F5'' ଦବାନ୍ତୁ
-* '''Konqueror:''' ''Reload'' ଦବାନ୍ତୁ କିମ୍ବା ''F5'' ଦବାନ୍ତୁ
 * '''Opera:''' ''Tools → Preferences''ରେ ଅସ୍ଥାୟୀ ସ୍ମୃତି ସଫା କରିଦିଅନ୍ତୁ",
 'usercssyoucanpreview' => "'''ଜାଣିବା କଥା:''' ଆପଣା ନୂଆ CSS ସାଇତିବା ଆଗରୁ \"{{int:showpreview}}\" ବ୍ୟବହାର କରି ପରଖି ନିଅନ୍ତୁ ।",
 'userjsyoucanpreview' => "'''ଜାଣିବା କଥା:''' ଆପଣା ନୂଆ ଜାଭାସ୍କ୍ରିପ୍ଟ (JavaScript) ସାଇତିବା ଆଗରୁ \"{{int:showpreview}}\" ବ୍ୟବହାର କରି ପରଖି ନିଅନ୍ତୁ ।",
@@ -1054,6 +1063,13 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'parser-template-loop-warning' => 'ଛାଞ୍ଚ ଲୁପ (Template loop) ଦେଖିବାକୁ ମିଳିଲା: [[$1]]',
 'parser-template-recursion-depth-warning' => 'ଛାଞ୍ଚର ବାରମ୍ବାର ପ୍ରତୀତ ହେବା କ୍ଷମତା ପାର ହୋଇଅଛି ($1)',
 'language-converter-depth-warning' => 'ଭାଷା ରୂପାନ୍ତରଣ କ୍ଷମତା ସରିଯାଇଅଛି ($1)',
+'node-count-exceeded-category' => 'ପୃଷ୍ଠାଗୁଡିକ ଯେଉଁଠି ନୋଡ-ଗଣନା ଅତ୍ୟଧିକ ହୋଇଯାଇଛି',
+'node-count-exceeded-warning' => 'ପୃଷ୍ଠାଟି ନୋଡ-ଗଣନାରୁ ଅଧିକ ହୋଇଗଲା',
+'expansion-depth-exceeded-category' => 'ଯେଉଁ ପୃଷ୍ଠାଗୁଡିକରେ ବିସ୍ତ୍ରୁତ ଗଭୀରତା ଅତ୍ୟଧିକ ହୋଇଯାଇଛି',
+'expansion-depth-exceeded-warning' => 'ପୃଷ୍ଠାଟି ବିସ୍ତ୍ରୁତ ଗଭୀରତାରୁ ଅଧିକ ହୋଇଗଲା',
+'parser-unstrip-loop-warning' => 'ଅଜଣା ଲୁପ ଜଣାପଡିଲା',
+'parser-unstrip-recursion-limit' => 'ଅଜଣା ଚକ୍ରର ସୀମା ଅତ୍ୟଧିକ ହୋଇଗଲା ($1)',
+'converter-manual-rule-error' => 'ଆପେ ଆପେ ଭାଷା ପରିବର୍ତ୍ତନ ନିଯମରେ ଭୁଲ ଅଛି',
 
 # "Undo" feature
 'undo-success' => 'ଏହି ସମ୍ପାଦନା ପଛକୁ ଫେରାଯାଇପାରିବ ନାହିଁ ।
index 9f18071..75810ac 100644 (file)
@@ -355,6 +355,10 @@ $1',
 'youhavenewmessages' => 'Райстай $1 ($2).',
 'newmessageslink' => 'ног фыстæгтæ',
 'newmessagesdifflink' => 'фæстаг ивд',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|Æндæр архайæгæй|$3 архайæгæй}} дæм $1 æрцыд ($2).',
+'youhavenewmessagesmanyusers' => 'Бирæ архайæгæй дæм $1 æрцыдис ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ног фыстæг|ног фыстæджытæ}}',
+'newmessagesdifflinkplural' => 'фæстаг {{PLURAL:$1|ивд|ивдтытæ}}',
 'youhavenewmessagesmulti' => 'Дæумæ æрцыдис ног фыстæджытæ {{grammar:genitive|$1}}',
 'editsection' => 'ивын',
 'editold' => 'ивын',
@@ -508,6 +512,7 @@ $2',
 'remembermypassword' => 'Бахъуыды мæ кæнæд ашы браузеры (максимум $1 {{PLURAL:$1|бонмæ|бонмæ}})',
 'securelogin-stick-https' => 'Дарддæр дæр HTTPS-ы уылты, бахизыны фæстæ',
 'yourdomainname' => 'Дæ домен:',
+'password-change-forbidden' => 'Дæ бон нæу пароль фæивын ацы викийы.',
 'externaldberror' => 'Кæнæ аутентификацийы рарддоны рæдыд æрцыдис, кæнæ та дæуæн нæй бар снæуæг кæнын дæ æддаг аккаунт.',
 'login' => 'Бахизын',
 'nav-login-createaccount' => 'Бахизын / срегистраци кæнын',
index 3936a76..b6e4228 100644 (file)
@@ -98,7 +98,7 @@ $messages = array(
 'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਨਵੇਂ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchdefault' => 'ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchmoves' => 'ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
-'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¹à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨®à¨¿à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-minordefault' => 'ਸਾਰੇ ਫੇਰ-ਬਦਲਾਂ ’ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੀਆਂ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tog-previewontop' => 'ਐਡਿਟ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
 'tog-previewonfirst' => 'ਪਹਿਲੇ ਐਡਿਟ ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
@@ -122,8 +122,8 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'tog-showjumplinks' => '"ਇਸ ਤੇ ਜਾਓ" ਦੇ ਲਿੰਕ ਦਿਖਾਣਾ ਸਮਰੱਥ ਕਰੋ',
 'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ) (ਤਜਰਬੇਕਾਰੀ)',
 'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦਾਖ਼ਲ ਕਰਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰਦਾਰ ਕਰੋ',
-'tog-watchlisthideown' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨®à©\87ਰà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¹à¨\9fਾਓ',
-'tog-watchlisthidebots' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨°à©\8bਬਾà¨\9f à¨¦à¨¿à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¹à¨\9fਾਓ',
+'tog-watchlisthideown' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨®à©\87ਰà©\87 à¨«à©\87ਰ-ਬਦਲ à¨²à©\81à¨\95ਾਓ',
+'tog-watchlisthidebots' => 'ਮà©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à¨\9aà©\8bà¨\82 à¨°à©\8bਬà©\8bà¨\9fਾà¨\82 à¨¦à©\87 à¨«à©\87ਰ-ਬਦਲ à¨²à©\81à¨\95ਾਓ',
 'tog-watchlisthideminor' => 'ਛੋਟੇ ਸੋਧ ਵਾਚ-ਲਿਸਟ ਤੋਂ ਓਹਲੇ ਰੱਖੋ',
 'tog-watchlisthideliu' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲਾਗ ਇਨ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
 'tog-watchlisthideanons' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਗੁਮਨਾਮ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
@@ -294,7 +294,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'toolbox' => 'ਸੰਦ ਬਕਸਾ',
 'userpage' => 'ਯੂਜ਼ਰ ਪੇਜ ਵੇਖੋ',
 'projectpage' => 'ਪਰੋਜੈਕਟ ਪੇਜ ਵੇਖੋ',
-'imagepage' => 'ਫਾà¨\87ਲ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'imagepage' => 'ਫ਼ਾà¨\88ਲ à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
 'mediawikipage' => 'ਸੁਨੇਹਾ ਪੇਜ ਵੇਖੋ',
 'templatepage' => 'ਟੈਪਲੇਟ ਪੇਜ ਵੇਖੋ',
 'viewhelppage' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
@@ -1202,7 +1202,7 @@ to upload files.',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
 'upload-maxfilesize' => 'ਫ਼ਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
 'upload-description' => 'ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ',
-'watchthisupload' => 'à¨\87ਸ à¨«à¨¾à¨\87ਲ à¨¨à©\82à©° à¨µà¨¾à¨\9a à¨\95ਰੋ',
+'watchthisupload' => 'à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ â\80\99ਤà©\87 à¨¨à¨\9c਼ਰ à¨°à©±à¨\96ੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
 'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
 
@@ -1760,7 +1760,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'move-page-legend' => 'ਪੇਜ ਮੂਵ ਕਰੋ',
 'movearticle' => 'ਸਫ਼ਾ ਭੇਜੋ:',
 'movenologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
-'movenologintext' => 'à¨\87ੱà¨\95 à¨ªà©\87à¨\9c à¨®à©\82ਵ à¨\95ਰਨ à¨²à¨\88 à¨¤à©\81ਸà©\80à¨\82 à¨°à¨\9cਿਸà¨\9fਰਡ à¨®à©\88à¨\82ਬਰ à¨¹à©\8bਣà©\87 à¨\9aਾਹà©\80ਦà©\87 à¨¹à©\8b à¨\85ਤà©\87 [[Special:UserLogin|ਲਾà¨\97ਡ ਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
+'movenologintext' => 'à¨\87à¨\95 à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨¿à¨°à¨²à©\87à¨\96 à¨¬à¨¦à¨²à¨£ à¨²à¨\88 à¨¤à©\81ਸà©\80à¨\82 à¨°à¨\9cਿਸà¨\9fਰਡ à¨®à©\88à¨\82ਬਰ à¨¹à©\8bਣà©\87 à¨\9aਾਹà©\80ਦà©\87 à¨¹à©\8b à¨\85ਤà©\87 [[Special:UserLogin|ਲਾà¨\97ਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
 'newtitle' => 'ਨਵੇਂ ਟਾਈਟਲ ਲਈ:',
 'move-watch' => 'ਸਰੋਤ ਤੇ ਟਾਰਗੇਟ ਸਫ਼ੇ ਉੱਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ',
 'movepagebtn' => 'ਸਫ਼ਾ ਭੇਜੋ',
@@ -1819,7 +1819,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ਤੁਹਾਡਾ ਮੈਂਬਰ ਸਫ਼ਾ',
-'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਗੱਲਬਾਤ ਸਫ਼ਾ',
+'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ',
 'tooltip-pt-preferences' => 'ਤੁਹਾਡੀਆਂ ਪਸੰਦਾਂ',
 'tooltip-pt-watchlist' => 'ਓਹਨਾਂ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਜੋ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੇਖ ਰਹੇ ਹੋ',
 'tooltip-pt-mycontris' => 'ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਲਿਸਟ',
@@ -2016,8 +2016,8 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'table_pager_empty' => 'ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ',
 
 # Auto-summaries
-'autosumm-blank' => 'ਪà©\87à¨\9c à¨¨à©\82à©° à¨\96ਾਲà©\80 à¨\95ਰ à¨¦à¨¿à©±ਤਾ',
-'autosumm-new' => '$1 ਨਾਲ ਪੇਜ ਬਣਾਇਆ',
+'autosumm-blank' => 'ਸਫ਼à©\87 à¨¨à©\82à©° à¨\96਼ਾਲà©\80 à¨\95à©\80ਤਾ',
+'autosumm-new' => '"$1" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ',
 
 # Live preview
 'livepreview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
index 10f3892..91f42c4 100644 (file)
@@ -1226,7 +1226,9 @@ Proszę sprawdzić rejestr operacji.',
 'revdelete-only-restricted' => 'Nie można ukryć elementu z $2, $1 przed administratorami bez określenia jednej z pozostałych opcji ukrywania.',
 'revdelete-reason-dropdown' => '* Najczęstsze powody usunięcia
 ** Naruszenie praw autorskich
-** Informacja naruszająca prywatność',
+** Niestosowny komentarz lub informacja naruszająca prywatność
+** Niestosowna nazwa użytkownika
+** Potencjalnie oszczercza informacja',
 'revdelete-otherreason' => 'Inny lub dodatkowy powód:',
 'revdelete-reasonotherlist' => 'Inny powód',
 'revdelete-edit-reasonlist' => 'Edycja listy powodów usunięcia pliku',
@@ -1854,7 +1856,7 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
 'backend-fail-internal' => 'Wystąpił nieznany błąd w wewnętrznych funkcjach magazynowania "$1".',
 'backend-fail-contenttype' => 'Nie można określić typ zawartości pliku do przechowywania w "$1".',
 'backend-fail-batchsize' => 'Wewnętrzne funkcje magazynowania otrzymały $1 {{PLURAL:$1|operację|operacje|operacji}} na pliku; limit to $2 {{PLURAL:$2|operacja|operacje|operacji}}.',
-'backend-fail-usable' => 'Nie można zapisać pliku $1 ze względu na niewystarczające uprawnienia lub brak katalogów/kontenerów.',
+'backend-fail-usable' => 'Nie można zapisać lub czytać z pliku "$1" ze względu na niewystarczające uprawnienia lub brak katalogów/kontenerów.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nie można połączyć się z bazą danych dziennika dla backendu magazynowania "$1".',
@@ -3100,11 +3102,11 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-header-edits' => 'Historia edycji',
 'pageinfo-header-restrictions' => 'Zmień zabezpieczenie',
 'pageinfo-header-properties' => 'Właściwości strony',
-'pageinfo-display-title' => 'Wyświetl tytuł',
+'pageinfo-display-title' => 'Wyświetlany tytuł',
 'pageinfo-default-sort' => 'Domyślny klucz sortowania',
 'pageinfo-length' => 'Długość strony (w bajtach)',
 'pageinfo-article-id' => 'Identyfikator strony',
-'pageinfo-robot-policy' => 'Stan wyszukiwarki',
+'pageinfo-robot-policy' => 'Status w wyszukiwarce',
 'pageinfo-robot-index' => 'Indeksowalne',
 'pageinfo-robot-noindex' => 'Nieindeksowalne',
 'pageinfo-views' => 'Odsłon',
@@ -3120,10 +3122,10 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-authors' => 'Całkowita liczba autorów',
 'pageinfo-recent-edits' => 'Liczba ostatnich edycji (w przeciągu $1)',
 'pageinfo-recent-authors' => 'Liczba ostatnich autorów',
-'pageinfo-restriction' => 'Zabezpieczenie strony ({{lcfirst:$1}})',
+'pageinfo-restriction' => 'Zabezpieczenie strony – {{lcfirst:$1}}',
 'pageinfo-magic-words' => 'Magiczne {{PLURAL:$1|słowo|słowa|słowa}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukryte kategorie}} ($1)',
-'pageinfo-templates' => 'Transkludowan{{PLURAL:$1|y szablon|e szablony}} ($1)',
+'pageinfo-templates' => 'Wykorzystywan{{PLURAL:$1|y szablon|e szablony}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Standardowa',
index 938f0af..57df395 100644 (file)
@@ -959,7 +959,9 @@ It peule pa vëddlo.',
 'revdelete-only-restricted' => "Eror an stërmand l'element datà $2, $1: it peule pa vieté la vista d'element a j'aministrator sensa ëdcò selessioné un-a dj'àutre opsion ëd visibilità.",
 'revdelete-reason-dropdown' => "*Rason sòlite dë scancelassion
 ** Violassion dël drit d'autor
-** Anformassion përsonaj pa aproprià",
+** Coment o anformassion përsonaj pa aproprià
+** Nòm utent pa aproprià
+** Anformassion potensialment difamatòria",
 'revdelete-otherreason' => 'Àutra rason o adissional:',
 'revdelete-reasonotherlist' => 'Àutra rason',
 'revdelete-edit-reasonlist' => 'Modifiché la rason ëd lë scancelament',
@@ -2861,44 +2863,44 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 # Image deletion
 'deletedrevision' => 'Veja version scancelà $1',
 'filedeleteerror-short' => "Eror ën scanceland l'archivi: $1",
-'filedeleteerror-long' => "A son ësta-ie dj'eror ën scanceland l'archivi:
+'filedeleteerror-long' => "A-i son ësta-ie dj'eror ën scanceland l'archivi:
 
 $1",
-'filedelete-missing' => 'L\'archivi "$1" as peul pa dëscancelesse, për via ch\'a-i é nen.',
-'filedelete-old-unregistered' => 'La revision d\'archivi specificà "$1" ant la base dat a-i é nen.',
-'filedelete-current-unregistered' => 'Ant la base dat l\'archivi "$1" ch\'a l\'é specificasse a-i é pa.',
-'filedelete-archive-read-only' => 'Ël servent dla Ragnà a peul pa scriv-ie ant ël dossié dj\'archivi "$1".',
+'filedelete-missing' => "L'archivi «$1» as peul pa dëscancelesse, për via ch'a-i é nen.",
+'filedelete-old-unregistered' => "La revision d'archivi specificà «$1» ant la base dij dat a-i é nen.",
+'filedelete-current-unregistered' => "Ant la base dij dat l'archivi «$1» ch'a l'é specificasse a-i é pa.",
+'filedelete-archive-read-only' => "Ël servent dla Ragnà a peul pa scriv-ie ant ël dossié d'archiviassion «$1».",
 
 # Browsing diffs
-'previousdiff' => '← Diferensa pì veja',
-'nextdiff' => 'Modìfica pì neuva →',
+'previousdiff' => '← Modìfica precedenta',
+'nextdiff' => 'Modìfica apress →',
 
 # Media information
 'mediawarning' => "'''Atension!''': st'archivi-sì a podrìa avèj andrinta dël còdes butà-lì da cheidun për fé ëd darmagi.
-An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a sò sistema.",
-'imagemaxsize' => "Lìmit ëd la dimension ëd la figura:<br /> ''(për pàgine ëd descrission dij file)''",
+An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a sò sistema.",
+'imagemaxsize' => "Lìmit ëd la dimension ëd le plance:<br /> ''(për le pàgine ëd descrission dj'archivi)''",
 'thumbsize' => 'Amzura dle figurin-e:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pàgina|pàgine}}',
 'file-info' => "amzura dl'archivi: $1, sòrt MIME: $2",
-'file-info-size' => '$1 × $2 pixel, amzure: $3, sòrt MIME: $4',
+'file-info-size' => '$1 × $2 pontin, amzure: $3, sòrt MIME: $4',
 'file-info-size-pages' => "$1 × $2 pontin, dimension ëd l'archivi: $3, sòrt MIME: $4, $5 {{PLURAL:$5|pàgina|pàgine}}",
 'file-nohires' => 'Gnun-a risolussion pì bela disponìbil.',
-'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pixel, amzura dl'archivi: $3",
+'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pontin, amzura dl'archivi: $3",
 'svg-long-desc-animated' => "Archivi SVG animà, dimension $1 × $2 pontin, amzura dl'archivi: $3",
-'show-big-image' => 'Version a amzura pijn-a',
+'show-big-image' => 'Version a arzolussion pien-a',
 'show-big-image-preview' => 'Amzure dë sta preuva: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Àutra arzolussion|Àutre arzolussion}}: $1.',
 'show-big-image-size' => '$1 × $2 pontin',
-'file-info-gif-looped' => 'ciclà',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|fnesta|fneste}}',
+'file-info-gif-looped' => 'an sicl',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|quàder|quàder}}',
 'file-info-png-looped' => 'an sìrcol',
-'file-info-png-repeat' => 'sonà $1 {{PLURAL:$1|vira|vire}}',
+'file-info-png-repeat' => 'fàit andé $1 {{PLURAL:$1|vira|vire}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|quàder|quàder}}',
 'file-no-thumb-animation' => "'''Nòta: Për dle limitassion técniche, le miniadure ëd s'archivi a saran pa animà.'''",
 'file-no-thumb-animation-gif' => "'''Nòta: Për limitassion técniche, le miniadure ëd figure GIF a àuta arzolussion com costa a saran pa animà.'''",
 
 # Special:NewFiles
-'newimages' => 'Galerìa ëd figure e son neuv',
+'newimages' => 'Galarìa ëd figure e son neuv',
 'imagelisttext' => "Ambelessì sota a-i é {{PLURAL:$1|l'ùnica figura che a-i sia|na lista ëd '''$1''' figure, ordinà për $2}}.",
 'newimages-summary' => "Sta pàgina special-sì a la smon j'ùltim archivi carià.",
 'newimages-legend' => 'Filtror',
index 9c0307d..03e5454 100644 (file)
@@ -439,6 +439,7 @@ $1',
 'site-atom-feed' => '$1 د اټوم کتنه',
 'page-rss-feed' => '"$1" د آر اس اس کتنه',
 'page-atom-feed' => 'د "$1" د اټوم کتنې',
+'feed-atom' => 'اټوم',
 'feed-rss' => 'آر اس اس',
 'red-link-title' => '$1 (تر اوسه پورې نه شته)',
 'sort-descending' => 'مخښکته اوډل',
@@ -598,8 +599,8 @@ $1',
 'mailerror' => 'د برېښليک د لېږلو ستونزه: $1',
 'acct_creation_throttle_hit' => 'د همدې ويکي کارنانو په وروستيو ورځو کې ستاسې د IP پتې په کارولو سره {{PLURAL:$1|1 ګڼون|$1 ګڼونونه}} جوړ کړي، چې دا په همدې مودې کې د ګڼونونو د جوړولو تر ټولو ډېر شمېر دی چې اجازه يې ورکړ شوې.
 نو په همدې خاطر د اوس لپاره د همدې IP پتې کارنان نه شي کولای چې نور ګڼونونه جوړ کړي.',
-'emailauthenticated' => 'ستاسو برېښليک پته په $2 نېټه په $3 بجو د منلو وړ وګرځېده.',
-'emailnotauthenticated' => 'ستاسو د برېښليک پته لا تر اوسه پورې د منلو وړ نه ده ګرځېدلې. د اړوندو بېلوونکو نښو په هکله تاسو ته هېڅ کوم برېښليک نه لېږل کېږي.',
+'emailauthenticated' => 'ستاسې برېښليک پته په $2 نېټه په $3 بجو د منلو وړ وګرځېده.',
+'emailnotauthenticated' => 'لا تر اوسه ستاسې برېښليک پته د منلو وړ نه ده ګرځېدلې. د لاندې ځانګړتياو لپاره به تاسې ته هېڅ کوم برېښليک و نه لېږل شي.',
 'noemailprefs' => 'ددې لپاره چې دا کړنې کار وکړي نو تاسو يو برېښليک وټاکۍ.',
 'emailconfirmlink' => 'د خپل د برېښليک پتې پخلی وکړی',
 'invalidemailaddress' => 'دا برېښليک پته نه منل کېږي، دا ځکه چې دا پته يوه ناکره بڼه لري.
@@ -635,6 +636,7 @@ $1',
 'passwordreset' => 'پټنوم بياپرځايول',
 'passwordreset-text' => 'د دې لپاره چې ستاسې د ګڼون بشپړې څرګندنې دربرېښليک شي نو دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
+'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
 'passwordreset-username' => 'کارن-نوم:',
 'passwordreset-domain' => 'شپول:',
 'passwordreset-capture' => 'د پايلې برېښليک کتل غواړې؟',
@@ -757,7 +759,7 @@ $1',
 ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
 'editing' => 'د $1 سمونه',
 'creating' => '$1 جوړېدنې کې دی',
-'editingsection' => 'سمونه $1 (برخه)',
+'editingsection' => '$1 (برخه) په سمېدنې کې دی',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
 'editconflict' => 'په سمادولو کې خنډ: $1',
 'yourtext' => 'ستاسو متن',
@@ -878,7 +880,7 @@ $1',
 'revdelete-reason-dropdown' => '*د ړنګولو ټولګړي سببونه
 ** د خپرېدو د رښتو سرغړونه
 ** ناسم شخصي مالومات
-** Potentially libelous information',
+** پارونکي او بلواګر مالومات',
 'revdelete-otherreason' => 'بل/اضافي سبب:',
 'revdelete-reasonotherlist' => 'بل سبب',
 'revdelete-edit-reasonlist' => 'د ړنګولو سببونه سمول',
@@ -929,7 +931,7 @@ $1',
 'searchhelp-url' => 'Help:لړليک',
 'searchprofile-articles' => 'مېنځپانګيز مخونه',
 'searchprofile-project' => 'د لارښود او پروژې مخونه',
-'searchprofile-images' => 'Multimedia',
+'searchprofile-images' => 'ګڼرسنۍ',
 'searchprofile-everything' => 'هرڅه',
 'searchprofile-advanced' => 'پرمختللی',
 'searchprofile-articles-tooltip' => 'په $1 کې پلټل',
@@ -1225,7 +1227,7 @@ $1',
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو پکار ده چې تاسې لومړی غونډال کې [[Special:Userlogin|ننوځۍ]].',
+'uploadnologintext' => 'د دوتنو د پورته کولو لپاره بايد غونډال کې [[Special:Userlogin|ننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
@@ -1431,6 +1433,7 @@ $1',
 'brokenredirects-delete' => 'ړنګول',
 
 'withoutinterwiki' => 'د ژبې د تړنو بې برخې مخونه',
+'withoutinterwiki-summary' => 'لانديني مخونه د نورو ژبو بڼو سره تړنې نه لري.',
 'withoutinterwiki-legend' => 'مختاړی',
 'withoutinterwiki-submit' => 'ښکاره کول',
 
@@ -1475,7 +1478,7 @@ $1',
 'protectedpages-indef' => 'يوازې بې پايه ژغورنې',
 'protectedpages-cascade' => 'يوازې ځوړاوبيزې ژغورنې',
 'protectedtitles' => 'ژغورلي سرليکونه',
-'listusers' => 'د کارن لړليک',
+'listusers' => 'کارن لړليک',
 'listusers-editsonly' => 'يوازې هغه کارنان چې سمونونه يې کړي ښکاره کول',
 'listusers-creationsort' => 'د جوړېدو د نېټې له مخې اوډل',
 'usereditcount' => '{{PLURAL:$1|سمون|سمونونه}}',
@@ -1532,8 +1535,8 @@ $1',
 'special-categories-sort-abc' => 'د ابېڅو له مخې اوډل',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'د کارونکي ونډې ړنګې شوې',
-'deletedcontributions-title' => 'د کارونکي ونډې ړنګې شوې',
+'deletedcontributions' => 'ړنګې شوې ونډې',
+'deletedcontributions-title' => 'ړنګې شوې ونډې',
 'sp-deletedcontributions-contribs' => 'ونډې',
 
 # Special:LinkSearch
@@ -1551,6 +1554,7 @@ $1',
 
 # Special:ActiveUsers
 'activeusers' => 'د فعالو کارنانو لړليک',
+'activeusers-intro' => 'دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.',
 'activeusers-count' => 'په {{PLURAL:$2|تېرې|تېرو}} {{PLURAL:$3|ورځ|$3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}',
 'activeusers-from' => 'هغه کارنان کتل چې نومونه يې پېلېږي په:',
 'activeusers-hidebots' => 'روباټونه پټول',
@@ -1601,7 +1605,7 @@ $1',
 'emailccsubject' => '$1 ته ستاسو د پيغام لمېسه: $2',
 'emailsent' => 'برېښليک مو ولېږل شو',
 'emailsenttext' => 'ستاسو برېښليکي پيغام ولېږل شو.',
-'emailuserfooter' => 'همدا برېښليک د $1 لخوا $2 ته د {{SITENAME}} په وېبځي کې د "همدې کارونکي ته برېښليک لېږل" د کړنې په مرسته لېږل شوی دی.',
+'emailuserfooter' => 'دا برېښليک د $1 لخوا $2 ته د {{SITENAME}} په وېبځي کې د "کارن ته برېښليک لېږل" د کړنې په مرسته لېږل شوی.',
 
 # User Messenger
 'usermessage-summary' => 'د غونډال پيغام پرېښودل.',
@@ -1797,7 +1801,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'sp-contributions-newbies' => 'د نوو ګڼونونو ونډې ښکاره کول',
 'sp-contributions-newbies-sub' => 'د نوو ګڼونونو لپاره',
 'sp-contributions-blocklog' => 'د بنديز يادښت',
-'sp-contributions-deleted' => 'د کارن ونډې ړنګې شوې',
+'sp-contributions-deleted' => 'ړنګې شوې ونډې',
 'sp-contributions-uploads' => 'پورته کېدنې',
 'sp-contributions-logs' => 'يادښتونه',
 'sp-contributions-talk' => 'خبرې اترې',
@@ -2185,7 +2189,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-colorspace' => 'رنګ تشيال',
 'exif-pixelydimension' => 'د انځور سور',
 'exif-pixelxdimension' => 'د انځور جګوالی',
-'exif-usercomment' => 'د Ú©Ø§Ø±Ù\88Ù\86Ú©Ù\8a تبصرې',
+'exif-usercomment' => 'د Ú©Ø§Ø±Ù\86 تبصرې',
 'exif-relatedsoundfile' => 'اړونده غږيزه دوتنه',
 'exif-datetimedigitized' => 'د ګڼياليز کېدنې وخت او نېټه',
 'exif-fnumber' => 'F شمېره',
@@ -2530,6 +2534,7 @@ $5
 * نورماله ځانګړي مخونه.
 * <strong class="mw-specialpagerestricted">محدوده ځانګړي مخونه.</strong>
 * <span class="mw-specialpagecached">رانيولي ځانګړي مخونه (کېدای شي منسوخ شوی وي).</span>',
+'specialpages-group-maintenance' => 'د څارنې راپورونه',
 'specialpages-group-other' => 'نور ځانګړي مخونه',
 'specialpages-group-login' => 'ننوتل / ګڼون جوړول',
 'specialpages-group-changes' => 'وروستي بدلونونه او يادښتونه',
index 8417e8c..e893489 100644 (file)
@@ -3127,11 +3127,32 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
-'pageinfo-header-edits' => 'Edições',
+'pageinfo-header-basic' => 'Informação básica',
+'pageinfo-header-edits' => 'Histórico de edições',
+'pageinfo-header-restrictions' => 'Proteção da página',
+'pageinfo-header-properties' => 'Propriedades da página',
+'pageinfo-display-title' => 'Exibir título',
+'pageinfo-length' => 'Tamanho da página (em bytes)',
+'pageinfo-article-id' => 'ID da página',
+'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-index' => 'Indexável',
+'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
-'pageinfo-watchers' => 'Número de vigilantes',
-'pageinfo-edits' => 'Número de edições',
-'pageinfo-authors' => 'Número de autores individuais',
+'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-redirects-name' => 'Redireciona para esta página',
+'pageinfo-subpages-name' => 'Subpáginas desta página',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não-redirecionamento|não-redirecionamentos}})',
+'pageinfo-firstuser' => 'Criador da página',
+'pageinfo-firsttime' => 'Data de criação da página',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Data da última edição',
+'pageinfo-edits' => 'Número total de edições',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
+'pageinfo-recent-authors' => 'Número recente de autores distintos',
+'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Clássico',
index 49cf0d7..a1e4a73 100644 (file)
@@ -706,7 +706,7 @@ $1 is a filename, I think.',
 'viewsourcetext' => 'The text shown when displaying the source of a page that the user has no permission to edit',
 'viewyourtext' => 'Same as {{msg-mw|viewsourcetext}} but when showing the text submitted by the user, this happens e.g. when the user was blocked while he is editing the page',
 'protectedinterface' => 'Message shown if a user without the "editinterface" right tries to edit a page in the MediaWiki namespace.',
-'editinginterface' => "A message shown when editing pages in the namespace MediaWiki:. In the [http://translatewiki.net/wiki/Main_Page?setlang=en URL], '''change \"setlang=en\" to your own language code.'''",
+'editinginterface' => 'A message shown when editing pages in the namespace MediaWiki:.',
 'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
 'titleprotected' => 'Use $1 for GENDER.',
 'invalidtitle-knownnamespace' => 'Displayed when an invalid title was encountered (generally in a list), but the namespace number is known to exist.
@@ -1409,8 +1409,11 @@ This is a search result (and I guess search engine) dependent messages. I do not
 
 This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]',
 'searchall' => '{{Identical|All}}',
-'showingresults' => "This message is used on some special pages such as 'Wanted categories'. $1 is the total number of results in the batch shown and $2 is the number of the first item listed.",
-'showingresultsnum' => '$3 is the number of results on the page and $2 is the first number in the batch of results.',
+'showingresults' => "This message is used on some special pages such as 'Wanted categories'.
+*$1 is the total number of results in the batch shown.
+*$2 is the number of the first item listed.",
+'showingresultsnum' => '*$3 is the number of results on the page.
+*$2 is the first number in the batch of results.',
 'showingresultsheader' => 'Used in search results of [[Special:Search]].',
 'nonefound' => 'This message appears on the search results page if no results are found.
 {{doc-important|Do not translate "all:".}}',
@@ -3559,7 +3562,10 @@ Parameters:
 'svg-long-desc' => 'Displayed under an SVG image at the image description page. Note that argument 3 is a string that includes the file size unit symbol. See for example [[:File:Yes check.svg]].
 
 Start with a lowercase letter, unless the first word is “SVG”.',
-'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}. $1 is width, $2 is height, and $3 is file size, including unit (for example "10 KB").
+'svg-long-desc-animated' => 'Displayed under an SVG image at the image description page if the image is animated. Non-animated images use {{msg-mw|svg-long-desc}}.
+* $1 is the width in pixels
+* $2 is the height in pixels, and 
+* $3 is the file size including a unit (for example "10 KB").
 
 Start with a lowercase letter, unless the first word is “SVG”.',
 'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
index f501dea..7fdc68a 100644 (file)
@@ -682,10 +682,11 @@ Vă rugăm să încercați din nou în câteva minute.',
 'protectedpagetext' => 'Această pagină este protejată împotriva modificărilor.',
 'viewsourcetext' => 'Se poate vizualiza și copia conținutul acestei pagini:',
 'viewyourtext' => "Se poate vizualiza și copia conținutul '''modificărilor dumneavoastră''' efectuate asupra acestei pagini:",
-'protectedinterface' => 'Această pagină asigură textul interfeței pentru software și este protejată pentru a preveni abuzurile.',
+'protectedinterface' => 'Această pagină asigură textul interfeței pentru software și este protejată pentru a preveni abuzurile.
+Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, utilizați [//translatewiki.net/ translatewiki.net], proiectul MediaWiki de localizare.',
 'editinginterface' => "'''Avertizare''': Modificați o pagină care este folosită pentru a furniza textul interfeței software.
-Modificările aduse acestei pagini vor afecta aspectul interfeței pentru alți utilizatori.
-Pentru traduceri, considerați utilizarea [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proiectul MediaWiki de localizare.",
+Modificările aduse acestei pagini vor afecta aspectul interfeței pentru alți utilizatori ai acestui wiki.
+Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, utilizați [//translatewiki.net/ translatewiki.net], proiectul MediaWiki de localizare.",
 'sqlhidden' => '(interogare SQL ascunsă)',
 'cascadeprotected' => 'Această pagină a fost protejată la scriere deoarece este inclusă în {{PLURAL:$1|următoarea pagină|următoarele pagini}}, care {{PLURAL:$1|este protejată|sunt protejate}} în cascadă:
 $2',
@@ -1844,7 +1845,7 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
 'backend-fail-internal' => 'O eroare necunoscută s-a produs în suportul de stocare „$1”.',
 'backend-fail-contenttype' => 'Nu s-a putut determina tipul de conținut al fișierului de stocat la „$1”.',
 'backend-fail-batchsize' => 'Suportul de stocare a furnizat un lot de $1 {{PLURAL:$1|operațiune|operațiuni|de operațiuni}} de fișier; limita este $2 {{PLURAL:$2|operațiune|operațiuni|de operațiuni}}.',
-'backend-fail-usable' => 'Imposibil de scris fișierul $1 din cauza permisiunilor insuficiente sau din cauza directoarelor/containerelor lipsă.',
+'backend-fail-usable' => 'Imposibil de citit sau scris fișierul „$1” din cauza permisiunilor insuficiente sau din cauza directoarelor/containerelor lipsă.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Imposibil de conectat la baza de date a jurnalului pentru terminatul de stocare „$1”.',
@@ -2253,7 +2254,7 @@ Protocoale suportate: <code>$1</code> (nu adăugați niciunul dintre acestea în
 
 # Special:ListGroupRights
 'listgrouprights' => 'Permisiuni grupuri de utilizatori',
-'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definită în aceast wiki, împreună cu permisiunile de acces asociate.
+'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definite în acest wiki, împreună cu permisiunile de acces asociate.
 Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații suplimentare]] despre permisiuni individuale.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Drept acordat</span>
 * <span class="listgrouprights-revoked">Drept revocat</span>',
index 638b8a6..09849ca 100644 (file)
@@ -1627,7 +1627,7 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'backend-fail-internal' => "'N'errore scanusciute s'à verificate jndr'à l'archivije de rrete \"\$1\".",
 'backend-fail-contenttype' => 'Non ge pozze capìe \'u tipe de condenute d\'u file da reggistrà sus a "$1".',
 'backend-fail-batchsize' => "L'archivije de rrete ha date 'nu processe de $1 {{PLURAL:$1|operazione|operaziune}} sus a le file; 'u limite jè $2 {{PLURAL:$2|operazione|operaziune}}.",
-'backend-fail-usable' => 'Non ge pozze scrivere \'u file "$1" purcé mangane le permesse sufficiende o non g\'esiste \'a cartelle/contenitore.',
+'backend-fail-usable' => 'Non ge pozze leggere o scrivere \'u file "$1" purcé mangane le permesse sufficiende o non g\'esiste \'a cartelle/condenitore.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non ge pozze collegà a l\'archivije d\'u database pe memorizzà \'u rrete "$1".',
@@ -2714,6 +2714,7 @@ Tutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[S
 'import-interwiki-templates' => 'Inglude tutte le template',
 'import-interwiki-submit' => "'Mborte",
 'import-interwiki-namespace' => 'Namespace de destinazione:',
+'import-interwiki-rootpage' => 'Pàgena prengepàale de destinazione (opzionale):',
 'import-upload-filename' => "Nome d'u file:",
 'import-comment' => 'Commende:',
 'importtext' => "Pe piacere esporte 'u file da 'a Uicchi sorgende ausanne l'[[Special:Export|utilità de esportazione]].
@@ -2751,6 +2752,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
 'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => "'A pàgene radice date tène 'nu titole invalide.",
+'import-rootpage-nosubpage' => 'Namespace "$1" d\'a pàgene prengepàle non ge permette le sottopàggene.',
 
 # Import log
 'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2920,6 +2922,7 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-redirects-name' => 'Redirezionaminde a sta pàgene',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Sottopàggene de sta pàgene',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ridirezionate|ridirezionate}}; $3 {{PLURAL:$3|none ridirezionate|none ridirezionate}})',
 'pageinfo-firstuser' => "Ccrejatore d'a pàgene",
 'pageinfo-firsttime' => "Date d'a ccrejazione d'a pàgene",
 'pageinfo-lastuser' => 'Urteme cangiatore',
@@ -2928,7 +2931,10 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-authors' => 'Numere Totale de autore diverse',
 'pageinfo-recent-edits' => "Numere de le urteme cangiaminde ('mbonde a $1)",
 'pageinfo-recent-authors' => 'Numere de le urteme autore diverse',
+'pageinfo-restriction' => "Protezione d'a pàgene ({{lcfirst:$1}})",
 'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorije|Categorije}} scunnute ($1)',
+'pageinfo-templates' => 'Esclude {{PLURAL:$1|template|template}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Classeche',
@@ -2994,6 +3000,8 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'file-info-png-looped' => 'infinite',
 'file-info-png-repeat' => 'eseguite $1 {{PLURAL:$1|vote|vote}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frame}}',
+'file-no-thumb-animation' => "'''Vide bbuène: Pe limitaziune tecniche, miniature de ste file non ge ponne essere animate.'''",
+'file-no-thumb-animation-gif' => "'''Vide bbuène: Pe limitaziune tecniche, miniature de resoluzione ierte de immaggine GIF cumme a queste non ge ponne essere animate.'''",
 
 # Special:NewFiles
 'newimages' => 'Gallerie de le fail nuève',
index 39ede3e..ed44b18 100644 (file)
@@ -1333,9 +1333,10 @@ $1",
 'revdelete-concurrent-change' => 'Ошибка изменения записи от $2, $1: её статус был изменён кем-то другим, пока вы пытались изменить его.
 Пожалуйста, проверьте журналы.',
 'revdelete-only-restricted' => 'Ошибка сокрытия записи от $2 $1: вы не можете скрыть запись от просмотра администраторами без выбора одной из других настроек сокрытия.',
-'revdelete-reason-dropdown' => 'Стандартные причины удаления
+'revdelete-reason-dropdown' => 'Стандартные причины удаления
 ** Нарушение авторских прав
-** Неуместные личные сведения',
+** Неуместные личные сведения
+** Потенциально клеветнические сведения',
 'revdelete-otherreason' => 'Другая/дополнительная причина:',
 'revdelete-reasonotherlist' => 'Другая причина',
 'revdelete-edit-reasonlist' => 'Править список причин',
@@ -1955,7 +1956,7 @@ $1',
 'backend-fail-internal' => 'Произошла неизвестная ошибка в хранилище «$1».',
 'backend-fail-contenttype' => 'Не удалось определить тип содержимого файла, чтобы сохранить его в «$1».',
 'backend-fail-batchsize' => 'Хранилище получило блок из $1 {{PLURAL:$1|файловой операции|файловых операций|файловых операций}}, ограничение составляет $2 {{PLURAL:$1|операцию|операции|файловых операций}}.',
-'backend-fail-usable' => 'Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ñ\84айл $1 из-за нехватки прав или отсутствия нужных папок.',
+'backend-fail-usable' => 'Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80оÑ\87иÑ\82аÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ñ\84айл Â«$1» из-за нехватки прав или отсутствия нужных папок.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не удалось подключиться к базе данных журнала для хранилища «$1».',
index a4152b9..fed2a63 100644 (file)
@@ -1197,7 +1197,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 
 # Diffs
 'history-title' => 'Historija izmjena stranice "$1"',
-'difference-title' => 'Razlike između iumjena na stranici "$1"',
+'difference-title' => 'Razlike između izmjena na stranici "$1"',
 'difference-title-multipage' => 'Razlika između stranica "$1" i "$2"',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Linija $1:',
@@ -1772,7 +1772,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
 'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
 'backend-fail-batchsize' => 'Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
-'backend-fail-usable' => 'Ne mogu snimiti datoteku $1 zbog nedovoljno dozvola ili nedostattnih direktorija/sadržaoca.',
+'backend-fail-usable' => 'Ne mogu pročitati ni snimiti datoteku $1 zbog nedovoljno dozvola ili nedostattnih direktorija/sadržaoca.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Ne mogu da se povežem s novinarskom bazom za skladišnu osnovu „$1“.',
index 50e5730..757c47d 100644 (file)
@@ -545,6 +545,10 @@ $1',
 'youhavenewmessages' => 'Máte $1 ($2).',
 'newmessageslink' => 'nové správy',
 'newmessagesdifflink' => 'posledná zmena',
+'youhavenewmessagesfromusers' => 'Máte $1 od {{PLURAL:$3|iného používateľa|$3 iných používateľov}} ($2).',
+'youhavenewmessagesmanyusers' => 'Máte $1 od viacerých ďalších používateľov ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novú správu|nové správy|nových správ}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posledná zmena|posledné zmeny}}',
 'youhavenewmessagesmulti' => 'Máte nové správy na $1',
 'editsection' => 'upraviť',
 'editold' => 'upraviť',
@@ -596,9 +600,9 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba v databáze',
-'dberrortext' => 'Nastala syntaktická chyba v príkaze na prehľadávanie databázy.
-To môže značiť chybu v softvéri.
-Posledná požiadavka na databázu bola:
+'dberrortext' => 'V databázovom dopyte sa vyskytla syntaktická chyba.
+Príčinou môže byť chyba v softvéri.
+Posledný dopyt bol:
 <blockquote><tt>$1</tt></blockquote>
 z funkcie „<tt>$2</tt>“.
 Databáza vrátila chybu „<tt>$3: $4</tt>“.',
@@ -956,10 +960,9 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'blocked-notice-logextract' => 'Tento používateľ je momentálne zablokovaný.
 Dolu je pre informáciu posledná položka zo záznamu blokovaní:',
 'clearyourcache' => "'''Poznámka:''' Aby sa zmeny prejavili, po uložení musíte vymazať vyrovnávaciu pamäť vášho prehliadača.
-* '''Mozilla Firefox / Safari:''' Držte stlačený ''Shift'' a kliknite na ''Reload'' alebo stlačte buď ''Ctrl-F5'' alebo ''Ctrl-R'' (''⌘-R'' na Mac)
+* '''Mozilla Firefox / Safari:''' Držte stlačený ''Shift'' a kliknite na ''Reload'' alebo stlačte buď ''Ctrl-F5'' alebo ''Ctrl-R'' (''⌘-R'' na Mac)
 * '''Google Chrome:''' Stlačte ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Mac)
 * '''Internet Explorer:''' Držte ''Ctrl'' a kliknite na ''Refresh'' alebo stlačte ''Ctrl-F5''
-* '''Konqueror:''' Kliknite na tlačidlo ''Reload'' alebo stlačte ''F5''
 * '''Opera:''' Vymazať vyrovnávaciu pamäť prehliadača v ponuke ''Tools→Preferences''",
 'usercssyoucanpreview' => "'''Tip:''' Váš nový CSS pred uložením otestujete stlačením tlačidla „{{int:showpreview}}“.",
 'userjsyoucanpreview' => "'''Tip:''' Váš nový JS pred uložením otestujete stlačením tlačidla „{{int:showpreview}}“.",
@@ -1208,9 +1211,11 @@ Nemáte k nej prístup.',
 'revdelete-concurrent-change' => 'Chyba pri zmene položky s dátumom $2, $1: zdá sa, že kým ste ju menili vykonal zmenu niekto iný.
 Pozrite sa prosím do záznamov.',
 'revdelete-only-restricted' => 'Chyba pri skrývaní položky s dátumom $2, $1: nemôžete skryť položku pred správcami bez toho, aby ste vybrali aj jednu z ďalších možností viditeľnosti.',
-'revdelete-reason-dropdown' => '*Bežné dôvody zmazania
+'revdelete-reason-dropdown' => '*Obvyklé dôvody zmazania
 ** Porušenie autorských práv
-** Nevhodné osobné informácie',
+** Nevhodné komentáre alebo osobné informácie
+** Nevhodné meno používateľa
+** Potenciálne hanlivé alebo ohováračské údaje',
 'revdelete-otherreason' => 'Ďalšie dôvody:',
 'revdelete-reasonotherlist' => 'Iný dôvod',
 'revdelete-edit-reasonlist' => 'Upraviť dôvody zmazania',
@@ -1827,7 +1832,7 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
 'backend-fail-internal' => 'Vyskytla sa neznáma chyba v úložisku „$1“.',
 'backend-fail-contenttype' => 'Nebolo možné určiť typ obsahu súboru, ktorý sa má uložiť na „$1“.',
 'backend-fail-batchsize' => 'Do úložiska bola zaslaná dávka s $1 {{PLURAL:$1|operáciou|operáciami}}; limit je $2 {{PLURAL:$2|operácia|operácie|operácií}}.',
-'backend-fail-usable' => 'Nie je možné zapísať súbor  $1  kvôli nedostatočným povoleniam alebo chýbajúcim adresárom/kontajnerom.',
+'backend-fail-usable' => 'Nie je možné čítať alebo zapísať súbor  $1  kvôli nedostatočným povoleniam alebo chýbajúcim adresárom/kontajnerom.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nepodarilo sa pripojiť k žurnálovej databáze úložiska „$1“.',
@@ -1956,6 +1961,7 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zdieľané úložisko',
+'upload-disallowed-here' => 'Ľutujeme, tento súbor nie je možné prepísať.',
 
 # File reversion
 'filerevert' => 'Obnoviť $1',
@@ -2062,6 +2068,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtov}}',
 'ncategories' => '$1 {{PLURAL:$1|kategória|kategórie|kategórií}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki odkaz|interwiki odkazy|interwiki odkazov}}',
 'nlinks' => '$1 {{PLURAL:$1|odkaz|odkazy|odkazov}}',
 'nmembers' => '$1 {{PLURAL:$1|člen|členovia|členov}}',
 'nrevisions' => '$1 {{PLURAL:$1|revízia|revízie|revízií}}',
@@ -2090,6 +2097,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 'mostlinkedtemplates' => 'Najčastejšie odkazované šablóny',
 'mostcategories' => 'Stránky s najväčším počtom kategórií',
 'mostimages' => 'Najčastejšie odkazované súbory',
+'mostinterwikis' => 'Stránky s najväčším počtom interwiki odkazov',
 'mostrevisions' => 'Stránky s najväčším počtom úprav',
 'prefixindex' => 'Všetky stránky s predponou',
 'prefixindex-namespace' => 'Všetky stránky s predponou (menný priestor $1)',
@@ -2236,6 +2244,8 @@ Môžete si prečítať [[{{MediaWiki:Listgrouprights-helppage}}|ďalšie inform
 'mailnologin' => 'Žiadna adresa na zaslanie',
 'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
 'emailuser' => 'E-mail tomuto používateľovi',
+'emailuser-title-target' => 'E-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}',
+'emailuser-title-notarget' => 'E-mail používateľovi',
 'emailpage' => 'E-mail používateľovi',
 'emailpagetext' => 'Ak tento používateľ zadal platnú emailovú adresu vo svojich nastaveniach,
 môžete mu pomocou nasledovného formulára poslať email.
@@ -3063,11 +3073,14 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 
 # Info page
 'pageinfo-title' => 'Informácie o „$1“',
-'pageinfo-header-edits' => 'Úpravy',
+'pageinfo-header-basic' => 'Základné údaje',
+'pageinfo-header-edits' => 'História úprav',
+'pageinfo-article-id' => 'ID stránky',
 'pageinfo-views' => 'Počet zobrazení',
 'pageinfo-watchers' => 'Počet sledovateľov',
-'pageinfo-edits' => 'Počet úprav',
-'pageinfo-authors' => 'Počet rôznych autorov',
+'pageinfo-lasttime' => 'Dátum poslednej úpravy',
+'pageinfo-edits' => 'Celkový počet úprav',
+'pageinfo-authors' => 'Celkový počet autorov',
 
 # Skin names
 'skinname-standard' => 'Klasický',
index af67c4a..c2c4237 100644 (file)
@@ -2024,6 +2024,7 @@ Sedaj je preusmeritev na [[$2]].',
 'mostlinkedtemplates' => 'Najbolj uporabljane predloge',
 'mostcategories' => 'Članki z največ kategorijami',
 'mostimages' => 'Najbolj uporabljane datoteke',
+'mostinterwikis' => 'Strani z največ medjezikovnimi povezavami',
 'mostrevisions' => 'Največkrat urejane strani',
 'prefixindex' => 'Vse strani s predpono',
 'prefixindex-namespace' => 'Vse strani s predpono (imenski prostor $1)',
@@ -2169,6 +2170,7 @@ Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]]
 'mailnologin' => 'Manjka naslov pošiljatelja',
 'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
 'emailuser' => 'Pošlji uporabniku e-pismo',
+'emailuser-title-notarget' => 'Pošlji uporabniku e-pismo',
 'emailpage' => 'Pošlji uporabniku e-pismo',
 'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku pošljete e-poštno sporočilo.
 E-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo prejemnik lahko odgovoril neposredno vam.',
@@ -2978,6 +2980,8 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-header-properties' => 'Lastnosti strani',
 'pageinfo-display-title' => 'Naslov za prikaz',
 'pageinfo-default-sort' => 'Privzeti ključ za razvrščanje',
+'pageinfo-length' => 'Dolžina strani (v bajtih)',
+'pageinfo-robot-policy' => 'Status iskalnega pogona',
 'pageinfo-views' => 'Število ogledov',
 'pageinfo-watchers' => 'Število spremljevalcev strani',
 'pageinfo-redirects-name' => 'Preusmeritve na stran',
@@ -2988,6 +2992,8 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-lasttime' => 'Datum zadnjega urejanja',
 'pageinfo-edits' => 'Skupno število urejanj',
 'pageinfo-authors' => 'Skupno število različnih avtorjev',
+'pageinfo-restriction' => 'Zaščita strani ({{lcfirst:$1}})',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrita kategorija|Skriti kategoriji|Skrite kategorije}} ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
index 218d486..347b300 100644 (file)
@@ -1347,7 +1347,8 @@ $1",
 'revdelete-only-restricted' => 'Грешка при сакривању ставке од $1, $2: не можете сакрити ставке од администратора без избора других могућности видљивости.',
 'revdelete-reason-dropdown' => '*Уобичајени разлози за брисање
 ** Кршење ауторског права
-** Неодговарајући лични подаци
+** Неприкладан коментар или лични подаци
+** Неприкладно корисничко име
 ** Увредљиви подаци',
 'revdelete-otherreason' => 'Други/додатни разлог:',
 'revdelete-reasonotherlist' => 'Други разлог',
@@ -1989,7 +1990,7 @@ $1',
 'backend-fail-internal' => 'Дошло је до непознате грешке у складишној основи „$1“.',
 'backend-fail-contenttype' => 'Не могу да утврдим какав садржај има датотека коју треба да сместим у „$1“.',
 'backend-fail-batchsize' => 'Складишна основа је добила блокаду од $1 {{PLURAL:$1|операције|операције|операција}}; ограничење је $2 {{PLURAL:$2|операција|операције|операција}}.',
-'backend-fail-usable' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 јер немате довољно дозвола или вам недостају фасцикле/садржаоци.',
+'backend-fail-usable' => 'Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оÑ\87иÑ\82ам Ð¸Ð»Ð¸ Ð·Ð°Ð¿Ð¸Ñ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c јер немате довољно дозвола или вам недостају фасцикле/садржаоци.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не могу да се повежем с новинарском базом за складишну основу „$1“.',
index c72f225..3bf2814 100644 (file)
@@ -1256,7 +1256,8 @@ Pogledajte istoriju.',
 'revdelete-only-restricted' => 'Greška pri sakrivanju stavke od $1, $2: ne možete sakriti stavke od administratora bez izbora drugih mogućnosti vidljivosti.',
 'revdelete-reason-dropdown' => '*Uobičajeni razlozi za brisanje
 ** Kršenje autorskog prava
-** Neodgovarajući lični podaci
+** Neprikladan komentar ili lični podaci
+** Neprikladno korisničko ime
 ** Uvredljivi podaci',
 'revdelete-otherreason' => 'Drugi/dodatni razlog:',
 'revdelete-reasonotherlist' => 'Drugi razlog',
@@ -1898,7 +1899,7 @@ Ako se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]
 'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
 'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
 'backend-fail-batchsize' => 'Skladišna osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograničenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
-'backend-fail-usable' => 'Ne mogu da zapišem datoteku $1 jer nemate dovoljno dozvola ili vam nedostaju fascikle/sadržaoci.',
+'backend-fail-usable' => 'Ne mogu da pročitam ili zapišem datoteku „$1“ jer nemate dovoljno dozvola ili vam nedostaju fascikle/sadržaoci.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Ne mogu da se povežem s novinarskom bazom za skladišnu osnovu „$1“.',
index e8e584b..ac40d29 100644 (file)
@@ -2006,7 +2006,7 @@ $1',
 'notanarticle' => 'ஒரு கட்டுரைப் பக்கமல்ல',
 'notvisiblerev' => 'திருத்தம் நீக்கப்பட்டுள்ளது',
 'watchnochange' => 'காட்சிப்படுத்தப்பட்ட கால இடைவெளியில், கவனிப்பிலுள்ள, உங்கள் விடயமெதுவும் தொகுக்கப்பட்டிருக்கவில்லை.',
-'watchlist-details' => 'பà¯\87à®\9aà¯\8dà®\9aà¯\81பà¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\88à®\95் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}',
+'watchlist-details' => 'பà¯\87à®\9aà¯\8dà®\9aà¯\81பà¯\8d à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\88த் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}',
 'wlheader-enotif' => '* மின்னஞ்சல் அறிவித்தல்கள் செயல்படுத்தப்பட்டுள்ளன.',
 'wlheader-showupdated' => "* உமது கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களால்''' காட்டப்பட்டுள்ளன",
 'watchmethod-recent' => 'கவனிக்கப்படுகின்ற பக்கங்களுக்காக, அண்மைய தொகுப்புகள் தேடிப் பார்க்கப்படுகிறன',
index ebab217..c15b40b 100644 (file)
@@ -213,7 +213,7 @@ $messages = array(
 'thursday' => 'Huwebes',
 'friday' => 'Biyernes',
 'saturday' => 'Sabado',
-'sun' => 'Lin',
+'sun' => 'Ling',
 'mon' => 'Lun',
 'tue' => 'Mar',
 'wed' => 'Miy',
@@ -360,7 +360,7 @@ $messages = array(
 'projectpage' => 'Tingnan ang pahina ng proyekto',
 'imagepage' => 'Tingnan ang pahina ng talaksan',
 'mediawikipage' => 'Tingnan ang pahina ng mensahe',
-'templatepage' => 'Tingnan ang pahina ng suleras',
+'templatepage' => 'Tingnan ang pahina ng padron',
 'viewhelppage' => 'Tingnan ang pahina ng tulong',
 'categorypage' => 'Tingnan ang pahina ng kategorya',
 'viewtalkpage' => 'Tingnan ang usapan',
@@ -426,9 +426,9 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'editsection' => 'baguhin',
 'editsection-brackets' => '[$1]',
 'editold' => 'baguhin',
-'viewsourceold' => 'tingnan ang pinagmulan',
+'viewsourceold' => 'tingnan ang batayan',
 'editlink' => 'baguhin',
-'viewsourcelink' => 'tingnan ang pinagmulan',
+'viewsourcelink' => 'tingnan ang batayan',
 'editsectionhint' => 'Baguhin ang seksiyon: $1',
 'toc' => 'Mga nilalaman',
 'showtoc' => 'ipakita',
@@ -438,13 +438,13 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'thisisdeleted' => 'Tingnan o ibalik ang $1?',
 'viewdeleted' => 'Tingnan ang $1?',
 'restorelink' => '{{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}',
-'feedlinks' => 'Subo/Karga:',
+'feedlinks' => 'Karga:',
 'feed-invalid' => 'Hindi tanggap na uri ng serbisyo ng pagpaparating.',
 'feed-unavailable' => 'Walang serbisyo mula sa sindikasyong pangpaglalathala',
-'site-rss-feed' => '$1 kargang RSS',
-'site-atom-feed' => '$1 kargang Atom',
-'page-rss-feed' => '"$1" kargang RSS',
-'page-atom-feed' => '"$1" kargang Atom',
+'site-rss-feed' => 'Kargang RSS ng $1',
+'site-atom-feed' => 'Kargang Atom ng $1',
+'page-rss-feed' => 'Kargang RSS ng "$1"',
+'page-atom-feed' => 'Kargang Atom ng "$1"',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (hindi umiiral ang pahina)',
@@ -459,7 +459,7 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'nstab-project' => 'Pahina ng proyekto',
 'nstab-image' => 'Talaksan',
 'nstab-mediawiki' => 'Mensahe',
-'nstab-template' => 'Suleras',
+'nstab-template' => 'Padron',
 'nstab-help' => 'Pahina ng tulong',
 'nstab-category' => 'Kategorya',
 
@@ -608,8 +608,8 @@ Paki-andar mo po ang mga ito, pagkatapos ay lumagda na gamit ang bago mong panga
 'nocookieslogin' => "Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') para mailagda ang mga tagagamit.
 Hindi mo pinagagana ang mga kuki.
 Paki-andar mo ang mga ito at sumubok uli.",
-'nocookiesfornew' => 'Hindi nalikha ang akawnt ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito.
-Tiyaking mayroon kang pinagaganang mga otap, ikargang muli ang pahinang ito at subuking muli.',
+'nocookiesfornew' => 'Hindi nalikha ang kuwenta ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito.
+Tiyaking mayroon kang pinagaganang mga kuki, ikarga muli ang pahinang ito at subukan muli.',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Hindi mo tinukoy ang isang tanggap na pangalan ng tagagamit.',
 'loginsuccesstitle' => 'Matagumpay ang paglagda',
@@ -640,19 +640,19 @@ Kung ibang tao ang humiling nito, o kung naalala mo na ang iyong hudyat,
 at hindi mo na ibig pang baguhin ito, maaari mong huwag pansinin ang mensaheng ito at
 magpatuloy sa paggamit ng iyong lumang hudyat.',
 'noemail' => 'Walang nakatalang adres ng e-liham para sa tagagamit na "$1".',
-'noemailcreate' => 'Kailangan mong magbigay ng may-bisang adres ng e-liham',
+'noemailcreate' => 'Kailangan mong magbigay ng may-bisang direksiyong e-liham',
 'passwordsent' => 'Isang bagong hudyat ang ipinadala sa adres ng e-liham na nakatala para kay "$1".
 Lumagda/Tumala lang po muli pagkaraan mong matanggap ito.',
 'blocked-mailpassword' => 'Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.',
-'eauthentsent' => 'Nagpadala ng isang e-liham na pangkompirmasyon doon sa iniharap na adres ng e-liham.
+'eauthentsent' => 'Nagpadala ng isang e-liham na pangkompirmasyon doon sa iniharap na direksiyong e-liham.
 Bago magpadala ng iba pang e-liham sa kuwenta, kailangan mong sundin ang mga tagubiling nasa loob ng e-liham, para mapatunayang iyo talaga ang kuwenta.',
 'throttled-mailpassword' => 'Nagpadala na ng isang paalalang panghudyat, nitong huling {{PLURAL:$1|oras|$1 oras}}.
 Para maiwasin ang pangaabuso, isang paalalang panghudyat lang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.',
 'mailerror' => 'Kamalian sa pagpapadala ng liham: $1',
-'acct_creation_throttle_hit' => 'Ang mga panauhin sa wiking ito na gumagamit ng adres ng IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.
-Bilang kinalabasan, ang mga panauhing gumagamit ng ganitong adres ng IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.',
+'acct_creation_throttle_hit' => 'Ang mga panauhin sa wiking ito na gumagamit ng direksiyong IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.
+Bilang kinalabasan, ang mga panauhing gumagamit ng ganitong direksiyong IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.',
 'emailauthenticated' => 'Napatunayan na ang iyong direksiyong e-liham sa $2 noong $3.',
-'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong adres ng e-liham.
+'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong direksiyong e-liham.
 Walang e-liham na ipapadala para sa anumang sumusunod na tampok na kasangkapang-katangian.',
 'noemailprefs' => 'Tumukoy ng isang direksiyong e-liham sa loob ng mga nais mo upang gumana ang mga kasangkapang-katangiang ito.',
 'emailconfirmlink' => 'Pakikompirma ang iyong direksiyong e-liham.',
@@ -793,7 +793,7 @@ Maaari kang makipag-ugnayan kay $1 o sa ibang [[{{MediaWiki:Grouppage-sysop}}|ta
 Hindi mo magagamit ang kasangkapang-katangiang 'magpadala ng e-liham sa tagagamit' hangga't hindi tinutukoy ang isang tanggap na direksiyong e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka pa hinaharangan/hinahadlangan sa paggamit nito.
 Ang kasalukuyan mong direksiyong IP ay $3, at ang ID ng pagharang/paghadlang ay #$5.
 Pakisama ang lahat ng mga detalye sa anumang mga pagtatanong na ginagawa/gagawin mo.",
-'autoblockedtext' => 'Kusang hinadlangan/hinarang ang adres ng IP mo dahil ginamit ito ng ibang tagagamit, na hinadlangan/hinarang ni $1.
+'autoblockedtext' => 'Kusang hinadlangan/hinarang ang direksiyong IP mo dahil ginamit ito ng ibang tagagamit, na hinadlangan/hinarang ni $1.
 Ang ibinigay na dahilan ay:
 
 :\'\'$2\'\'
@@ -804,9 +804,9 @@ Ang ibinigay na dahilan ay:
 
 Maaari kang makipagugnayan kay $1 o sa isa sa iba pang [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa]] para pagusapan ang paghadlang/pagharang.
 
-Pakitandaang hindi mo maaaring gamitin ang kasangkapang-katangiang "padalhan ng e-liham ang tagagamit na ito" maliban na lamang kung mayroon kang nakatalang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka hinadlangan sa paggamit nito.
+Pakitandaang hindi mo maaaring gamitin ang kasangkapang-katangiang "padalhan ng e-liham ang tagagamit na ito" maliban na lamang kung mayroon kang nakatalang tanggap na direksiyong e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka hinadlangan sa paggamit nito.
 
-Ang pangkasalukuyang adres mo ng IP ay $3, at ang ID ng pagharang ay #$5.
+Ang kasalukuyan mong direksiyong IP ay $3, at ang ID ng pagharang ay #$5.
 Pakisama ang lahat ng mga detalyeng nasa itaas sa anumang pagtatanong na gagawin mo.',
 'blockednoreason' => 'walang binigay na dahilan',
 'whitelistedittext' => 'Kailangan mong $1 para makapagbago ng mga pahina.',
@@ -919,7 +919,7 @@ Ang pinakahuling entrada sa talaan ay ibinigay sa baba para sa iyong pagsasanggu
 'cascadeprotectedwarning' => "'''Babala:''' Ikinandado ang pahinang ito upang tanging mga tagagamit na may mga karapatang pang-''sysop'' lamang ang makapagbago nito, dahil kabilang ito sa sumusunod na mga {{PLURAL:$1|pahinang|mga pahinang}} may baita-baitang na panananggalang:",
 'titleprotectedwarning' => "'''Babala:  Ikinandado ang pahinang ito upang [[Special:ListGroupRights|partikular na mga karapatan]] ang kakailanganin upang mailikha ito.'''
 Ang pinakahuling entrada sa talaan ay ibinigay sa baba para sa inyong pagsasangguni:",
-'templatesused' => '{{PLURAL:$1|Suleras|Mga suleras}} na ginagamit sa pahinang ito:',
+'templatesused' => '{{PLURAL:$1|Padron|Mga padron}} na ginagamit sa pahinang ito:',
 'templatesusedpreview' => '{{PLURAL:$1|Suleras|Mga suleras}} na ginagamit sa paunang-tinging ito:',
 'templatesusedsection' => '{{PLURAL:$1|Suleras|Mga suleras}} na ginamit sa seksyong ito:',
 'template-protected' => '(nakasanggalang)',
@@ -958,11 +958,11 @@ Umiiral na ito.',
 
 Dapat na mayroon itong mas mababa sa $2 {{PLURAL:$2|tawag|mga tawag}}, mayroon {{PLURAL:$1|ngayong $1 isang tawag|ngayong $1 mga tawag}}.',
 'expensive-parserfunction-category' => "Mga pahinang may napakaraming mga mamahaling tawag na pantungkulin ng banghay (''parser'')",
-'post-expand-template-inclusion-warning' => 'Babala: Napakalaki ng sukat ng saklaw ng suleras.
-Hindi isasama ang ilang mga suleras.',
-'post-expand-template-inclusion-category' => 'Mga pahina kung saan lumabis ang sukat ng saklaw ng suleras',
-'post-expand-template-argument-warning' => 'Babala: Naglalamang ang pahinang ito ng kahit isang pagaalitan ng suleras na napakalaki ng sukat ng paglawak.  Tinanggal ang mga alitang ito.',
-'post-expand-template-argument-category' => 'Mga pahinang naglalaman ng mga tinanggal na mga alitan ng suleras',
+'post-expand-template-inclusion-warning' => "'''Babala''': Napakalaki ng sukat ng saklaw ng padron.
+Hindi isasama ang ilang mga padron.",
+'post-expand-template-inclusion-category' => 'Mga pahina kung saan lumabis ang sukat ng saklaw ng padron',
+'post-expand-template-argument-warning' => 'Babala: Naglalamang ang pahinang ito ng kahit isang pagaalitan ng padron na napakalaki ng sukat ng paglawak.  Tinanggal ang mga alitang ito.',
+'post-expand-template-argument-category' => 'Mga pahinang naglalaman ng mga tinanggal na mga alitan ng padron',
 'parser-template-loop-warning' => 'Nadiskubreng silo ng suleras: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Lumabis na sa nakatakdang lalim ng rekursyon (pormula) ng suleras ($1)',
 'language-converter-depth-warning' => 'Lumampas sa ($1) ang hangganan ng lalim ng pampalit ng wika',
@@ -2909,7 +2909,7 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-ca-nstab-project' => 'Tingnan ang pahina ng proyekto',
 'tooltip-ca-nstab-image' => 'Tingnan ang pahina ng talaksan',
 'tooltip-ca-nstab-mediawiki' => 'Tingnan ang mensahe ng sistema',
-'tooltip-ca-nstab-template' => 'Tingnan ang suleras',
+'tooltip-ca-nstab-template' => 'Tingnan ang padron',
 'tooltip-ca-nstab-help' => 'Tingnan ang pahina ng tulong',
 'tooltip-ca-nstab-category' => 'Tingnan ang pahina ng kaurian/kategorya',
 'tooltip-minoredit' => 'Tandaan ito bilang isang maliit na pagbabago',
index eb0155c..6aaa52e 100644 (file)
@@ -1294,7 +1294,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'prevn-title' => 'Önceki $1 {{PLURAL:$1|sonuç|sonuç}}',
 'nextn-title' => 'Sonraki $1 {{PLURAL:$1|sonuç|sonuç}}',
 'shown-title' => 'Sayfa başına $1 {{PLURAL:$1|sonuç|sonuç}} göster',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) gör',
 'searchmenu-legend' => 'Arama seçenekleri',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
@@ -2096,8 +2096,8 @@ Lütfen unutmayın ki, diğer web siteleri bir dosyaya doğrudan bir URL ile ba
 'notargettext' => 'Bu fonksiyonu uygulamak için bir hedef sayfası ya da kullanıcısı belirtmediniz.',
 'nopagetitle' => 'Böyle bir hedef sayfası yok',
 'nopagetext' => 'Belirttiğiniz hedef sayfası mevcut değil.',
-'pager-newer-n' => '{{PLURAL:$1|1 daha yeni|$1 daha yeni}}',
-'pager-older-n' => '{{PLURAL:$1|1 daha eski|$1 daha eski}}',
+'pager-newer-n' => '$1 daha yeni',
+'pager-older-n' => '$1 daha eski',
 'suppress' => 'Gözetim',
 'querypage-disabled' => 'Bu özel sayfa, performansa dayalı nedenlerle devre dışı bırakılır.',
 
index e1213f4..3141506 100644 (file)
@@ -1915,7 +1915,7 @@ $1',
 'backend-fail-internal' => 'Сталася невідома помилка у сховищі рушія "$1".',
 'backend-fail-contenttype' => 'Не вдалося визначити тип вмісту файла, щоб зберегти його в "$1".',
 'backend-fail-batchsize' => 'Серверна частина отримала блок із $1 {{PLURAL:$1|файлової операції|файлових операцій}}; обмеження складає $2 {{PLURAL:$2|файлову операцію|файлові операції|файлових операцій}}.',
-'backend-fail-usable' => 'Файл $1 не може бути записано через недостатні повноваження чи відсутність каталогів (контейнерів).',
+'backend-fail-usable' => 'Файл «$1» не може бути прочитано чи записано через недостатні повноваження або відсутність каталогів (контейнерів).',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не вдалося підключитися до бази даних журналу для сховища «$1».',
@@ -2052,6 +2052,7 @@ $1',
 'shared-repo' => 'спільного сховища',
 'shared-repo-name-wikimediacommons' => 'Вікісховища',
 'filepage.css' => '/* Розміщений тут CSS-код розміщений на сторінці опису файла, також і для іноземних користувачів вікі */',
+'upload-disallowed-here' => 'На жаль Ви не можете перезаписати це зображення',
 
 # File reversion
 'filerevert' => 'Повернення до старої версії $1',
@@ -3165,6 +3166,9 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-header-edits' => 'Історія редагувань',
 'pageinfo-views' => 'Кількість переглядів',
 'pageinfo-watchers' => 'Кількість спостерігачів',
+'pageinfo-firsttime' => 'Дата створення сторінки',
+'pageinfo-lastuser' => 'Останній редактор',
+'pageinfo-lasttime' => 'Дата останньої правки',
 'pageinfo-edits' => 'Загальна кількість редагувань',
 'pageinfo-authors' => 'Загальна кількість унікальних авторів',
 
index 8d54d6e..8b762d9 100644 (file)
@@ -414,11 +414,11 @@ $messages = array(
 'category-empty' => "''Thể loại này hiện không có trang hay tập tin nào.''",
 'hidden-categories' => '{{PLURAL:$1|Thể loại ẩn|Thể loại ẩn}}',
 'hidden-category-category' => 'Thể loại ẩn',
-'category-subcat-count' => 'Thể loại này  {{PLURAL:$2|tiểu thể loại sau|{{PLURAL:$1||$1}} tiểu thể loại sau, trên tổng số $2 tiểu thể loại}}.',
-'category-subcat-count-limited' => 'Thể loại này có {{PLURAL:$1||$1}} tiểu thể loại sau.',
+'category-subcat-count' => 'Thể loại này gồm {{PLURAL:$2|tiểu thể loại sau|{{PLURAL:$1||$1}} tiểu thể loại sau, trên tổng số $2 tiểu thể loại}}.',
+'category-subcat-count-limited' => 'Thể loại này gồm {{PLURAL:$1|tiểu thể loại|$1 tiểu thể loại}} sau.',
 'category-article-count' => '{{PLURAL:$2|Thể loại này gồm trang sau.|{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại này, trên tổng số $2 trang.}}',
 'category-article-count-limited' => '{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại hiện hành.',
-'category-file-count' => '{{PLURAL:$2|Thể loại này  tập tin sau.|{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại này, trong tổng số $2 tập tin.}}',
+'category-file-count' => '{{PLURAL:$2|Thể loại này gồm tập tin sau.|{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại này, trong tổng số $2 tập tin.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại hiện hành.',
 'listingcontinuesabbrev' => '(tiếp theo)',
 'index-category' => 'Trang được ghi chỉ mục',
@@ -674,8 +674,8 @@ Truy vấn: $2',
 'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi.',
 'viewsourcetext' => 'Bạn vẫn có thể xem và chép xuống mã nguồn của trang này:',
 'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
-'protectedinterface' => 'Trang này cung cấp một thông báo trong giao diện phần mềm, và bị khóa để tránh phá hoại.',
-'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông báo giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng website này. Để dịch thuật, hãy xem xét sử dụng [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
+'protectedinterface' => 'Trang này cung cấp một thông báo trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
+'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông báo giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
 'sqlhidden' => '(đã giấu truy vấn SQL)',
 'cascadeprotected' => 'Trang này đã bị khóa không cho sửa đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} đã bị khóa với tùy chọn “khóa theo tầng” được kích hoạt:
 $2',
@@ -1839,7 +1839,7 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
 'backend-fail-internal' => 'Lỗi không rõ xuất hiện trong phía sau lưu trữ “$1”.',
 'backend-fail-contenttype' => 'Không thể xác định kiểu nội dung của tập tin để lưu giữ tại “$1”.',
 'backend-fail-batchsize' => 'Phía sau lưu trữ đã nhận một loạt $1 thao tác tập tin; mức hạn là $2 thao tác.',
-'backend-fail-usable' => 'Không thể ghi tập tin $1 vì không có đủ quyền hoặc những thư mục hay nơi đựng bị thiếu.',
+'backend-fail-usable' => 'Không thể đọc/ghi tập tin “$1” vì không có đủ quyền hoặc những thư mục hay nơi đựng bị thiếu.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Không thể kết nối với cơ sở dữ liệu nhật ký của phía sau lưu trữ “$1”.',
index b067087..ef7be4b 100644 (file)
@@ -630,7 +630,7 @@ $1',
 'unexpected' => '非正常值:“$1”=“$2”。',
 'formerror' => '错误:无法提交表单',
 'badarticleerror' => '无法在此页进行该操作。',
-'cannotdelete' => '无法删除页面或图像 "$1"
+'cannotdelete' => '无法删除页面或图像“$1”
 它可能已被其他人删除了。',
 'cannotdelete-title' => '无法删除“$1”',
 'delete-hook-aborted' => '删除被扩展钩子取消。钩子并没有给出解释。',
@@ -907,7 +907,6 @@ $2
 * '''火狐(Firefox)/Safari:'''按住“Shift”,同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
 * '''谷歌浏览器(Google Chrome):'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
 * '''Internet Explorer:'''按住“Ctrl”,同时单击“刷新”,或按“Ctrl-F5”
-* '''Konqueror:'''点击“刷新”或按“F5”
 * '''Opera:'''在“工具→首选项”中清除缓存",
 'usercssyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
 'userjsyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
@@ -1137,7 +1136,8 @@ $1",
 'revdelete-only-restricted' => '在隐藏$1 $2的项目时发生错误:您不能在选择了另一可见性选项后废止管理员查看该项目。',
 'revdelete-reason-dropdown' => '*常用删除理由
 ** 侵犯版权
-** 不合适的个人资料',
+** 不合适的个人资料
+** 潜在毁谤性信息',
 'revdelete-otherreason' => '其他/附加原因:',
 'revdelete-reasonotherlist' => '其他原因',
 'revdelete-edit-reasonlist' => '编辑删除埋由',
@@ -1729,7 +1729,7 @@ $1',
 'backend-fail-internal' => '存储后端“$1”发生了一个未知错误。',
 'backend-fail-contenttype' => '无法判断文件的内容类型来储存于“$1”。',
 'backend-fail-batchsize' => '存储后端被给予了一批$1个文件{{PLURAL:$1|操作|操作}};限值为$2个{{PLURAL:$2|操作|操作}}。',
-'backend-fail-usable' => '权限不足或缺少目录/贮存器,无法写入文件$1。',
+'backend-fail-usable' => '权限不足或缺少目录/贮存器,无法读取或写入文件“$1”。',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '无法连接到后端存储的日志数据库“$1”。',
@@ -1962,6 +1962,7 @@ $1',
 # Miscellaneous special pages
 'nbytes' => '$1字节',
 'ncategories' => '$1个分类',
+'ninterwikis' => '$1个跨语言链接',
 'nlinks' => '$1个链接',
 'nmembers' => '$1个成员',
 'nrevisions' => '$1个版本',
@@ -1990,6 +1991,7 @@ $1',
 'mostlinkedtemplates' => '最多链接模板',
 'mostcategories' => '最多分类页面',
 'mostimages' => '最多链接文件',
+'mostinterwikis' => '跨语言链接最多的页面',
 'mostrevisions' => '最多版本页面',
 'prefixindex' => '所有有前缀的页面',
 'prefixindex-namespace' => '所有有前缀的页面($1名字空间)',
@@ -2134,6 +2136,8 @@ $1',
 'mailnologin' => '无电邮地址',
 'mailnologintext' => '你必须[[Special:UserLogin|登录]]并在你的[[Special:Preferences|系统设置]]中拥有有效的电子邮件地址才能向其他用户发送电子邮件。',
 'emailuser' => '电邮联系',
+'emailuser-title-target' => '电邮联系该{{GENDER:$1|用户}}',
+'emailuser-title-notarget' => '电邮联系',
 'emailpage' => '电邮联系',
 'emailpagetext' => '你可以使用下面的表格向该用户发送电子邮件信息。你在[[Special:Preferences|你的系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。',
 'usermailererror' => 'Mail 对象返回错误:',
@@ -2783,6 +2787,8 @@ $1被封禁的理由是:“$2”',
 'import-error-special' => '页面“$1”未导入,因为它需要使用一个不能创建页面的特殊名字空间。',
 'import-error-invalid' => '页面“$1”未能导入,因为它的名字无效。',
 'import-options-wrong' => '{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>',
+'import-rootpage-invalid' => '根页面的标题无效。',
+'import-rootpage-nosubpage' => '名字空间为“$1”的根页面不允许子页面。',
 
 # Import log
 'importlogpage' => '导入日志',
@@ -2930,11 +2936,34 @@ $1被封禁的理由是:“$2”',
 
 # Info page
 'pageinfo-title' => '"$1" 的信息',
-'pageinfo-header-edits' => '编辑',
+'pageinfo-header-basic' => '基本信息',
+'pageinfo-header-edits' => '编辑历史',
+'pageinfo-header-restrictions' => '页面保护',
+'pageinfo-header-properties' => '页面属性',
+'pageinfo-display-title' => '显示的标题',
+'pageinfo-default-sort' => '默认排序键',
+'pageinfo-length' => '页面长度(字节)',
+'pageinfo-article-id' => '页面ID',
+'pageinfo-robot-policy' => '搜索引擎状态',
+'pageinfo-robot-index' => '可索引',
+'pageinfo-robot-noindex' => '不可索引',
 'pageinfo-views' => '视图的数量',
-'pageinfo-watchers' => '监视者数目',
-'pageinfo-edits' => '编辑数量',
-'pageinfo-authors' => '作者数量',
+'pageinfo-watchers' => '页面监视者人数',
+'pageinfo-redirects-name' => '重定向到本页',
+'pageinfo-subpages-name' => '本页的子页面',
+'pageinfo-subpages-value' => '$1 ($2个重定向;$3个非重定向)',
+'pageinfo-firstuser' => '页面创建者',
+'pageinfo-firsttime' => '页面创建日期',
+'pageinfo-lastuser' => '最近的编者',
+'pageinfo-lasttime' => '最后编辑的日期',
+'pageinfo-edits' => '编辑总计',
+'pageinfo-authors' => '不同作者总计',
+'pageinfo-recent-edits' => '最近的编辑数 ($1天内 )',
+'pageinfo-recent-authors' => '最近的不同作者数',
+'pageinfo-restriction' => '页面保护 ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '魔术字($1)',
+'pageinfo-hidden-categories' => '隐藏分类 ($1)',
+'pageinfo-templates' => '使用的模板 ($1)',
 
 # Skin names
 'skinname-standard' => '标准',
@@ -2977,7 +3006,7 @@ $1',
 # Media information
 'mediawarning' => "'''警告''':该文件类型可能包含恶意代码。
 运行它可能对您的系统带来危险。",
-'imagemaxsize' => "图像大小限制:<br />''(文件说明页面)''",
+'imagemaxsize' => '图像大小限制:<br /><u>(文件描述页)</u>',
 'thumbsize' => '缩略图大小:',
 'widthheightpage' => '$1×$2,$3页',
 'file-info' => '文件大小:$1,MIME类型:$2',
@@ -2985,6 +3014,7 @@ $1',
 'file-info-size-pages' => '$1×$2像素,文件大小:$3,MIME类型:$4,$5页',
 'file-nohires' => '没有更高的分辨率。',
 'svg-long-desc' => 'SVG文件,图像大小:$1 × $2像素,文件大小:$3',
+'svg-long-desc-animated' => '动画SVG文件,图像大小为$1 × $2像素,文件大小:$3',
 'show-big-image' => '完全分辨率',
 'show-big-image-preview' => '本预览的大小:$1。',
 'show-big-image-other' => '其他{{PLURAL:$2|分辨率}}:$1。',
@@ -2994,6 +3024,8 @@ $1',
 'file-info-png-looped' => '循环',
 'file-info-png-repeat' => '已播放$1遍',
 'file-info-png-frames' => '$1帧',
+'file-no-thumb-animation' => "'''注意:由于技术限制,该文件的缩略图无法进行动画处理。'''",
+'file-no-thumb-animation-gif' => "'''注意:由于技术限制,高分辨率GIF图像的缩略图无法进行动画处理。'''",
 
 # Special:NewFiles
 'newimages' => '新文件库',
index a3c5b5d..a2e850f 100644 (file)
@@ -569,7 +569,7 @@ $1',
 'unexpected' => '不正常值:"$1"="$2"。',
 'formerror' => '錯誤:無法提交表單',
 'badarticleerror' => '無法在此頁進行該操作。',
-'cannotdelete' => '無法刪除頁面或圖片"$1"
+'cannotdelete' => '無法刪除頁面或圖片“$1”
 它可能已經被其他人刪除了。',
 'cannotdelete-title' => '無法刪除“$1”',
 'delete-hook-aborted' => '刪除被勾點中止。
@@ -1701,7 +1701,7 @@ $1',
 'backend-fail-internal' => '存儲後方“$1”發生了一個未知錯誤。',
 'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1”。',
 'backend-fail-batchsize' => '存儲後端被給予了$1次檔𣗈 {{PLURAL:$1|操作|操作}} ;限制是$2次{{PLURAL:$2|操作|操作}}。',
-'backend-fail-usable' => '由於沒有足夠的權限或缺少路徑/容器,所以無法寫å\85¥æª\94ð£\97\88 $1 ã\80\82',
+'backend-fail-usable' => '由於沒有足夠的權限或缺少路徑/容器,所以無法è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 $1 ã\80\82',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '無法連接到後端存儲的日誌資料庫" $1 "。',
index ec89cd7..cff77b2 100644 (file)
@@ -1068,7 +1068,7 @@ abstract class Maintenance {
         */
        private function lockSearchindex( &$db ) {
                $write = array( 'searchindex' );
-               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache' );
+               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user' );
                $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
        }
 
index 31d517f..d974149 100644 (file)
@@ -52,7 +52,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 
                $end = microtime( true );
 
-               echo "Delete: " . $end - $start;
+               echo "Delete: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
                echo "\r\n";
 
                $this->insertData( $dbw );
@@ -63,7 +63,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 
                $end = microtime( true );
 
-               echo "Truncate: " . $end - $start;
+               echo "Truncate: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
                echo "\r\n";
 
                $dbw->dropTable( 'test' );
index 9de7610..fdb016f 100644 (file)
@@ -71,8 +71,8 @@ class BenchmarkHooks extends Benchmarker {
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
-               return sprintf( "Took %6.2fs",
-                       $pertrial );
+               return sprintf( "Took %6.3fms",
+                       $pertrial * 1000 );
        }
 
        /**
index b7dd119..973ef3d 100644 (file)
 /*!
- * jQuery JavaScript Library v1.7.2
+ * jQuery JavaScript Library v1.8.1
  * http://jquery.com/
  *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
  * Includes Sizzle.js
  * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Wed Mar 21 12:46:34 2012 -0700
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
  */
 (function( window, undefined ) {
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+       location = window.location,
+       navigator = window.navigator,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // Save a reference to some core methods
+       core_push = Array.prototype.push,
+       core_slice = Array.prototype.slice,
+       core_indexOf = Array.prototype.indexOf,
+       core_toString = Object.prototype.toString,
+       core_hasOwn = Object.prototype.hasOwnProperty,
+       core_trim = String.prototype.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+       // Used for detecting and trimming whitespace
+       core_rnotwhite = /\S/,
+       core_rspace = /\s+/,
+
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // The ready event handler and self cleanup method
+       DOMContentLoaded = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       jQuery.ready();
+               } else if ( document.readyState === "complete" ) {
+                       // we're here because readyState === "complete" in oldIE
+                       // which is good enough for us to call the dom ready!
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       },
 
-// Use the correct document accordingly with window argument (sandbox)
-       var document = window.document,
-               navigator = window.navigator,
-               location = window.location;
-       var jQuery = (function() {
-
-// Define a local copy of jQuery
-               var jQuery = function( selector, context ) {
-                               // The jQuery object is actually just the init constructor 'enhanced'
-                               return new jQuery.fn.init( selector, context, rootjQuery );
-                       },
-
-               // Map over jQuery in case of overwrite
-                       _jQuery = window.jQuery,
-
-               // Map over the $ in case of overwrite
-                       _$ = window.$,
-
-               // A central reference to the root jQuery(document)
-                       rootjQuery,
-
-               // A simple way to check for HTML strings or ID strings
-               // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-                       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-               // Check if a string has a non-whitespace character in it
-                       rnotwhite = /\S/,
-
-               // Used for trimming whitespace
-                       trimLeft = /^\s+/,
-                       trimRight = /\s+$/,
-
-               // Match a standalone tag
-                       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
-               // JSON RegExp
-                       rvalidchars = /^[\],:{}\s]*$/,
-                       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-                       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-                       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-               // Useragent RegExp
-                       rwebkit = /(webkit)[ \/]([\w.]+)/,
-                       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-                       rmsie = /(msie) ([\w.]+)/,
-                       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+       // [[Class]] -> type pairs
+       class2type = {};
 
-               // Matches dashed string for camelizing
-                       rdashAlpha = /-([a-z]|[0-9])/ig,
-                       rmsPrefix = /^-ms-/,
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
 
-               // Used by jQuery.camelCase as callback to replace()
-                       fcamelCase = function( all, letter ) {
-                               return ( letter + "" ).toUpperCase();
-                       },
+               // Handle $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
 
-               // Keep a UserAgent string for use with jQuery.browser
-                       userAgent = navigator.userAgent,
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
 
-               // For matching the engine and version of the browser
-                       browserMatch,
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
 
-               // The deferred used on DOM ready
-                       readyList,
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
 
-               // The ready event handler
-                       DOMContentLoaded,
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
 
-               // Save a reference to some core methods
-                       toString = Object.prototype.toString,
-                       hasOwn = Object.prototype.hasOwnProperty,
-                       push = Array.prototype.push,
-                       slice = Array.prototype.slice,
-                       trim = String.prototype.trim,
-                       indexOf = Array.prototype.indexOf,
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
 
-               // [[Class]] -> type pairs
-                       class2type = {};
+                                       // scripts is true for back-compat
+                                       selector = jQuery.parseHTML( match[1], doc, true );
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               this.attr.call( selector, context, true );
+                                       }
 
-               jQuery.fn = jQuery.prototype = {
-                       constructor: jQuery,
-                       init: function( selector, context, rootjQuery ) {
-                               var match, elem, ret, doc;
+                                       return jQuery.merge( this, selector );
 
-                               // Handle $(""), $(null), or $(undefined)
-                               if ( !selector ) {
-                                       return this;
-                               }
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
 
-                               // Handle $(DOMElement)
-                               if ( selector.nodeType ) {
-                                       this.context = this[0] = selector;
-                                       this.length = 1;
-                                       return this;
-                               }
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
 
-                               // The body element only exists once, optimize finding it
-                               if ( selector === "body" && !context && document.body ) {
                                        this.context = document;
-                                       this[0] = document.body;
                                        this.selector = selector;
-                                       this.length = 1;
                                        return this;
                                }
 
-                               // Handle HTML strings
-                               if ( typeof selector === "string" ) {
-                                       // Are we dealing with HTML string or an ID?
-                                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-                                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                                               match = [ null, selector, null ];
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
 
-                                       } else {
-                                               match = quickExpr.exec( selector );
-                                       }
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
 
-                                       // Verify a match, and that no context was specified for #id
-                                       if ( match && (match[1] || !context) ) {
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
 
-                                               // HANDLE: $(html) -> $(array)
-                                               if ( match[1] ) {
-                                                       context = context instanceof jQuery ? context[0] : context;
-                                                       doc = ( context ? context.ownerDocument || context : document );
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
 
-                                                       // If a single string is passed in and it's a single tag
-                                                       // just do a createElement and skip the rest
-                                                       ret = rsingleTag.exec( selector );
+               return jQuery.makeArray( selector, this );
+       },
 
-                                                       if ( ret ) {
-                                                               if ( jQuery.isPlainObject( context ) ) {
-                                                                       selector = [ document.createElement( ret[1] ) ];
-                                                                       jQuery.fn.attr.call( selector, context, true );
+       // Start with an empty selector
+       selector: "",
 
-                                                               } else {
-                                                                       selector = [ doc.createElement( ret[1] ) ];
-                                                               }
+       // The current version of jQuery being used
+       jquery: "1.8.1",
 
-                                                       } else {
-                                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
-                                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
-                                                       }
+       // The default length of a jQuery object is 0
+       length: 0,
 
-                                                       return jQuery.merge( this, selector );
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
 
-                                                       // HANDLE: $("#id")
-                                               } else {
-                                                       elem = document.getElementById( match[2] );
-
-                                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                                       // nodes that are no longer in the document #6963
-                                                       if ( elem && elem.parentNode ) {
-                                                               // Handle the case where IE and Opera return items
-                                                               // by name instead of ID
-                                                               if ( elem.id !== match[2] ) {
-                                                                       return rootjQuery.find( selector );
-                                                               }
+       toArray: function() {
+               return core_slice.call( this );
+       },
 
-                                                               // Otherwise, we inject the element directly into the jQuery object
-                                                               this.length = 1;
-                                                               this[0] = elem;
-                                                       }
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
 
-                                                       this.context = document;
-                                                       this.selector = selector;
-                                                       return this;
-                                               }
+                       // Return a 'clean' array
+                       this.toArray() :
 
-                                               // HANDLE: $(expr, $(...))
-                                       } else if ( !context || context.jquery ) {
-                                               return ( context || rootjQuery ).find( selector );
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
 
-                                               // HANDLE: $(expr, context)
-                                               // (which is just equivalent to: $(context).find(expr)
-                                       } else {
-                                               return this.constructor( context ).find( selector );
-                                       }
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
 
-                                       // HANDLE: $(function)
-                                       // Shortcut for document ready
-                               } else if ( jQuery.isFunction( selector ) ) {
-                                       return rootjQuery.ready( selector );
-                               }
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
 
-                               if ( selector.selector !== undefined ) {
-                                       this.selector = selector.selector;
-                                       this.context = selector.context;
-                               }
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
 
-                               return jQuery.makeArray( selector, this );
-                       },
+               ret.context = this.context;
 
-                       // Start with an empty selector
-                       selector: "",
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
 
-                       // The current version of jQuery being used
-                       jquery: "1.7.2",
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               i = +i;
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ),
+                       "slice", core_slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
 
-                       // The default length of a jQuery object is 0
-                       length: 0,
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
 
-                       // The number of elements contained in the matched element set
-                       size: function() {
-                               return this.length;
-                       },
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
 
-                       toArray: function() {
-                               return slice.call( this, 0 );
-                       },
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
 
-                       // Get the Nth element in the matched element set OR
-                       // Get the whole matched element set as a clean array
-                       get: function( num ) {
-                               return num == null ?
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
 
-                                       // Return a 'clean' array
-                                       this.toArray() :
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
 
-                                       // Return just the object
-                                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
-                       },
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
 
-                       // Take an array of elements and push it onto the stack
-                       // (returning the new matched element set)
-                       pushStack: function( elems, name, selector ) {
-                               // Build a new jQuery matched element set
-                               var ret = this.constructor();
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
 
-                               if ( jQuery.isArray( elems ) ) {
-                                       push.apply( ret, elems );
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
 
-                               } else {
-                                       jQuery.merge( ret, elems );
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
                                }
+                       }
+               }
+       }
 
-                               // Add the old object onto the stack (as a reference)
-                               ret.prevObject = this;
+       // Return the modified object
+       return target;
+};
 
-                               ret.context = this.context;
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
 
-                               if ( name === "find" ) {
-                                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-                               } else if ( name ) {
-                                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-                               }
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
 
-                               // Return the newly-formed element set
-                               return ret;
-                       },
+               return jQuery;
+       },
 
-                       // Execute a callback for every element in the matched set.
-                       // (You can seed the arguments with an array of args, but this is
-                       // only used internally.)
-                       each: function( callback, args ) {
-                               return jQuery.each( this, callback, args );
-                       },
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
 
-                       ready: function( fn ) {
-                               // Attach the listeners
-                               jQuery.bindReady();
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
 
-                               // Add the callback
-                               readyList.add( fn );
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
 
-                               return this;
-                       },
+       // Handle when the DOM is ready
+       ready: function( wait ) {
 
-                       eq: function( i ) {
-                               i = +i;
-                               return i === -1 ?
-                                       this.slice( i ) :
-                                       this.slice( i, i + 1 );
-                       },
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
 
-                       first: function() {
-                               return this.eq( 0 );
-                       },
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready, 1 );
+               }
 
-                       last: function() {
-                               return this.eq( -1 );
-                       },
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
 
-                       slice: function() {
-                               return this.pushStack( slice.apply( this, arguments ),
-                                       "slice", slice.call(arguments).join(",") );
-                       },
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
 
-                       map: function( callback ) {
-                               return this.pushStack( jQuery.map(this, function( elem, i ) {
-                                       return callback.call( elem, i, elem );
-                               }));
-                       },
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
 
-                       end: function() {
-                               return this.prevObject || this.constructor(null);
-                       },
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       isWindow: function( obj ) {
+               return obj != null && obj == obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ core_toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
 
-                       // For internal use only.
-                       // Behaves like an Array's method, not like a jQuery method.
-                       push: push,
-                       sort: [].sort,
-                       splice: [].splice
-               };
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
 
-// Give the init function the jQuery prototype for later instantiation
-               jQuery.fn.init.prototype = jQuery.fn;
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
 
-               jQuery.extend = jQuery.fn.extend = function() {
-                       var options, name, src, copy, copyIsArray, clone,
-                               target = arguments[0] || {},
-                               i = 1,
-                               length = arguments.length,
-                               deep = false;
+               var key;
+               for ( key in obj ) {}
 
-                       // Handle a deep copy situation
-                       if ( typeof target === "boolean" ) {
-                               deep = target;
-                               target = arguments[1] || {};
-                               // skip the boolean and the target
-                               i = 2;
-                       }
+               return key === undefined || core_hasOwn.call( obj, key );
+       },
 
-                       // Handle case when target is a string or something (possible in deep copy)
-                       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-                               target = {};
-                       }
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // scripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, scripts ) {
+               var parsed;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       scripts = context;
+                       context = 0;
+               }
+               context = context || document;
 
-                       // extend jQuery itself if only one argument is passed
-                       if ( length === i ) {
-                               target = this;
-                               --i;
-                       }
+               // Single tag
+               if ( (parsed = rsingleTag.exec( data )) ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
 
-                       for ( ; i < length; i++ ) {
-                               // Only deal with non-null/undefined values
-                               if ( (options = arguments[ i ]) != null ) {
-                                       // Extend the base object
-                                       for ( name in options ) {
-                                               src = target[ name ];
-                                               copy = options[ name ];
-
-                                               // Prevent never-ending loop
-                                               if ( target === copy ) {
-                                                       continue;
-                                               }
+               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+               return jQuery.merge( [],
+                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+       },
 
-                                               // Recurse if we're merging plain objects or arrays
-                                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-                                                       if ( copyIsArray ) {
-                                                               copyIsArray = false;
-                                                               clone = src && jQuery.isArray(src) ? src : [];
+       parseJSON: function( data ) {
+               if ( !data || typeof data !== "string") {
+                       return null;
+               }
 
-                                                       } else {
-                                                               clone = src && jQuery.isPlainObject(src) ? src : {};
-                                                       }
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
 
-                                                       // Never move original objects, clone them
-                                                       target[ name ] = jQuery.extend( deep, clone, copy );
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
 
-                                                       // Don't bring in undefined values
-                                               } else if ( copy !== undefined ) {
-                                                       target[ name ] = copy;
-                                               }
-                                       }
-                               }
-                       }
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
 
-                       // Return the modified object
-                       return target;
-               };
+                       return ( new Function( "return " + data ) )();
 
-               jQuery.extend({
-                       noConflict: function( deep ) {
-                               if ( window.$ === jQuery ) {
-                                       window.$ = _$;
-                               }
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
 
-                               if ( deep && window.jQuery === jQuery ) {
-                                       window.jQuery = _jQuery;
-                               }
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && core_rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
 
-                               return jQuery;
-                       },
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
 
-                       // Is the DOM ready to be used? Set to true once it occurs.
-                       isReady: false,
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+       },
 
-                       // A counter to track how many items to wait for before
-                       // the ready event fires. See #6781
-                       readyWait: 1,
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var name,
+                       i = 0,
+                       length = obj.length,
+                       isObj = length === undefined || jQuery.isFunction( obj );
 
-                       // Hold (or release) the ready event
-                       holdReady: function( hold ) {
-                               if ( hold ) {
-                                       jQuery.readyWait++;
-                               } else {
-                                       jQuery.ready( true );
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                                               break;
+                                       }
                                }
-                       },
-
-                       // Handle when the DOM is ready
-                       ready: function( wait ) {
-                               // Either a released hold or an DOMready/load event and not yet ready
-                               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
-                                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                                       if ( !document.body ) {
-                                               return setTimeout( jQuery.ready, 1 );
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                                               break;
                                        }
+                               }
+                       }
 
-                                       // Remember that the DOM is ready
-                                       jQuery.isReady = true;
-
-                                       // If a normal DOM Ready event fired, decrement, and wait if need be
-                                       if ( wait !== true && --jQuery.readyWait > 0 ) {
-                                               return;
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+                                               break;
                                        }
-
-                                       // If there are functions bound, to execute
-                                       readyList.fireWith( document, [ jQuery ] );
-
-                                       // Trigger any bound ready events
-                                       if ( jQuery.fn.trigger ) {
-                                               jQuery( document ).trigger( "ready" ).off( "ready" );
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                                               break;
                                        }
                                }
-                       },
+                       }
+               }
 
-                       bindReady: function() {
-                               if ( readyList ) {
-                                       return;
-                               }
+               return obj;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               core_trim.call( text );
+               } :
 
-                               readyList = jQuery.Callbacks( "once memory" );
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               text.toString().replace( rtrim, "" );
+               },
 
-                               // Catch cases where $(document).ready() is called after the
-                               // browser event has already occurred.
-                               if ( document.readyState === "complete" ) {
-                                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                                       return setTimeout( jQuery.ready, 1 );
-                               }
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var type,
+                       ret = results || [];
 
-                               // Mozilla, Opera and webkit nightlies currently support this event
-                               if ( document.addEventListener ) {
-                                       // Use the handy event callback
-                                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               if ( arr != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       type = jQuery.type( arr );
 
-                                       // A fallback to window.onload, that will always work
-                                       window.addEventListener( "load", jQuery.ready, false );
+                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+                               core_push.call( ret, arr );
+                       } else {
+                               jQuery.merge( ret, arr );
+                       }
+               }
 
-                                       // If IE event model is used
-                               } else if ( document.attachEvent ) {
-                                       // ensure firing before onload,
-                                       // maybe late but safe also for iframes
-                                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+               return ret;
+       },
 
-                                       // A fallback to window.onload, that will always work
-                                       window.attachEvent( "onload", jQuery.ready );
+       inArray: function( elem, arr, i ) {
+               var len;
 
-                                       // If IE and not a frame
-                                       // continually check to see if the document is ready
-                                       var toplevel = false;
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
+                       }
 
-                                       try {
-                                               toplevel = window.frameElement == null;
-                                       } catch(e) {}
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 
-                                       if ( document.documentElement.doScroll && toplevel ) {
-                                               doScrollCheck();
-                                       }
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
                                }
-                       },
-
-                       // See test/unit/core.js for details concerning isFunction.
-                       // Since version 1.3, DOM methods and functions like alert
-                       // aren't supported. They return false on IE (#2968).
-                       isFunction: function( obj ) {
-                               return jQuery.type(obj) === "function";
-                       },
+                       }
+               }
 
-                       isArray: Array.isArray || function( obj ) {
-                               return jQuery.type(obj) === "array";
-                       },
+               return -1;
+       },
 
-                       isWindow: function( obj ) {
-                               return obj != null && obj == obj.window;
-                       },
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
 
-                       isNumeric: function( obj ) {
-                               return !isNaN( parseFloat(obj) ) && isFinite( obj );
-                       },
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
 
-                       type: function( obj ) {
-                               return obj == null ?
-                                       String( obj ) :
-                                       class2type[ toString.call(obj) ] || "object";
-                       },
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
 
-                       isPlainObject: function( obj ) {
-                               // Must be an Object.
-                               // Because of IE, we also have to check the presence of the constructor property.
-                               // Make sure that DOM nodes and window objects don't pass through, as well
-                               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-                                       return false;
-                               }
+               first.length = i;
 
-                               try {
-                                       // Not own constructor property must be Object
-                                       if ( obj.constructor &&
-                                               !hasOwn.call(obj, "constructor") &&
-                                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-                                               return false;
-                                       }
-                               } catch ( e ) {
-                                       // IE8,9 Will throw exceptions on certain host objects #9897
-                                       return false;
-                               }
+               return first;
+       },
 
-                               // Own properties are enumerated firstly, so to speed up,
-                               // if last one is own, then all properties are own.
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
 
-                               var key;
-                               for ( key in obj ) {}
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
 
-                               return key === undefined || hasOwn.call( obj, key );
-                       },
+               return ret;
+       },
 
-                       isEmptyObject: function( obj ) {
-                               for ( var name in obj ) {
-                                       return false;
-                               }
-                               return true;
-                       },
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key,
+                       ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
 
-                       error: function( msg ) {
-                               throw new Error( msg );
-                       },
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
 
-                       parseJSON: function( data ) {
-                               if ( typeof data !== "string" || !data ) {
-                                       return null;
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
                                }
+                       }
 
-                               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-                               data = jQuery.trim( data );
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
 
-                               // Attempt to parse using the native JSON parser first
-                               if ( window.JSON && window.JSON.parse ) {
-                                       return window.JSON.parse( data );
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
                                }
+                       }
+               }
 
-                               // Make sure the incoming data is actual JSON
-                               // Logic borrowed from http://json.org/json2.js
-                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                                       .replace( rvalidtokens, "]" )
-                                       .replace( rvalidbraces, "")) ) {
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
 
-                                       return ( new Function( "return " + data ) )();
+       // A global GUID counter for objects
+       guid: 1,
 
-                               }
-                               jQuery.error( "Invalid JSON: " + data );
-                       },
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
 
-                       // Cross-browser xml parsing
-                       parseXML: function( data ) {
-                               if ( typeof data !== "string" || !data ) {
-                                       return null;
-                               }
-                               var xml, tmp;
-                               try {
-                                       if ( window.DOMParser ) { // Standard
-                                               tmp = new DOMParser();
-                                               xml = tmp.parseFromString( data , "text/xml" );
-                                       } else { // IE
-                                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                                               xml.async = "false";
-                                               xml.loadXML( data );
-                                       }
-                               } catch( e ) {
-                                       xml = undefined;
-                               }
-                               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-                                       jQuery.error( "Invalid XML: " + data );
-                               }
-                               return xml;
-                       },
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
 
-                       noop: function() {},
-
-                       // Evaluates a script in a global context
-                       // Workarounds based on findings by Jim Driscoll
-                       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-                       globalEval: function( data ) {
-                               if ( data && rnotwhite.test( data ) ) {
-                                       // We use execScript on Internet Explorer
-                                       // We use an anonymous function so that context is window
-                                       // rather than jQuery in Firefox
-                                       ( window.execScript || function( data ) {
-                                               window[ "eval" ].call( window, data );
-                                       } )( data );
-                               }
-                       },
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
 
-                       // Convert dashed to camelCase; used by the css and data modules
-                       // Microsoft forgot to hump their vendor prefix (#9572)
-                       camelCase: function( string ) {
-                               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-                       },
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+               };
 
-                       nodeName: function( elem, name ) {
-                               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-                       },
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
 
-                       // args is for internal usage only
-                       each: function( object, callback, args ) {
-                               var name, i = 0,
-                                       length = object.length,
-                                       isObj = length === undefined || jQuery.isFunction( object );
+               return proxy;
+       },
 
-                               if ( args ) {
-                                       if ( isObj ) {
-                                               for ( name in object ) {
-                                                       if ( callback.apply( object[ name ], args ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       } else {
-                                               for ( ; i < length; ) {
-                                                       if ( callback.apply( object[ i++ ], args ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       }
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+               var exec,
+                       bulk = key == null,
+                       i = 0,
+                       length = elems.length;
+
+               // Sets many values
+               if ( key && typeof key === "object" ) {
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+                       }
+                       chainable = 1;
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = pass === undefined && jQuery.isFunction( value );
+
+                       if ( bulk ) {
+                               // Bulk operations only iterate when executing function values
+                               if ( exec ) {
+                                       exec = fn;
+                                       fn = function( elem, key, value ) {
+                                               return exec.call( jQuery( elem ), value );
+                                       };
 
-                                       // A special, fast, case for the most common use of each
+                               // Otherwise they run against the entire set
                                } else {
-                                       if ( isObj ) {
-                                               for ( name in object ) {
-                                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       } else {
-                                               for ( ; i < length; ) {
-                                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                                       fn.call( elems, value );
+                                       fn = null;
                                }
+                       }
 
-                               return object;
-                       },
+                       if ( fn ) {
+                               for (; i < length; i++ ) {
+                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               }
+                       }
 
-                       // Use native String.trim function wherever possible
-                       trim: trim ?
-                               function( text ) {
-                                       return text == null ?
-                                               "" :
-                                               trim.call( text );
-                               } :
-
-                               // Otherwise use our own trimming functionality
-                               function( text ) {
-                                       return text == null ?
-                                               "" :
-                                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
-                               },
+                       chainable = 1;
+               }
 
-                       // results is for internal usage only
-                       makeArray: function( array, results ) {
-                               var ret = results || [];
+               return chainable ?
+                       elems :
 
-                               if ( array != null ) {
-                                       // The window, strings (and functions) also have 'length'
-                                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                                       var type = jQuery.type( array );
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
 
-                                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-                                               push.call( ret, array );
-                                       } else {
-                                               jQuery.merge( ret, array );
-                                       }
-                               }
+       now: function() {
+               return ( new Date() ).getTime();
+       }
+});
 
-                               return ret;
-                       },
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
 
-                       inArray: function( elem, array, i ) {
-                               var len;
+               readyList = jQuery.Deferred();
 
-                               if ( array ) {
-                                       if ( indexOf ) {
-                                               return indexOf.call( array, elem, i );
-                                       }
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready, 1 );
 
-                                       len = array.length;
-                                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
-                                       for ( ; i < len; i++ ) {
-                                               // Skip accessing in sparse arrays
-                                               if ( i in array && array[ i ] === elem ) {
-                                                       return i;
-                                               }
-                                       }
-                               }
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
 
-                               return -1;
-                       },
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
-                       merge: function( first, second ) {
-                               var i = first.length,
-                                       j = 0;
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
 
-                               if ( typeof second.length === "number" ) {
-                                       for ( var l = second.length; j < l; j++ ) {
-                                               first[ i++ ] = second[ j ];
-                                       }
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
 
-                               } else {
-                                       while ( second[j] !== undefined ) {
-                                               first[ i++ ] = second[ j++ ];
-                                       }
-                               }
-
-                               first.length = i;
-
-                               return first;
-                       },
-
-                       grep: function( elems, callback, inv ) {
-                               var ret = [], retVal;
-                               inv = !!inv;
-
-                               // Go through the array, only saving the items
-                               // that pass the validator function
-                               for ( var i = 0, length = elems.length; i < length; i++ ) {
-                                       retVal = !!callback( elems[ i ], i );
-                                       if ( inv !== retVal ) {
-                                               ret.push( elems[ i ] );
-                                       }
-                               }
-
-                               return ret;
-                       },
-
-                       // arg is for internal usage only
-                       map: function( elems, callback, arg ) {
-                               var value, key, ret = [],
-                                       i = 0,
-                                       length = elems.length,
-                               // jquery objects are treated as arrays
-                                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
-                               // Go through the array, translating each of the items to their
-                               if ( isArray ) {
-                                       for ( ; i < length; i++ ) {
-                                               value = callback( elems[ i ], i, arg );
-
-                                               if ( value != null ) {
-                                                       ret[ ret.length ] = value;
-                                               }
-                                       }
-
-                                       // Go through every key on the object,
-                               } else {
-                                       for ( key in elems ) {
-                                               value = callback( elems[ key ], key, arg );
-
-                                               if ( value != null ) {
-                                                       ret[ ret.length ] = value;
-                                               }
-                                       }
-                               }
-
-                               // Flatten any nested arrays
-                               return ret.concat.apply( [], ret );
-                       },
-
-                       // A global GUID counter for objects
-                       guid: 1,
-
-                       // Bind a function to a context, optionally partially applying any
-                       // arguments.
-                       proxy: function( fn, context ) {
-                               if ( typeof context === "string" ) {
-                                       var tmp = fn[ context ];
-                                       context = fn;
-                                       fn = tmp;
-                               }
-
-                               // Quick check to determine if target is callable, in the spec
-                               // this throws a TypeError, but we will just return undefined.
-                               if ( !jQuery.isFunction( fn ) ) {
-                                       return undefined;
-                               }
-
-                               // Simulated bind
-                               var args = slice.call( arguments, 2 ),
-                                       proxy = function() {
-                                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
-                                       };
-
-                               // Set the guid of unique handler to the same of original handler, so it can be removed
-                               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
-                               return proxy;
-                       },
-
-                       // Mutifunctional method to get and set values to a collection
-                       // The value/s can optionally be executed if it's a function
-                       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-                               var exec,
-                                       bulk = key == null,
-                                       i = 0,
-                                       length = elems.length;
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
 
-                               // Sets many values
-                               if ( key && typeof key === "object" ) {
-                                       for ( i in key ) {
-                                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-                                       }
-                                       chainable = 1;
-
-                                       // Sets one value
-                               } else if ( value !== undefined ) {
-                                       // Optionally, function values get executed if exec is true
-                                       exec = pass === undefined && jQuery.isFunction( value );
-
-                                       if ( bulk ) {
-                                               // Bulk operations only iterate when executing function values
-                                               if ( exec ) {
-                                                       exec = fn;
-                                                       fn = function( elem, key, value ) {
-                                                               return exec.call( jQuery( elem ), value );
-                                                       };
-
-                                                       // Otherwise they run against the entire set
-                                               } else {
-                                                       fn.call( elems, value );
-                                                       fn = null;
-                                               }
-                                       }
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
 
-                                       if ( fn ) {
-                                               for (; i < length; i++ ) {
-                                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
                                                }
-                                       }
-
-                                       chainable = 1;
-                               }
-
-                               return chainable ?
-                                       elems :
-
-                                       // Gets
-                                       bulk ?
-                                               fn.call( elems ) :
-                                               length ? fn( elems[0], key ) : emptyGet;
-                       },
-
-                       now: function() {
-                               return ( new Date() ).getTime();
-                       },
-
-                       // Use of jQuery.browser is frowned upon.
-                       // More details: http://docs.jquery.com/Utilities/jQuery.browser
-                       uaMatch: function( ua ) {
-                               ua = ua.toLowerCase();
-
-                               var match = rwebkit.exec( ua ) ||
-                                       ropera.exec( ua ) ||
-                                       rmsie.exec( ua ) ||
-                                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-                                       [];
 
-                               return { browser: match[1] || "", version: match[2] || "0" };
-                       },
-
-                       sub: function() {
-                               function jQuerySub( selector, context ) {
-                                       return new jQuerySub.fn.init( selector, context );
-                               }
-                               jQuery.extend( true, jQuerySub, this );
-                               jQuerySub.superclass = this;
-                               jQuerySub.fn = jQuerySub.prototype = this();
-                               jQuerySub.fn.constructor = jQuerySub;
-                               jQuerySub.sub = this.sub;
-                               jQuerySub.fn.init = function init( selector, context ) {
-                                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                                               context = jQuerySub( context );
+                                               // and execute any waiting functions
+                                               jQuery.ready();
                                        }
-
-                                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-                               };
-                               jQuerySub.fn.init.prototype = jQuerySub.fn;
-                               var rootjQuerySub = jQuerySub(document);
-                               return jQuerySub;
-                       },
-
-                       browser: {}
-               });
-
-// Populate the class2type map
-               jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-                       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-               });
-
-               browserMatch = jQuery.uaMatch( userAgent );
-               if ( browserMatch.browser ) {
-                       jQuery.browser[ browserMatch.browser ] = true;
-                       jQuery.browser.version = browserMatch.version;
-               }
-
-// Deprecated, use jQuery.browser.webkit instead
-               if ( jQuery.browser.webkit ) {
-                       jQuery.browser.safari = true;
-               }
-
-// IE doesn't match non-breaking spaces with \s
-               if ( rnotwhite.test( "\xA0" ) ) {
-                       trimLeft = /^[\s\xA0]+/;
-                       trimRight = /[\s\xA0]+$/;
-               }
-
-// All jQuery objects should point back to these
-               rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-               if ( document.addEventListener ) {
-                       DOMContentLoaded = function() {
-                               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-                               jQuery.ready();
-                       };
-
-               } else if ( document.attachEvent ) {
-                       DOMContentLoaded = function() {
-                               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                               if ( document.readyState === "complete" ) {
-                                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                                       jQuery.ready();
-                               }
-                       };
-               }
-
-// The DOM ready check for Internet Explorer
-               function doScrollCheck() {
-                       if ( jQuery.isReady ) {
-                               return;
-                       }
-
-                       try {
-                               // If IE is used, use the trick by Diego Perini
-                               // http://javascript.nwbox.com/IEContentLoaded/
-                               document.documentElement.doScroll("left");
-                       } catch(e) {
-                               setTimeout( doScrollCheck, 1 );
-                               return;
+                               })();
                        }
-
-                       // and execute any waiting functions
-                       jQuery.ready();
                }
+       }
+       return readyList.promise( obj );
+};
 
-               return jQuery;
-
-       })();
-
-
-// String to Object flags format cache
-       var flagsCache = {};
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
-// Convert String-formatted flags into Object-formatted ones and store in cache
-       function createFlags( flags ) {
-               var object = flagsCache[ flags ] = {},
-                       i, length;
-               flags = flags.split( /\s+/ );
-               for ( i = 0, length = flags.length; i < length; i++ ) {
-                       object[ flags[i] ] = true;
-               }
-               return object;
-       }
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.split( core_rspace ), function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
 
-       /*
       * Create a callback list using the following parameters:
       *
       *      flags:  an optional list of space-separated flags that will change how
-        *                      the callback list behaves
       *
       * By default a callback list will act like an event callback list and can be
       * "fired" multiple times.
       *
       * Possible flags:
       *
       *      once:                   will ensure the callback list can only be fired once (like a Deferred)
       *
       *      memory:                 will keep track of previous values and will call any callback added
       *                                      after the list has been fired right away with the latest "memorized"
       *                                      values (like a Deferred)
       *
       *      unique:                 will ensure a callback can only be added once (no duplicate in the list)
       *
       *      stopOnFalse:    interrupt callings when a callback returns false
       *
       */
-       jQuery.Callbacks = function( flags ) {
+/*
+ * Create a callback list using the following parameters:
+ *
*     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
* Possible options:
+ *
*     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
*     memory:                 will keep track of previous values and will call any callback added
*                                     after the list has been fired right away with the latest "memorized"
*                                     values (like a Deferred)
+ *
*     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
*     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
 
-               // Convert flags from String-formatted to Object-formatted
-               // (we check in cache first)
-               flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
 
-               var // Actual callback list
-                       list = [],
-               // Stack of fire calls for repeatable lists
-                       stack = [],
-               // Last fire value (for non-forgettable lists)
-                       memory,
+       var // Last fire value (for non-forgettable lists)
+               memory,
                // Flag to know if list was already fired
-                       fired,
+               fired,
                // Flag to know if list is currently firing
-                       firing,
+               firing,
                // First callback to fire (used internally by add and fireWith)
-                       firingStart,
+               firingStart,
                // End of the loop when firing
-                       firingLength,
+               firingLength,
                // Index of currently firing callback (modified by remove if needed)
-                       firingIndex,
-               // Add one or several callbacks to the list
-                       add = function( args ) {
-                               var i,
-                                       length,
-                                       elem,
-                                       type,
-                                       actual;
-                               for ( i = 0, length = args.length; i < length; i++ ) {
-                                       elem = args[ i ];
-                                       type = jQuery.type( elem );
-                                       if ( type === "array" ) {
-                                               // Inspect recursively
-                                               add( elem );
-                                       } else if ( type === "function" ) {
-                                               // Add if not in unique mode and callback is not in
-                                               if ( !flags.unique || !self.has( elem ) ) {
-                                                       list.push( elem );
-                                               }
-                                       }
-                               }
-                       },
+               firingIndex,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
                // Fire callbacks
-                       fire = function( context, args ) {
-                               args = args || [];
-                               memory = !flags.memory || [ context, args ];
-                               fired = true;
-                               firing = true;
-                               firingIndex = firingStart || 0;
-                               firingStart = 0;
-                               firingLength = list.length;
-                               for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                                       if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
-                                               memory = true; // Mark as halted
-                                               break;
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
                                        }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
                                }
-                               firing = false;
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
                                if ( list ) {
-                                       if ( !flags.once ) {
-                                               if ( stack && stack.length ) {
-                                                       memory = stack.shift();
-                                                       self.fireWith( memory[ 0 ], memory[ 1 ] );
-                                               }
-                                       } else if ( memory === true ) {
-                                               self.disable();
-                                       } else {
-                                               list = [];
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+                                                               list.push( arg );
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
                                        }
                                }
+                               return this;
                        },
-               // Actual Callbacks object
-                       self = {
-                               // Add a callback or a collection of callbacks to the list
-                               add: function() {
-                                       if ( list ) {
-                                               var length = list.length;
-                                               add( arguments );
-                                               // Do we need to add the callbacks to the
-                                               // current firing batch?
-                                               if ( firing ) {
-                                                       firingLength = list.length;
-                                                       // With memory, if we're not firing then
-                                                       // we should call right away, unless previous
-                                                       // firing was halted (stopOnFalse)
-                                               } else if ( memory && memory !== true ) {
-                                                       firingStart = length;
-                                                       fire( memory[ 0 ], memory[ 1 ] );
-                                               }
-                                       }
-                                       return this;
-                               },
-                               // Remove a callback from the list
-                               remove: function() {
-                                       if ( list ) {
-                                               var args = arguments,
-                                                       argIndex = 0,
-                                                       argLength = args.length;
-                                               for ( ; argIndex < argLength ; argIndex++ ) {
-                                                       for ( var i = 0; i < list.length; i++ ) {
-                                                               if ( args[ argIndex ] === list[ i ] ) {
-                                                                       // Handle firingIndex and firingLength
-                                                                       if ( firing ) {
-                                                                               if ( i <= firingLength ) {
-                                                                                       firingLength--;
-                                                                                       if ( i <= firingIndex ) {
-                                                                                               firingIndex--;
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                                       // Remove the element
-                                                                       list.splice( i--, 1 );
-                                                                       // If we have some unicity property then
-                                                                       // we only need to do this once
-                                                                       if ( flags.unique ) {
-                                                                               break;
-                                                                       }
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
                                                                }
                                                        }
                                                }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               return jQuery.inArray( fn, list ) > -1;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               args = args || [];
+                               args = [ context, args.slice ? args.slice() : args ];
+                               if ( list && ( !fired || stack ) ) {
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
                                        }
-                                       return this;
-                               },
-                               // Control if a given callback is in the list
-                               has: function( fn ) {
-                                       if ( list ) {
-                                               var i = 0,
-                                                       length = list.length;
-                                               for ( ; i < length; i++ ) {
-                                                       if ( fn === list[ i ] ) {
-                                                               return true;
-                                                       }
-                                               }
-                                       }
-                                       return false;
-                               },
-                               // Remove all callbacks from the list
-                               empty: function() {
-                                       list = [];
-                                       return this;
-                               },
-                               // Have the list do nothing anymore
-                               disable: function() {
-                                       list = stack = memory = undefined;
-                                       return this;
-                               },
-                               // Is it disabled?
-                               disabled: function() {
-                                       return !list;
-                               },
-                               // Lock the list in its current state
-                               lock: function() {
-                                       stack = undefined;
-                                       if ( !memory || memory === true ) {
-                                               self.disable();
-                                       }
-                                       return this;
-                               },
-                               // Is it locked?
-                               locked: function() {
-                                       return !stack;
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
                                },
-                               // Call all callbacks with the given context and arguments
-                               fireWith: function( context, args ) {
-                                       if ( stack ) {
-                                               if ( firing ) {
-                                                       if ( !flags.once ) {
-                                                               stack.push( [ context, args ] );
-                                                       }
-                                               } else if ( !( flags.once && memory ) ) {
-                                                       fire( context, args );
-                                               }
-                                       }
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
                                        return this;
                                },
-                               // Call all the callbacks with the given arguments
-                               fire: function() {
-                                       self.fireWith( this, arguments );
-                                       return this;
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+                                                               function() {
+                                                                       var returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise()
+                                                                                       .done( newDefer.resolve )
+                                                                                       .fail( newDefer.reject )
+                                                                                       .progress( newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               } :
+                                                               newDefer[ action ]
+                                                       );
+                                               });
+                                               fns = null;
+                                       }).promise();
                                },
-                               // To know if the callbacks have already been called at least once
-                               fired: function() {
-                                       return !!fired;
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
                                }
-                       };
+                       },
+                       deferred = {};
 
-               return self;
-       };
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
 
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
 
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
 
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
 
-       var // Static reference to slice
-               sliceDeferred = [].slice;
+                       // deferred[ resolve | reject | notify ] = list.fire
+                       deferred[ tuple[0] ] = list.fire;
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
 
-       jQuery.extend({
+               // Make the deferred a promise
+               promise.promise( deferred );
 
-               Deferred: function( func ) {
-                       var doneList = jQuery.Callbacks( "once memory" ),
-                               failList = jQuery.Callbacks( "once memory" ),
-                               progressList = jQuery.Callbacks( "memory" ),
-                               state = "pending",
-                               lists = {
-                                       resolve: doneList,
-                                       reject: failList,
-                                       notify: progressList
-                               },
-                               promise = {
-                                       done: doneList.add,
-                                       fail: failList.add,
-                                       progress: progressList.add,
-
-                                       state: function() {
-                                               return state;
-                                       },
-
-                                       // Deprecated
-                                       isResolved: doneList.fired,
-                                       isRejected: failList.fired,
-
-                                       then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
-                                               deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
-                                               return this;
-                                       },
-                                       always: function() {
-                                               deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
-                                               return this;
-                                       },
-                                       pipe: function( fnDone, fnFail, fnProgress ) {
-                                               return jQuery.Deferred(function( newDefer ) {
-                                                       jQuery.each( {
-                                                               done: [ fnDone, "resolve" ],
-                                                               fail: [ fnFail, "reject" ],
-                                                               progress: [ fnProgress, "notify" ]
-                                                       }, function( handler, data ) {
-                                                               var fn = data[ 0 ],
-                                                                       action = data[ 1 ],
-                                                                       returned;
-                                                               if ( jQuery.isFunction( fn ) ) {
-                                                                       deferred[ handler ](function() {
-                                                                               returned = fn.apply( this, arguments );
-                                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                                       returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
-                                                                               } else {
-                                                                                       newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-                                                                               }
-                                                                       });
-                                                               } else {
-                                                                       deferred[ handler ]( newDefer[ action ] );
-                                                               }
-                                                       });
-                                               }).promise();
-                                       },
-                                       // Get a promise for this deferred
-                                       // If obj is provided, the promise aspect is added to the object
-                                       promise: function( obj ) {
-                                               if ( obj == null ) {
-                                                       obj = promise;
-                                               } else {
-                                                       for ( var key in promise ) {
-                                                               obj[ key ] = promise[ key ];
-                                                       }
-                                               }
-                                               return obj;
-                                       }
-                               },
-                               deferred = promise.promise({}),
-                               key;
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
 
-                       for ( key in lists ) {
-                               deferred[ key ] = lists[ key ].fire;
-                               deferred[ key + "With" ] = lists[ key ].fireWith;
-                       }
+               // All done!
+               return deferred;
+       },
 
-                       // Handle state
-                       deferred.done( function() {
-                               state = "resolved";
-                       }, failList.disable, progressList.lock ).fail( function() {
-                                       state = "rejected";
-                               }, doneList.disable, progressList.lock );
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
 
-                       // Call given func if any
-                       if ( func ) {
-                               func.call( deferred, deferred );
-                       }
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
 
-                       // All done!
-                       return deferred;
-               },
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
 
-               // Deferred helper
-               when: function( firstParam ) {
-                       var args = sliceDeferred.call( arguments, 0 ),
-                               i = 0,
-                               length = args.length,
-                               pValues = new Array( length ),
-                               count = length,
-                               pCount = length,
-                               deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
-                                       firstParam :
-                                       jQuery.Deferred(),
-                               promise = deferred.promise();
-                       function resolveFunc( i ) {
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
                                return function( value ) {
-                                       args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                                       if ( !( --count ) ) {
-                                               deferred.resolveWith( deferred, args );
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
                                        }
                                };
-                       }
-                       function progressFunc( i ) {
-                               return function( value ) {
-                                       pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                                       deferred.notifyWith( promise, pValues );
-                               };
-                       }
-                       if ( length > 1 ) {
-                               for ( ; i < length; i++ ) {
-                                       if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
-                                               args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
-                                       } else {
-                                               --count;
-                                       }
-                               }
-                               if ( !count ) {
-                                       deferred.resolveWith( deferred, args );
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
                                }
-                       } else if ( deferred !== firstParam ) {
-                               deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
                        }
-                       return promise;
                }
-       });
-
-
 
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
 
-       jQuery.support = (function() {
+               return deferred.promise();
+       }
+});
+jQuery.support = (function() {
+
+       var support,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               fragment,
+               eventName,
+               i,
+               isSupported,
+               clickFn,
+               div = document.createElement("div");
+
+       // Preliminary tests
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+       all = div.getElementsByTagName("*");
+       a = div.getElementsByTagName("a")[ 0 ];
+       a.style.cssText = "top:1px;float:left;opacity:.5";
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
+               return {};
+       }
 
-               var support,
-                       all,
-                       a,
-                       select,
-                       opt,
-                       input,
-                       fragment,
-                       tds,
-                       events,
-                       eventName,
-                       i,
-                       isSupported,
-                       div = document.createElement( "div" ),
-                       documentElement = document.documentElement;
-
-               // Preliminary tests
-               div.setAttribute("className", "t");
-               div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
-               all = div.getElementsByTagName( "*" );
-               a = div.getElementsByTagName( "a" )[ 0 ];
-
-               // Can't get basic test support
-               if ( !all || !all.length || !a ) {
-                       return {};
-               }
-
-               // First batch of supports tests
-               select = document.createElement( "select" );
-               opt = select.appendChild( document.createElement("option") );
-               input = div.getElementsByTagName( "input" )[ 0 ];
-
-               support = {
-                       // IE strips leading whitespace when .innerHTML is used
-                       leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-                       // Make sure that tbody elements aren't automatically inserted
-                       // IE will insert them into empty tables
-                       tbody: !div.getElementsByTagName("tbody").length,
-
-                       // Make sure that link elements get serialized correctly by innerHTML
-                       // This requires a wrapper element in IE
-                       htmlSerialize: !!div.getElementsByTagName("link").length,
-
-                       // Get the style information from getAttribute
-                       // (IE uses .cssText instead)
-                       style: /top/.test( a.getAttribute("style") ),
-
-                       // Make sure that URLs aren't manipulated
-                       // (IE normalizes it by default)
-                       hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-                       // Make sure that element opacity exists
-                       // (IE uses filter instead)
-                       // Use a regex to work around a WebKit issue. See #5145
-                       opacity: /^0.55/.test( a.style.opacity ),
-
-                       // Verify style float existence
-                       // (IE uses styleFloat instead of cssFloat)
-                       cssFloat: !!a.style.cssFloat,
-
-                       // Make sure that if no value is specified for a checkbox
-                       // that it defaults to "on".
-                       // (WebKit defaults to "" instead)
-                       checkOn: ( input.value === "on" ),
-
-                       // Make sure that a selected-by-default option has a working selected property.
-                       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-                       optSelected: opt.selected,
-
-                       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-                       getSetAttribute: div.className !== "t",
-
-                       // Tests for enctype support on a form(#6743)
-                       enctype: !!document.createElement("form").enctype,
-
-                       // Makes sure cloning an html5 element does not cause problems
-                       // Where outerHTML is undefined, this still works
-                       html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-                       // Will be defined later
-                       submitBubbles: true,
-                       changeBubbles: true,
-                       focusinBubbles: false,
-                       deleteExpando: true,
-                       noCloneEvent: true,
-                       inlineBlockNeedsLayout: false,
-                       shrinkWrapBlocks: false,
-                       reliableMarginRight: true,
-                       pixelMargin: true
-               };
+       // First batch of supports tests
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
+
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.5/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form(#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+               boxModel: ( document.compatMode === "CSS1Compat" ),
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true,
+               boxSizingReliable: true,
+               pixelPosition: false
+       };
 
-               // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
-               jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
 
-               // Make sure checked status is properly cloned
-               input.checked = true;
-               support.noCloneChecked = input.cloneNode( true ).checked;
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
 
-               // Make sure that the options inside disabled selects aren't marked as disabled
-               // (WebKit marks them as disabled)
-               select.disabled = true;
-               support.optDisabled = !opt.disabled;
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
 
-               // Test to see if it's possible to delete an expando from an element
-               // Fails in Internet Explorer
-               try {
-                       delete div.test;
-               } catch( e ) {
-                       support.deleteExpando = false;
-               }
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", clickFn = function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent("onclick");
+               div.detachEvent( "onclick", clickFn );
+       }
 
-               if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-                       div.attachEvent( "onclick", function() {
-                               // Cloning a node shouldn't copy over any
-                               // bound event handlers (IE does this)
-                               support.noCloneEvent = false;
-                       });
-                       div.cloneNode( true ).fireEvent( "onclick" );
-               }
-
-               // Check if a radio maintains its value
-               // after being appended to the DOM
-               input = document.createElement("input");
-               input.value = "t";
-               input.setAttribute("type", "radio");
-               support.radioValue = input.value === "t";
-
-               input.setAttribute("checked", "checked");
-
-               // #11217 - WebKit loses check when the name is after the checked attribute
-               input.setAttribute( "name", "t" );
-
-               div.appendChild( input );
-               fragment = document.createDocumentFragment();
-               fragment.appendChild( div.lastChild );
-
-               // WebKit doesn't clone checked state correctly in fragments
-               support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-               // Check if a disconnected checkbox will retain its checked
-               // value of true after appended to the DOM (IE6/7)
-               support.appendChecked = input.checked;
-
-               fragment.removeChild( input );
-               fragment.appendChild( div );
-
-               // Technique from Juriy Zaytsev
-               // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-               // We only care about the case where non-standard event systems
-               // are used, namely in IE. Short-circuiting here helps us to
-               // avoid an eval call (in setAttribute) which can cause CSP
-               // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-               if ( div.attachEvent ) {
-                       for ( i in {
-                               submit: 1,
-                               change: 1,
-                               focusin: 1
-                       }) {
-                               eventName = "on" + i;
-                               isSupported = ( eventName in div );
-                               if ( !isSupported ) {
-                                       div.setAttribute( eventName, "return;" );
-                                       isSupported = ( typeof div[ eventName ] === "function" );
-                               }
-                               support[ i + "Bubbles" ] = isSupported;
-                       }
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+
+       input.setAttribute( "checked", "checked" );
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       fragment.removeChild( input );
+       fragment.appendChild( div );
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for ( i in {
+                       submit: true,
+                       change: true,
+                       focusin: true
+               }) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
                }
+       }
 
-               fragment.removeChild( div );
-
-               // Null elements to avoid leaks in IE
-               fragment = select = opt = div = input = null;
-
-               // Run tests that need a body at doc ready
-               jQuery(function() {
-                       var container, outer, inner, table, td, offsetSupport,
-                               marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
-                               paddingMarginBorderVisibility, paddingMarginBorder,
-                               body = document.getElementsByTagName("body")[0];
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, div, tds, marginDiv,
+                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+                       body = document.getElementsByTagName("body")[0];
 
-                       if ( !body ) {
-                               // Return for frameset docs that don't have a body
-                               return;
-                       }
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
 
-                       conMarginTop = 1;
-                       paddingMarginBorder = "padding:0;margin:0;border:";
-                       positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
-                       paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
-                       style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
-                       html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
-                               "<table " + style + "' cellpadding='0' cellspacing='0'>" +
-                               "<tr><td></td></tr></table>";
-
-                       container = document.createElement("div");
-                       container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
-                       body.insertBefore( container, body.firstChild );
-
-                       // Construct the test element
-                       div = document.createElement("div");
-                       container.appendChild( div );
-
-                       // Check if table cells still have offsetWidth/Height when they are set
-                       // to display:none and there are still other visible table cells in a
-                       // table row; if so, offsetWidth/Height are not reliable for use when
-                       // determining if an element has been hidden directly using
-                       // display:none (it is still safe to use offsets if a parent element is
-                       // hidden; don safety goggles and see bug #4512 for more information).
-                       // (only IE 8 fails this test)
-                       div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
-                       tds = div.getElementsByTagName( "td" );
-                       isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-                       tds[ 0 ].style.display = "";
-                       tds[ 1 ].style.display = "none";
-
-                       // Check if empty table cells still have offsetWidth/Height
-                       // (IE <= 8 fail this test)
-                       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+               container = document.createElement("div");
+               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check box-sizing and margin behavior
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+               support.boxSizing = ( div.offsetWidth === 4 );
+               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+               // NOTE: To any future maintainer, we've window.getComputedStyle
+               // because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
 
                        // Check if div with explicit width and no margin-right incorrectly
                        // gets computed margin-right based on width of container. For more
                        // info see bug #3333
                        // Fails in WebKit before Feb 2011 nightlies
                        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       if ( window.getComputedStyle ) {
-                               div.innerHTML = "";
-                               marginDiv = document.createElement( "div" );
-                               marginDiv.style.width = "0";
-                               marginDiv.style.marginRight = "0";
-                               div.style.width = "2px";
-                               div.appendChild( marginDiv );
-                               support.reliableMarginRight =
-                                       ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
-                       }
-
-                       if ( typeof div.style.zoom !== "undefined" ) {
-                               // Check if natively block-level elements act like inline-block
-                               // elements when setting their display to 'inline' and giving
-                               // them layout
-                               // (IE < 8 does this)
-                               div.innerHTML = "";
-                               div.style.width = div.style.padding = "1px";
-                               div.style.border = 0;
-                               div.style.overflow = "hidden";
-                               div.style.display = "inline";
-                               div.style.zoom = 1;
-                               support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-                               // Check if elements with layout shrink-wrap their children
-                               // (IE 6 does this)
-                               div.style.display = "block";
-                               div.style.overflow = "visible";
-                               div.innerHTML = "<div style='width:5px;'></div>";
-                               support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-                       }
-
-                       div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
-                       div.innerHTML = html;
-
-                       outer = div.firstChild;
-                       inner = outer.firstChild;
-                       td = outer.nextSibling.firstChild.firstChild;
-
-                       offsetSupport = {
-                               doesNotAddBorder: ( inner.offsetTop !== 5 ),
-                               doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
-                       };
+                       marginDiv = document.createElement("div");
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+                       div.appendChild( marginDiv );
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
 
-                       inner.style.position = "fixed";
-                       inner.style.top = "20px";
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.innerHTML = "";
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "block";
+                       div.style.overflow = "visible";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+                       container.style.zoom = 1;
+               }
 
-                       // safari subtracts parent border width here which is 5px
-                       offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
-                       inner.style.position = inner.style.top = "";
+               // Null elements to avoid leaks in IE
+               body.removeChild( container );
+               container = div = tds = marginDiv = null;
+       });
 
-                       outer.style.overflow = "hidden";
-                       outer.style.position = "relative";
-
-                       offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
-                       offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
-                       if ( window.getComputedStyle ) {
-                               div.style.marginTop = "1%";
-                               support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
-                       }
-
-                       if ( typeof container.style.zoom !== "undefined" ) {
-                               container.style.zoom = 1;
-                       }
-
-                       body.removeChild( container );
-                       marginDiv = div = container = null;
-
-                       jQuery.extend( support, offsetSupport );
-               });
-
-               return support;
-       })();
+       // Null elements to avoid leaks in IE
+       fragment.removeChild( div );
+       all = a = select = opt = input = fragment = div = null;
 
+       return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
 
+jQuery.extend({
+       cache: {},
 
+       deletedIds: [],
 
-       var rbrace = /^(?:\{.*\}|\[.*\])$/,
-               rmultiDash = /([A-Z])/g;
+       // Please use with caution
+       uuid: 0,
 
-       jQuery.extend({
-               cache: {},
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
-               // Please use with caution
-               uuid: 0,
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
 
-               // Unique for each copy of jQuery on the page
-               // Non-digits removed to match rinlinejQuery
-               expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
 
-               // The following elements throw uncatchable exceptions if you
-               // attempt to add expando properties to them.
-               noData: {
-                       "embed": true,
-                       // Ban all objects except for Flash (which handle expandos)
-                       "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-                       "applet": true
-               },
-
-               hasData: function( elem ) {
-                       elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-                       return !!elem && !isEmptyDataObject( elem );
-               },
-
-               data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-                       if ( !jQuery.acceptData( elem ) ) {
-                               return;
-                       }
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
 
-                       var privateCache, thisCache, ret,
-                               internalKey = jQuery.expando,
-                               getByName = typeof name === "string",
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
 
                        // We have to handle DOM nodes and JS objects differently because IE6-7
                        // can't GC object references properly across the DOM-JS boundary
-                               isNode = elem.nodeType,
+                       isNode = elem.nodeType,
 
                        // Only DOM nodes need the global jQuery cache; JS object data is
                        // attached directly to the object so GC can occur automatically
-                               cache = isNode ? jQuery.cache : elem,
+                       cache = isNode ? jQuery.cache : elem,
 
                        // Only defining an ID for JS objects if its cache already exists allows
                        // the code to shortcut on the same path as a DOM node with no cache
-                               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
-                               isEvents = name === "events";
-
-                       // Avoid doing any more work than we need to when trying to get data on an
-                       // object that has no data at all
-                       if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
-                               return;
-                       }
-
-                       if ( !id ) {
-                               // Only DOM nodes need a new unique ID for each element since their data
-                               // ends up in the global cache
-                               if ( isNode ) {
-                                       elem[ internalKey ] = id = ++jQuery.uuid;
-                               } else {
-                                       id = internalKey;
-                               }
-                       }
-
-                       if ( !cache[ id ] ) {
-                               cache[ id ] = {};
-
-                               // Avoids exposing jQuery metadata on plain JS objects when the object
-                               // is serialized using JSON.stringify
-                               if ( !isNode ) {
-                                       cache[ id ].toJSON = jQuery.noop;
-                               }
-                       }
-
-                       // An object can be passed to jQuery.data instead of a key/value pair; this gets
-                       // shallow copied over onto the existing cache
-                       if ( typeof name === "object" || typeof name === "function" ) {
-                               if ( pvt ) {
-                                       cache[ id ] = jQuery.extend( cache[ id ], name );
-                               } else {
-                                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-                               }
-                       }
-
-                       privateCache = thisCache = cache[ id ];
-
-                       // jQuery data() is stored in a separate object inside the object's internal data
-                       // cache in order to avoid key collisions between internal data and user-defined
-                       // data.
-                       if ( !pvt ) {
-                               if ( !thisCache.data ) {
-                                       thisCache.data = {};
-                               }
-
-                               thisCache = thisCache.data;
-                       }
-
-                       if ( data !== undefined ) {
-                               thisCache[ jQuery.camelCase( name ) ] = data;
-                       }
-
-                       // Users should not attempt to inspect the internal events object using jQuery.data,
-                       // it is undocumented and subject to change. But does anyone listen? No.
-                       if ( isEvents && !thisCache[ name ] ) {
-                               return privateCache.events;
-                       }
-
-                       // Check for both converted-to-camel and non-converted data property names
-                       // If a data property was specified
-                       if ( getByName ) {
-
-                               // First Try to find as-is property data
-                               ret = thisCache[ name ];
-
-                               // Test for null|undefined property data
-                               if ( ret == null ) {
-
-                                       // Try to find the camelCased property
-                                       ret = thisCache[ jQuery.camelCase( name ) ];
-                               }
-                       } else {
-                               ret = thisCache;
-                       }
-
-                       return ret;
-               },
-
-               removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-                       if ( !jQuery.acceptData( elem ) ) {
-                               return;
-                       }
-
-                       var thisCache, i, l,
-
-                       // Reference to internal data cache key
-                               internalKey = jQuery.expando,
-
-                               isNode = elem.nodeType,
-
-                       // See jQuery.data for more information
-                               cache = isNode ? jQuery.cache : elem,
-
-                       // See jQuery.data for more information
-                               id = isNode ? elem[ internalKey ] : internalKey;
-
-                       // If there is already no cache entry for this object, there is no
-                       // purpose in continuing
-                       if ( !cache[ id ] ) {
-                               return;
-                       }
-
-                       if ( name ) {
-
-                               thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-                               if ( thisCache ) {
-
-                                       // Support array or space separated string names for data keys
-                                       if ( !jQuery.isArray( name ) ) {
-
-                                               // try the string as a key before any manipulation
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-
-                                                       // split the camel cased version by spaces unless a key with the spaces exists
-                                                       name = jQuery.camelCase( name );
-                                                       if ( name in thisCache ) {
-                                                               name = [ name ];
-                                                       } else {
-                                                               name = name.split( " " );
-                                                       }
-                                               }
-                                       }
-
-                                       for ( i = 0, l = name.length; i < l; i++ ) {
-                                               delete thisCache[ name[i] ];
-                                       }
-
-                                       // If there is no data left in the cache, we want to continue
-                                       // and let the cache object itself get destroyed
-                                       if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                                               return;
-                                       }
-                               }
-                       }
-
-                       // See jQuery.data for more information
-                       if ( !pvt ) {
-                               delete cache[ id ].data;
-
-                               // Don't destroy the parent cache unless the internal data object
-                               // had been the only thing left in it
-                               if ( !isEmptyDataObject(cache[ id ]) ) {
-                                       return;
-                               }
-                       }
-
-                       // Browsers that fail expando deletion also refuse to delete expandos on
-                       // the window, but it will allow it on all other JS objects; other browsers
-                       // don't care
-                       // Ensure that `cache` is not a window object #10080
-                       if ( jQuery.support.deleteExpando || !cache.setInterval ) {
-                               delete cache[ id ];
-                       } else {
-                               cache[ id ] = null;
-                       }
-
-                       // We destroyed the cache and need to eliminate the expando on the node to avoid
-                       // false lookups in the cache for entries that no longer exist
-                       if ( isNode ) {
-                               // IE does not allow us to delete expando properties from nodes,
-                               // nor does it have a removeAttribute function on Document nodes;
-                               // we must handle all of these cases
-                               if ( jQuery.support.deleteExpando ) {
-                                       delete elem[ internalKey ];
-                               } else if ( elem.removeAttribute ) {
-                                       elem.removeAttribute( internalKey );
-                               } else {
-                                       elem[ internalKey ] = null;
-                               }
-                       }
-               },
-
-               // For internal use only.
-               _data: function( elem, name, data ) {
-                       return jQuery.data( elem, name, data, true );
-               },
-
-               // A method for determining if a DOM node can handle the data expando
-               acceptData: function( elem ) {
-                       if ( elem.nodeName ) {
-                               var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-                               if ( match ) {
-                                       return !(match === true || elem.getAttribute("classid") !== match);
-                               }
-                       }
-
-                       return true;
-               }
-       });
-
-       jQuery.fn.extend({
-               data: function( key, value ) {
-                       var parts, part, attr, name, l,
-                               elem = this[0],
-                               i = 0,
-                               data = null;
-
-                       // Gets all values
-                       if ( key === undefined ) {
-                               if ( this.length ) {
-                                       data = jQuery.data( elem );
-
-                                       if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                               attr = elem.attributes;
-                                               for ( l = attr.length; i < l; i++ ) {
-                                                       name = attr[i].name;
-
-                                                       if ( name.indexOf( "data-" ) === 0 ) {
-                                                               name = jQuery.camelCase( name.substring(5) );
-
-                                                               dataAttr( elem, name, data[ name ] );
-                                                       }
-                                               }
-                                               jQuery._data( elem, "parsedAttrs", true );
-                                       }
-                               }
-
-                               return data;
-                       }
-
-                       // Sets multiple values
-                       if ( typeof key === "object" ) {
-                               return this.each(function() {
-                                       jQuery.data( this, key );
-                               });
-                       }
-
-                       parts = key.split( ".", 2 );
-                       parts[1] = parts[1] ? "." + parts[1] : "";
-                       part = parts[1] + "!";
-
-                       return jQuery.access( this, function( value ) {
-
-                               if ( value === undefined ) {
-                                       data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
-                                       // Try to fetch any internally stored data first
-                                       if ( data === undefined && elem ) {
-                                               data = jQuery.data( elem, key );
-                                               data = dataAttr( elem, key, data );
-                                       }
-
-                                       return data === undefined && parts[1] ?
-                                               this.data( parts[0] ) :
-                                               data;
-                               }
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
 
-                               parts[1] = value;
-                               this.each(function() {
-                                       var self = jQuery( this );
-
-                                       self.triggerHandler( "setData" + part, parts );
-                                       jQuery.data( this, key, value );
-                                       self.triggerHandler( "changeData" + part, parts );
-                               });
-                       }, null, value, arguments.length > 1, null, false );
-               },
-
-               removeData: function( key ) {
-                       return this.each(function() {
-                               jQuery.removeData( this, key );
-                       });
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
                }
-       });
-
-       function dataAttr( elem, key, data ) {
-               // If nothing was found internally, try to fetch any
-               // data from the HTML5 data-* attribute
-               if ( data === undefined && elem.nodeType === 1 ) {
-
-                       var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-                       data = elem.getAttribute( name );
-
-                       if ( typeof data === "string" ) {
-                               try {
-                                       data = data === "true" ? true :
-                                               data === "false" ? false :
-                                                       data === "null" ? null :
-                                                               jQuery.isNumeric( data ) ? +data :
-                                                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                                                               data;
-                               } catch( e ) {}
-
-                               // Make sure we set the data so it isn't changed later
-                               jQuery.data( elem, key, data );
 
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
                        } else {
-                               data = undefined;
-                       }
-               }
-
-               return data;
-       }
-
-// checks a cache object for emptiness
-       function isEmptyDataObject( obj ) {
-               for ( var name in obj ) {
-
-                       // if the public data object is empty, the private is still empty
-                       if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                               continue;
-                       }
-                       if ( name !== "toJSON" ) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-
-
-
-       function handleQueueMarkDefer( elem, type, src ) {
-               var deferDataKey = type + "defer",
-                       queueDataKey = type + "queue",
-                       markDataKey = type + "mark",
-                       defer = jQuery._data( elem, deferDataKey );
-               if ( defer &&
-                       ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
-                       ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
-                       // Give room for hard-coded callbacks to fire first
-                       // and eventually mark/queue something else on the element
-                       setTimeout( function() {
-                               if ( !jQuery._data( elem, queueDataKey ) &&
-                                       !jQuery._data( elem, markDataKey ) ) {
-                                       jQuery.removeData( elem, deferDataKey, true );
-                                       defer.fire();
-                               }
-                       }, 0 );
-               }
-       }
-
-       jQuery.extend({
-
-               _mark: function( elem, type ) {
-                       if ( elem ) {
-                               type = ( type || "fx" ) + "mark";
-                               jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
-                       }
-               },
-
-               _unmark: function( force, elem, type ) {
-                       if ( force !== true ) {
-                               type = elem;
-                               elem = force;
-                               force = false;
-                       }
-                       if ( elem ) {
-                               type = type || "fx";
-                               var key = type + "mark",
-                                       count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
-                               if ( count ) {
-                                       jQuery._data( elem, key, count );
-                               } else {
-                                       jQuery.removeData( elem, key, true );
-                                       handleQueueMarkDefer( elem, type, "mark" );
-                               }
-                       }
-               },
-
-               queue: function( elem, type, data ) {
-                       var q;
-                       if ( elem ) {
-                               type = ( type || "fx" ) + "queue";
-                               q = jQuery._data( elem, type );
-
-                               // Speed up dequeue by getting out quickly if this is just a lookup
-                               if ( data ) {
-                                       if ( !q || jQuery.isArray(data) ) {
-                                               q = jQuery._data( elem, type, jQuery.makeArray(data) );
-                                       } else {
-                                               q.push( data );
-                                       }
-                               }
-                               return q || [];
-                       }
-               },
-
-               dequeue: function( elem, type ) {
-                       type = type || "fx";
-
-                       var queue = jQuery.queue( elem, type ),
-                               fn = queue.shift(),
-                               hooks = {};
-
-                       // If the fx queue is dequeued, always remove the progress sentinel
-                       if ( fn === "inprogress" ) {
-                               fn = queue.shift();
-                       }
-
-                       if ( fn ) {
-                               // Add a progress sentinel to prevent the fx queue from being
-                               // automatically dequeued
-                               if ( type === "fx" ) {
-                                       queue.unshift( "inprogress" );
-                               }
-
-                               jQuery._data( elem, type + ".run", hooks );
-                               fn.call( elem, function() {
-                                       jQuery.dequeue( elem, type );
-                               }, hooks );
-                       }
-
-                       if ( !queue.length ) {
-                               jQuery.removeData( elem, type + "queue " + type + ".run", true );
-                               handleQueueMarkDefer( elem, type, "queue" );
+                               id = internalKey;
                        }
                }
-       });
-
-       jQuery.fn.extend({
-               queue: function( type, data ) {
-                       var setter = 2;
-
-                       if ( typeof type !== "string" ) {
-                               data = type;
-                               type = "fx";
-                               setter--;
-                       }
-
-                       if ( arguments.length < setter ) {
-                               return jQuery.queue( this[0], type );
-                       }
 
-                       return data === undefined ?
-                               this :
-                               this.each(function() {
-                                       var queue = jQuery.queue( this, type, data );
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
 
-                                       if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                               jQuery.dequeue( this, type );
-                                       }
-                               });
-               },
-               dequeue: function( type ) {
-                       return this.each(function() {
-                               jQuery.dequeue( this, type );
-                       });
-               },
-               // Based off of the plugin by Clint Helfers, with permission.
-               // http://blindsignals.com/index.php/2009/07/jquery-delay/
-               delay: function( time, type ) {
-                       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-                       type = type || "fx";
-
-                       return this.queue( type, function( next, hooks ) {
-                               var timeout = setTimeout( next, time );
-                               hooks.stop = function() {
-                                       clearTimeout( timeout );
-                               };
-                       });
-               },
-               clearQueue: function( type ) {
-                       return this.queue( type || "fx", [] );
-               },
-               // Get a promise resolved when queues of a certain type
-               // are emptied (fx is the type by default)
-               promise: function( type, object ) {
-                       if ( typeof type !== "string" ) {
-                               object = type;
-                               type = undefined;
-                       }
-                       type = type || "fx";
-                       var defer = jQuery.Deferred(),
-                               elements = this,
-                               i = elements.length,
-                               count = 1,
-                               deferDataKey = type + "defer",
-                               queueDataKey = type + "queue",
-                               markDataKey = type + "mark",
-                               tmp;
-                       function resolve() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       }
-                       while( i-- ) {
-                               if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
-                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
-                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
-                                               jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
-                                       count++;
-                                       tmp.add( resolve );
-                               }
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
                        }
-                       resolve();
-                       return defer.promise( object );
                }
-       });
-
-
-
-
-       var rclass = /[\n\t\r]/g,
-               rspace = /\s+/,
-               rreturn = /\r/g,
-               rtype = /^(?:button|input)$/i,
-               rfocusable = /^(?:button|input|object|select|textarea)$/i,
-               rclickable = /^a(?:rea)?$/i,
-               rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-               getSetAttribute = jQuery.support.getSetAttribute,
-               nodeHook, boolHook, fixSpecified;
 
-       jQuery.fn.extend({
-               attr: function( name, value ) {
-                       return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-               },
-
-               removeAttr: function( name ) {
-                       return this.each(function() {
-                               jQuery.removeAttr( this, name );
-                       });
-               },
-
-               prop: function( name, value ) {
-                       return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-               },
-
-               removeProp: function( name ) {
-                       name = jQuery.propFix[ name ] || name;
-                       return this.each(function() {
-                               // try/catch handles cases where IE balks (such as removing a property on window)
-                               try {
-                                       this[ name ] = undefined;
-                                       delete this[ name ];
-                               } catch( e ) {}
-                       });
-               },
-
-               addClass: function( value ) {
-                       var classNames, i, l, elem,
-                               setClass, c, cl;
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( j ) {
-                                       jQuery( this ).addClass( value.call(this, j, this.className) );
-                               });
-                       }
-
-                       if ( value && typeof value === "string" ) {
-                               classNames = value.split( rspace );
-
-                               for ( i = 0, l = this.length; i < l; i++ ) {
-                                       elem = this[ i ];
-
-                                       if ( elem.nodeType === 1 ) {
-                                               if ( !elem.className && classNames.length === 1 ) {
-                                                       elem.className = value;
-
-                                               } else {
-                                                       setClass = " " + elem.className + " ";
-
-                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                               if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
-                                                                       setClass += classNames[ c ] + " ";
-                                                               }
-                                                       }
-                                                       elem.className = jQuery.trim( setClass );
-                                               }
-                                       }
-                               }
-                       }
-
-                       return this;
-               },
-
-               removeClass: function( value ) {
-                       var classNames, i, l, elem, className, c, cl;
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( j ) {
-                                       jQuery( this ).removeClass( value.call(this, j, this.className) );
-                               });
-                       }
-
-                       if ( (value && typeof value === "string") || value === undefined ) {
-                               classNames = ( value || "" ).split( rspace );
-
-                               for ( i = 0, l = this.length; i < l; i++ ) {
-                                       elem = this[ i ];
-
-                                       if ( elem.nodeType === 1 && elem.className ) {
-                                               if ( value ) {
-                                                       className = (" " + elem.className + " ").replace( rclass, " " );
-                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                               className = className.replace(" " + classNames[ c ] + " ", " ");
-                                                       }
-                                                       elem.className = jQuery.trim( className );
-
-                                               } else {
-                                                       elem.className = "";
-                                               }
-                                       }
-                               }
-                       }
-
-                       return this;
-               },
-
-               toggleClass: function( value, stateVal ) {
-                       var type = typeof value,
-                               isBool = typeof stateVal === "boolean";
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( i ) {
-                                       jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                               });
-                       }
-
-                       return this.each(function() {
-                               if ( type === "string" ) {
-                                       // toggle individual class names
-                                       var className,
-                                               i = 0,
-                                               self = jQuery( this ),
-                                               state = stateVal,
-                                               classNames = value.split( rspace );
-
-                                       while ( (className = classNames[ i++ ]) ) {
-                                               // check each className given, space seperated list
-                                               state = isBool ? state : !self.hasClass( className );
-                                               self[ state ? "addClass" : "removeClass" ]( className );
-                                       }
-
-                               } else if ( type === "undefined" || type === "boolean" ) {
-                                       if ( this.className ) {
-                                               // store className if set
-                                               jQuery._data( this, "__className__", this.className );
-                                       }
-
-                                       // toggle whole className
-                                       this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-                               }
-                       });
-               },
-
-               hasClass: function( selector ) {
-                       var className = " " + selector + " ",
-                               i = 0,
-                               l = this.length;
-                       for ( ; i < l; i++ ) {
-                               if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               },
-
-               val: function( value ) {
-                       var hooks, ret, isFunction,
-                               elem = this[0];
-
-                       if ( !arguments.length ) {
-                               if ( elem ) {
-                                       hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-                                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                               return ret;
-                                       }
-
-                                       ret = elem.value;
-
-                                       return typeof ret === "string" ?
-                                               // handle most common string cases
-                                               ret.replace(rreturn, "") :
-                                               // handle cases where value is null/undef or number
-                                               ret == null ? "" : ret;
-                               }
-
-                               return;
-                       }
-
-                       isFunction = jQuery.isFunction( value );
-
-                       return this.each(function( i ) {
-                               var self = jQuery(this), val;
-
-                               if ( this.nodeType !== 1 ) {
-                                       return;
-                               }
-
-                               if ( isFunction ) {
-                                       val = value.call( this, i, self.val() );
-                               } else {
-                                       val = value;
-                               }
-
-                               // Treat null/undefined as ""; convert numbers to string
-                               if ( val == null ) {
-                                       val = "";
-                               } else if ( typeof val === "number" ) {
-                                       val += "";
-                               } else if ( jQuery.isArray( val ) ) {
-                                       val = jQuery.map(val, function ( value ) {
-                                               return value == null ? "" : value + "";
-                                       });
-                               }
-
-                               hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-                               // If set returns undefined, fall back to normal setting
-                               if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                                       this.value = val;
-                               }
-                       });
-               }
-       });
-
-       jQuery.extend({
-               valHooks: {
-                       option: {
-                               get: function( elem ) {
-                                       // attributes.value is undefined in Blackberry 4.7 but
-                                       // uses .value. See #6932
-                                       var val = elem.attributes.value;
-                                       return !val || val.specified ? elem.value : elem.text;
-                               }
-                       },
-                       select: {
-                               get: function( elem ) {
-                                       var value, i, max, option,
-                                               index = elem.selectedIndex,
-                                               values = [],
-                                               options = elem.options,
-                                               one = elem.type === "select-one";
-
-                                       // Nothing was selected
-                                       if ( index < 0 ) {
-                                               return null;
-                                       }
-
-                                       // Loop through all the selected options
-                                       i = one ? index : 0;
-                                       max = one ? index + 1 : options.length;
-                                       for ( ; i < max; i++ ) {
-                                               option = options[ i ];
-
-                                               // Don't return options that are disabled or in a disabled optgroup
-                                               if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
-                                                       // Get the specific value for the option
-                                                       value = jQuery( option ).val();
-
-                                                       // We don't need an array for one selects
-                                                       if ( one ) {
-                                                               return value;
-                                                       }
-
-                                                       // Multi-Selects return an array
-                                                       values.push( value );
-                                               }
-                                       }
-
-                                       // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-                                       if ( one && !values.length && options.length ) {
-                                               return jQuery( options[ index ] ).val();
-                                       }
-
-                                       return values;
-                               },
-
-                               set: function( elem, value ) {
-                                       var values = jQuery.makeArray( value );
-
-                                       jQuery(elem).find("option").each(function() {
-                                               this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-                                       });
-
-                                       if ( !values.length ) {
-                                               elem.selectedIndex = -1;
-                                       }
-                                       return values;
-                               }
-                       }
-               },
-
-               attrFn: {
-                       val: true,
-                       css: true,
-                       html: true,
-                       text: true,
-                       data: true,
-                       width: true,
-                       height: true,
-                       offset: true
-               },
-
-               attr: function( elem, name, value, pass ) {
-                       var ret, hooks, notxml,
-                               nType = elem.nodeType;
-
-                       // don't get/set attributes on text, comment and attribute nodes
-                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                               return;
-                       }
-
-                       if ( pass && name in jQuery.attrFn ) {
-                               return jQuery( elem )[ name ]( value );
-                       }
-
-                       // Fallback to prop when attributes are not supported
-                       if ( typeof elem.getAttribute === "undefined" ) {
-                               return jQuery.prop( elem, name, value );
-                       }
-
-                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-                       // All attributes are lowercase
-                       // Grab necessary hook if one is defined
-                       if ( notxml ) {
-                               name = name.toLowerCase();
-                               hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-                       }
-
-                       if ( value !== undefined ) {
-
-                               if ( value === null ) {
-                                       jQuery.removeAttr( elem, name );
-                                       return;
-
-                               } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                                       return ret;
-
-                               } else {
-                                       elem.setAttribute( name, "" + value );
-                                       return value;
-                               }
-
-                       } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
-
-                       } else {
-
-                               ret = elem.getAttribute( name );
-
-                               // Non-existent attributes return null, we normalize to undefined
-                               return ret === null ?
-                                       undefined :
-                                       ret;
-                       }
-               },
-
-               removeAttr: function( elem, value ) {
-                       var propName, attrNames, name, l, isBool,
-                               i = 0;
-
-                       if ( value && elem.nodeType === 1 ) {
-                               attrNames = value.toLowerCase().split( rspace );
-                               l = attrNames.length;
-
-                               for ( ; i < l; i++ ) {
-                                       name = attrNames[ i ];
-
-                                       if ( name ) {
-                                               propName = jQuery.propFix[ name ] || name;
-                                               isBool = rboolean.test( name );
-
-                                               // See #9699 for explanation of this approach (setting first, then removal)
-                                               // Do not do this for boolean attributes (see #10870)
-                                               if ( !isBool ) {
-                                                       jQuery.attr( elem, name, "" );
-                                               }
-                                               elem.removeAttribute( getSetAttribute ? name : propName );
-
-                                               // Set corresponding property to false for boolean attributes
-                                               if ( isBool && propName in elem ) {
-                                                       elem[ propName ] = false;
-                                               }
-                                       }
-                               }
-                       }
-               },
-
-               attrHooks: {
-                       type: {
-                               set: function( elem, value ) {
-                                       // We can't allow the type property to be changed (since it causes problems in IE)
-                                       if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                               jQuery.error( "type property can't be changed" );
-                                       } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                               // Setting the type on a radio button after the value resets the value in IE6-9
-                                               // Reset value to it's default in case type is set after value
-                                               // This is for element creation
-                                               var val = elem.value;
-                                               elem.setAttribute( "type", value );
-                                               if ( val ) {
-                                                       elem.value = val;
-                                               }
-                                               return value;
-                                       }
-                               }
-                       },
-                       // Use the value property for back compat
-                       // Use the nodeHook for button elements in IE6/7 (#1954)
-                       value: {
-                               get: function( elem, name ) {
-                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                               return nodeHook.get( elem, name );
-                                       }
-                                       return name in elem ?
-                                               elem.value :
-                                               null;
-                               },
-                               set: function( elem, value, name ) {
-                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                               return nodeHook.set( elem, value, name );
-                                       }
-                                       // Does not return so that setAttribute is also used
-                                       elem.value = value;
-                               }
-                       }
-               },
-
-               propFix: {
-                       tabindex: "tabIndex",
-                       readonly: "readOnly",
-                       "for": "htmlFor",
-                       "class": "className",
-                       maxlength: "maxLength",
-                       cellspacing: "cellSpacing",
-                       cellpadding: "cellPadding",
-                       rowspan: "rowSpan",
-                       colspan: "colSpan",
-                       usemap: "useMap",
-                       frameborder: "frameBorder",
-                       contenteditable: "contentEditable"
-               },
-
-               prop: function( elem, name, value ) {
-                       var ret, hooks, notxml,
-                               nType = elem.nodeType;
-
-                       // don't get/set properties on text, comment and attribute nodes
-                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                               return;
-                       }
-
-                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-                       if ( notxml ) {
-                               // Fix name and attach hooks
-                               name = jQuery.propFix[ name ] || name;
-                               hooks = jQuery.propHooks[ name ];
-                       }
-
-                       if ( value !== undefined ) {
-                               if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                                       return ret;
-
-                               } else {
-                                       return ( elem[ name ] = value );
-                               }
-
-                       } else {
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                                       return ret;
-
-                               } else {
-                                       return elem[ name ];
-                               }
-                       }
-               },
-
-               propHooks: {
-                       tabIndex: {
-                               get: function( elem ) {
-                                       // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                                       // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                                       var attributeNode = elem.getAttributeNode("tabindex");
-
-                                       return attributeNode && attributeNode.specified ?
-                                               parseInt( attributeNode.value, 10 ) :
-                                               rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                                       0 :
-                                                       undefined;
-                               }
-                       }
-               }
-       });
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-       jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-       boolHook = {
-               get: function( elem, name ) {
-                       // Align boolean attributes with corresponding properties
-                       // Fall back to attribute presence where some booleans are not supported
-                       var attrNode,
-                               property = jQuery.prop( elem, name );
-                       return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-                               name.toLowerCase() :
-                               undefined;
-               },
-               set: function( elem, value, name ) {
-                       var propName;
-                       if ( value === false ) {
-                               // Remove boolean attributes when set to false
-                               jQuery.removeAttr( elem, name );
-                       } else {
-                               // value is true since we know at this point it's type boolean and not false
-                               // Set boolean attributes to the same name and set the DOM property
-                               propName = jQuery.propFix[ name ] || name;
-                               if ( propName in elem ) {
-                                       // Only set the IDL specifically if it already exists on the element
-                                       elem[ propName ] = true;
-                               }
-
-                               elem.setAttribute( name, name.toLowerCase() );
-                       }
-                       return name;
-               }
-       };
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-       if ( !getSetAttribute ) {
-
-               fixSpecified = {
-                       name: true,
-                       id: true,
-                       coords: true
-               };
-
-               // Use this for any attribute in IE6/7
-               // This fixes almost every IE6/7 issue
-               nodeHook = jQuery.valHooks.button = {
-                       get: function( elem, name ) {
-                               var ret;
-                               ret = elem.getAttributeNode( name );
-                               return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
-                                       ret.nodeValue :
-                                       undefined;
-                       },
-                       set: function( elem, value, name ) {
-                               // Set the existing or create a new attribute node
-                               var ret = elem.getAttributeNode( name );
-                               if ( !ret ) {
-                                       ret = document.createAttribute( name );
-                                       elem.setAttributeNode( ret );
-                               }
-                               return ( ret.nodeValue = value + "" );
-                       }
-               };
-
-               // Apply the nodeHook to tabindex
-               jQuery.attrHooks.tabindex.set = nodeHook.set;
-
-               // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-               // This is for removals
-               jQuery.each([ "width", "height" ], function( i, name ) {
-                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                               set: function( elem, value ) {
-                                       if ( value === "" ) {
-                                               elem.setAttribute( name, "auto" );
-                                               return value;
-                                       }
-                               }
-                       });
-               });
-
-               // Set contenteditable to false on removals(#10429)
-               // Setting to empty string throws an error as an invalid value
-               jQuery.attrHooks.contenteditable = {
-                       get: nodeHook.get,
-                       set: function( elem, value, name ) {
-                               if ( value === "" ) {
-                                       value = "false";
-                               }
-                               nodeHook.set( elem, value, name );
-                       }
-               };
-       }
-
-
-// Some attributes require a special call on IE
-       if ( !jQuery.support.hrefNormalized ) {
-               jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                               get: function( elem ) {
-                                       var ret = elem.getAttribute( name, 2 );
-                                       return ret === null ? undefined : ret;
-                               }
-                       });
-               });
-       }
-
-       if ( !jQuery.support.style ) {
-               jQuery.attrHooks.style = {
-                       get: function( elem ) {
-                               // Return undefined in the case of empty string
-                               // Normalize to lowercase since IE uppercases css property names
-                               return elem.style.cssText.toLowerCase() || undefined;
-                       },
-                       set: function( elem, value ) {
-                               return ( elem.style.cssText = "" + value );
-                       }
-               };
-       }
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-       if ( !jQuery.support.optSelected ) {
-               jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-                       get: function( elem ) {
-                               var parent = elem.parentNode;
-
-                               if ( parent ) {
-                                       parent.selectedIndex;
-
-                                       // Make sure that it also works with optgroups, see #5701
-                                       if ( parent.parentNode ) {
-                                               parent.parentNode.selectedIndex;
-                                       }
-                               }
-                               return null;
-                       }
-               });
-       }
-
-// IE6/7 call enctype encoding
-       if ( !jQuery.support.enctype ) {
-               jQuery.propFix.enctype = "encoding";
-       }
-
-// Radios and checkboxes getter/setter
-       if ( !jQuery.support.checkOn ) {
-               jQuery.each([ "radio", "checkbox" ], function() {
-                       jQuery.valHooks[ this ] = {
-                               get: function( elem ) {
-                                       // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-                                       return elem.getAttribute("value") === null ? "on" : elem.value;
-                               }
-                       };
-               });
-       }
-       jQuery.each([ "radio", "checkbox" ], function() {
-               jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-                       set: function( elem, value ) {
-                               if ( jQuery.isArray( value ) ) {
-                                       return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                               }
-                       }
-               });
-       });
-
-
-
-
-       var rformElems = /^(?:textarea|input|select)$/i,
-               rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
-               rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
-               rkeyEvent = /^key/,
-               rmouseEvent = /^(?:mouse|contextmenu)|click/,
-               rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-               rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
-               quickParse = function( selector ) {
-                       var quick = rquickIs.exec( selector );
-                       if ( quick ) {
-                               //   0  1    2   3
-                               // [ _, tag, id, class ]
-                               quick[1] = ( quick[1] || "" ).toLowerCase();
-                               quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
-                       }
-                       return quick;
-               },
-               quickIs = function( elem, m ) {
-                       var attrs = elem.attributes || {};
-                       return (
-                               (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
-                                       (!m[2] || (attrs.id || {}).value === m[2]) &&
-                                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
-                               );
-               },
-               hoverHack = function( events ) {
-                       return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-               };
-
-       /*
-        * Helper functions for managing events -- not part of the public interface.
-        * Props to Dean Edwards' addEvent library for many of the ideas.
-        */
-       jQuery.event = {
-
-               add: function( elem, types, handler, data, selector ) {
-
-                       var elemData, eventHandle, events,
-                               t, tns, type, namespaces, handleObj,
-                               handleObjIn, quick, handlers, special;
-
-                       // Don't attach events to noData or text/comment nodes (allow plain objects tho)
-                       if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-                               return;
-                       }
-
-                       // Caller can pass in an object of custom data in lieu of the handler
-                       if ( handler.handler ) {
-                               handleObjIn = handler;
-                               handler = handleObjIn.handler;
-                               selector = handleObjIn.selector;
-                       }
-
-                       // Make sure that the handler has a unique ID, used to find/remove it later
-                       if ( !handler.guid ) {
-                               handler.guid = jQuery.guid++;
-                       }
-
-                       // Init the element's event structure and main handler, if this is the first
-                       events = elemData.events;
-                       if ( !events ) {
-                               elemData.events = events = {};
-                       }
-                       eventHandle = elemData.handle;
-                       if ( !eventHandle ) {
-                               elemData.handle = eventHandle = function( e ) {
-                                       // Discard the second event of a jQuery.event.trigger() and
-                                       // when an event is called after a page has unloaded
-                                       return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-                                               jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                               undefined;
-                               };
-                               // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                               eventHandle.elem = elem;
-                       }
-
-                       // Handle multiple events separated by a space
-                       // jQuery(...).bind("mouseover mouseout", fn);
-                       types = jQuery.trim( hoverHack(types) ).split( " " );
-                       for ( t = 0; t < types.length; t++ ) {
-
-                               tns = rtypenamespace.exec( types[t] ) || [];
-                               type = tns[1];
-                               namespaces = ( tns[2] || "" ).split( "." ).sort();
-
-                               // If event changes its type, use the special event handlers for the changed type
-                               special = jQuery.event.special[ type ] || {};
-
-                               // If selector defined, determine special event api type, otherwise given type
-                               type = ( selector ? special.delegateType : special.bindType ) || type;
-
-                               // Update special based on newly reset type
-                               special = jQuery.event.special[ type ] || {};
-
-                               // handleObj is passed to all event handlers
-                               handleObj = jQuery.extend({
-                                       type: type,
-                                       origType: tns[1],
-                                       data: data,
-                                       handler: handler,
-                                       guid: handler.guid,
-                                       selector: selector,
-                                       quick: selector && quickParse( selector ),
-                                       namespace: namespaces.join(".")
-                               }, handleObjIn );
-
-                               // Init the event handler queue if we're the first
-                               handlers = events[ type ];
-                               if ( !handlers ) {
-                                       handlers = events[ type ] = [];
-                                       handlers.delegateCount = 0;
-
-                                       // Only use addEventListener/attachEvent if the special events handler returns false
-                                       if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                               // Bind the global event handler to the element
-                                               if ( elem.addEventListener ) {
-                                                       elem.addEventListener( type, eventHandle, false );
-
-                                               } else if ( elem.attachEvent ) {
-                                                       elem.attachEvent( "on" + type, eventHandle );
-                                               }
-                                       }
-                               }
-
-                               if ( special.add ) {
-                                       special.add.call( elem, handleObj );
-
-                                       if ( !handleObj.handler.guid ) {
-                                               handleObj.handler.guid = handler.guid;
-                                       }
-                               }
-
-                               // Add to the element's handler list, delegates in front
-                               if ( selector ) {
-                                       handlers.splice( handlers.delegateCount++, 0, handleObj );
-                               } else {
-                                       handlers.push( handleObj );
-                               }
-
-                               // Keep track of which events have ever been used, for event optimization
-                               jQuery.event.global[ type ] = true;
-                       }
-
-                       // Nullify elem to prevent memory leaks in IE
-                       elem = null;
-               },
-
-               global: {},
-
-               // Detach an event or set of events from an element
-               remove: function( elem, types, handler, selector, mappedTypes ) {
-
-                       var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-                               t, tns, type, origType, namespaces, origCount,
-                               j, events, special, handle, eventType, handleObj;
-
-                       if ( !elemData || !(events = elemData.events) ) {
-                               return;
-                       }
-
-                       // Once for each type.namespace in types; type may be omitted
-                       types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-                       for ( t = 0; t < types.length; t++ ) {
-                               tns = rtypenamespace.exec( types[t] ) || [];
-                               type = origType = tns[1];
-                               namespaces = tns[2];
-
-                               // Unbind all events (on this namespace, if provided) for the element
-                               if ( !type ) {
-                                       for ( type in events ) {
-                                               jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-                                       }
-                                       continue;
-                               }
-
-                               special = jQuery.event.special[ type ] || {};
-                               type = ( selector? special.delegateType : special.bindType ) || type;
-                               eventType = events[ type ] || [];
-                               origCount = eventType.length;
-                               namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-
-                               // Remove matching events
-                               for ( j = 0; j < eventType.length; j++ ) {
-                                       handleObj = eventType[ j ];
-
-                                       if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                               ( !handler || handler.guid === handleObj.guid ) &&
-                                               ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-                                               ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                               eventType.splice( j--, 1 );
-
-                                               if ( handleObj.selector ) {
-                                                       eventType.delegateCount--;
-                                               }
-                                               if ( special.remove ) {
-                                                       special.remove.call( elem, handleObj );
-                                               }
-                                       }
-                               }
-
-                               // Remove generic event handler if we removed something and no more handlers exist
-                               // (avoids potential for endless recursion during removal of special event handlers)
-                               if ( eventType.length === 0 && origCount !== eventType.length ) {
-                                       if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
-                                               jQuery.removeEvent( elem, type, elemData.handle );
-                                       }
-
-                                       delete events[ type ];
-                               }
-                       }
-
-                       // Remove the expando if it's no longer used
-                       if ( jQuery.isEmptyObject( events ) ) {
-                               handle = elemData.handle;
-                               if ( handle ) {
-                                       handle.elem = null;
-                               }
-
-                               // removeData also checks for emptiness and clears the expando if empty
-                               // so use it instead of delete
-                               jQuery.removeData( elem, [ "events", "handle" ], true );
-                       }
-               },
-
-               // Events that are safe to short-circuit if no handlers are attached.
-               // Native DOM events should not be added, they may have inline handlers.
-               customEvent: {
-                       "getData": true,
-                       "setData": true,
-                       "changeData": true
-               },
-
-               trigger: function( event, data, elem, onlyHandlers ) {
-                       // Don't do events on text and comment nodes
-                       if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                               return;
-                       }
-
-                       // Event object or event type
-                       var type = event.type || event,
-                               namespaces = [],
-                               cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
-                       // focus/blur morphs to focusin/out; ensure we're not firing them right now
-                       if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                               return;
-                       }
-
-                       if ( type.indexOf( "!" ) >= 0 ) {
-                               // Exclusive events trigger only for the exact event (no namespaces)
-                               type = type.slice(0, -1);
-                               exclusive = true;
-                       }
-
-                       if ( type.indexOf( "." ) >= 0 ) {
-                               // Namespaced trigger; create a regexp to match event type in handle()
-                               namespaces = type.split(".");
-                               type = namespaces.shift();
-                               namespaces.sort();
-                       }
-
-                       if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-                               // No jQuery handlers for this event type, and it can't have inline handlers
-                               return;
-                       }
-
-                       // Caller can pass in an Event, Object, or just an event type string
-                       event = typeof event === "object" ?
-                               // jQuery.Event object
-                               event[ jQuery.expando ] ? event :
-                                       // Object literal
-                                       new jQuery.Event( type, event ) :
-                               // Just the event type (string)
-                               new jQuery.Event( type );
-
-                       event.type = type;
-                       event.isTrigger = true;
-                       event.exclusive = exclusive;
-                       event.namespace = namespaces.join( "." );
-                       event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-                       ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
-                       // Handle a global trigger
-                       if ( !elem ) {
-
-                               // TODO: Stop taunting the data cache; remove global events and always attach to document
-                               cache = jQuery.cache;
-                               for ( i in cache ) {
-                                       if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-                                               jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-                                       }
-                               }
-                               return;
-                       }
-
-                       // Clean up the event in case it is being reused
-                       event.result = undefined;
-                       if ( !event.target ) {
-                               event.target = elem;
-                       }
-
-                       // Clone any incoming data and prepend the event, creating the handler arg list
-                       data = data != null ? jQuery.makeArray( data ) : [];
-                       data.unshift( event );
-
-                       // Allow special events to draw outside the lines
-                       special = jQuery.event.special[ type ] || {};
-                       if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                               return;
-                       }
-
-                       // Determine event propagation path in advance, per W3C events spec (#9951)
-                       // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-                       eventPath = [[ elem, special.bindType || type ]];
-                       if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-                               bubbleType = special.delegateType || type;
-                               cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                               old = null;
-                               for ( ; cur; cur = cur.parentNode ) {
-                                       eventPath.push([ cur, bubbleType ]);
-                                       old = cur;
-                               }
-
-                               // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                               if ( old && old === elem.ownerDocument ) {
-                                       eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-                               }
-                       }
-
-                       // Fire handlers on the event path
-                       for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
-                               cur = eventPath[i][0];
-                               event.type = eventPath[i][1];
-
-                               handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                               if ( handle ) {
-                                       handle.apply( cur, data );
-                               }
-                               // Note that this is a bare JS function and not a jQuery handler
-                               handle = ontype && cur[ ontype ];
-                               if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
-                                       event.preventDefault();
-                               }
-                       }
-                       event.type = type;
-
-                       // If nobody prevented the default action, do it now
-                       if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-                               if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                                       !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-                                       // Call a native DOM method on the target with the same name name as the event.
-                                       // Can't use an .isFunction() check here because IE6/7 fails that test.
-                                       // Don't do default actions on window, that's where global variables be (#6170)
-                                       // IE<9 dies on focus/blur to hidden element (#1486)
-                                       if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
-                                               // Don't re-trigger an onFOO event when we call its FOO() method
-                                               old = elem[ ontype ];
-
-                                               if ( old ) {
-                                                       elem[ ontype ] = null;
-                                               }
-
-                                               // Prevent re-triggering of the same event, since we already bubbled it above
-                                               jQuery.event.triggered = type;
-                                               elem[ type ]();
-                                               jQuery.event.triggered = undefined;
-
-                                               if ( old ) {
-                                                       elem[ ontype ] = old;
-                                               }
-                                       }
-                               }
-                       }
-
-                       return event.result;
-               },
-
-               dispatch: function( event ) {
-
-                       // Make a writable jQuery.Event from the native event object
-                       event = jQuery.event.fix( event || window.event );
-
-                       var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                               delegateCount = handlers.delegateCount,
-                               args = [].slice.call( arguments, 0 ),
-                               run_all = !event.exclusive && !event.namespace,
-                               special = jQuery.event.special[ event.type ] || {},
-                               handlerQueue = [],
-                               i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
-
-                       // Use the fix-ed jQuery.Event rather than the (read-only) native event
-                       args[0] = event;
-                       event.delegateTarget = this;
-
-                       // Call the preDispatch hook for the mapped type, and let it bail if desired
-                       if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                               return;
-                       }
-
-                       // Determine handlers that should run if there are delegated events
-                       // Avoid non-left-click bubbling in Firefox (#3861)
-                       if ( delegateCount && !(event.button && event.type === "click") ) {
-
-                               // Pregenerate a single jQuery object for reuse with .is()
-                               jqcur = jQuery(this);
-                               jqcur.context = this.ownerDocument || this;
-
-                               for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
-                                       // Don't process events on disabled elements (#6911, #8165)
-                                       if ( cur.disabled !== true ) {
-                                               selMatch = {};
-                                               matches = [];
-                                               jqcur[0] = cur;
-                                               for ( i = 0; i < delegateCount; i++ ) {
-                                                       handleObj = handlers[ i ];
-                                                       sel = handleObj.selector;
-
-                                                       if ( selMatch[ sel ] === undefined ) {
-                                                               selMatch[ sel ] = (
-                                                                       handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
-                                                                       );
-                                                       }
-                                                       if ( selMatch[ sel ] ) {
-                                                               matches.push( handleObj );
-                                                       }
-                                               }
-                                               if ( matches.length ) {
-                                                       handlerQueue.push({ elem: cur, matches: matches });
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Add the remaining (directly-bound) handlers
-                       if ( handlers.length > delegateCount ) {
-                               handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-                       }
-
-                       // Run delegates first; they may want to stop propagation beneath us
-                       for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-                               matched = handlerQueue[ i ];
-                               event.currentTarget = matched.elem;
-
-                               for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                                       handleObj = matched.matches[ j ];
-
-                                       // Triggered event must either 1) be non-exclusive and have no namespace, or
-                                       // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                                       if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
-                                               event.data = handleObj.data;
-                                               event.handleObj = handleObj;
-
-                                               ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
-
-                                               if ( ret !== undefined ) {
-                                                       event.result = ret;
-                                                       if ( ret === false ) {
-                                                               event.preventDefault();
-                                                               event.stopPropagation();
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Call the postDispatch hook for the mapped type
-                       if ( special.postDispatch ) {
-                               special.postDispatch.call( this, event );
-                       }
-
-                       return event.result;
-               },
-
-               // Includes some event props shared by KeyEvent and MouseEvent
-               // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-               props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-               fixHooks: {},
-
-               keyHooks: {
-                       props: "char charCode key keyCode".split(" "),
-                       filter: function( event, original ) {
-
-                               // Add which for key events
-                               if ( event.which == null ) {
-                                       event.which = original.charCode != null ? original.charCode : original.keyCode;
-                               }
-
-                               return event;
-                       }
-               },
-
-               mouseHooks: {
-                       props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-                       filter: function( event, original ) {
-                               var eventDoc, doc, body,
-                                       button = original.button,
-                                       fromElement = original.fromElement;
-
-                               // Calculate pageX/Y if missing and clientX/Y available
-                               if ( event.pageX == null && original.clientX != null ) {
-                                       eventDoc = event.target.ownerDocument || document;
-                                       doc = eventDoc.documentElement;
-                                       body = eventDoc.body;
-
-                                       event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                                       event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                               }
-
-                               // Add relatedTarget, if necessary
-                               if ( !event.relatedTarget && fromElement ) {
-                                       event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                               }
-
-                               // Add which for click: 1 === left; 2 === middle; 3 === right
-                               // Note: button is not normalized, so don't use it
-                               if ( !event.which && button !== undefined ) {
-                                       event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-                               }
-
-                               return event;
-                       }
-               },
-
-               fix: function( event ) {
-                       if ( event[ jQuery.expando ] ) {
-                               return event;
-                       }
-
-                       // Create a writable copy of the event object and normalize some properties
-                       var i, prop,
-                               originalEvent = event,
-                               fixHook = jQuery.event.fixHooks[ event.type ] || {},
-                               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-                       event = jQuery.Event( originalEvent );
-
-                       for ( i = copy.length; i; ) {
-                               prop = copy[ --i ];
-                               event[ prop ] = originalEvent[ prop ];
-                       }
-
-                       // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-                       if ( !event.target ) {
-                               event.target = originalEvent.srcElement || document;
-                       }
-
-                       // Target should not be a text node (#504, Safari)
-                       if ( event.target.nodeType === 3 ) {
-                               event.target = event.target.parentNode;
-                       }
-
-                       // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
-                       if ( event.metaKey === undefined ) {
-                               event.metaKey = event.ctrlKey;
-                       }
-
-                       return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-               },
-
-               special: {
-                       ready: {
-                               // Make sure the ready event is setup
-                               setup: jQuery.bindReady
-                       },
-
-                       load: {
-                               // Prevent triggered image.load events from bubbling to window.load
-                               noBubble: true
-                       },
-
-                       focus: {
-                               delegateType: "focusin"
-                       },
-                       blur: {
-                               delegateType: "focusout"
-                       },
-
-                       beforeunload: {
-                               setup: function( data, namespaces, eventHandle ) {
-                                       // We only want to do this special case on windows
-                                       if ( jQuery.isWindow( this ) ) {
-                                               this.onbeforeunload = eventHandle;
-                                       }
-                               },
-
-                               teardown: function( namespaces, eventHandle ) {
-                                       if ( this.onbeforeunload === eventHandle ) {
-                                               this.onbeforeunload = null;
-                                       }
-                               }
-                       }
-               },
-
-               simulate: function( type, elem, event, bubble ) {
-                       // Piggyback on a donor event to simulate a different one.
-                       // Fake originalEvent to avoid donor's stopPropagation, but if the
-                       // simulated event prevents default then we do the same on the donor.
-                       var e = jQuery.extend(
-                               new jQuery.Event(),
-                               event,
-                               { type: type,
-                                       isSimulated: true,
-                                       originalEvent: {}
-                               }
-                       );
-                       if ( bubble ) {
-                               jQuery.event.trigger( e, null, elem );
-                       } else {
-                               jQuery.event.dispatch.call( elem, e );
-                       }
-                       if ( e.isDefaultPrevented() ) {
-                               event.preventDefault();
-                       }
-               }
-       };
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-       jQuery.event.handle = jQuery.event.dispatch;
-
-       jQuery.removeEvent = document.removeEventListener ?
-               function( elem, type, handle ) {
-                       if ( elem.removeEventListener ) {
-                               elem.removeEventListener( type, handle, false );
-                       }
-               } :
-               function( elem, type, handle ) {
-                       if ( elem.detachEvent ) {
-                               elem.detachEvent( "on" + type, handle );
-                       }
-               };
-
-       jQuery.Event = function( src, props ) {
-               // Allow instantiation without the 'new' keyword
-               if ( !(this instanceof jQuery.Event) ) {
-                       return new jQuery.Event( src, props );
-               }
-
-               // Event object
-               if ( src && src.type ) {
-                       this.originalEvent = src;
-                       this.type = src.type;
-
-                       // Events bubbling up the document may have been marked as prevented
-                       // by a handler lower down the tree; reflect the correct value.
-                       this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                               src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-                       // Event type
-               } else {
-                       this.type = src;
-               }
-
-               // Put explicitly provided properties onto the event object
-               if ( props ) {
-                       jQuery.extend( this, props );
-               }
-
-               // Create a timestamp if incoming event doesn't have one
-               this.timeStamp = src && src.timeStamp || jQuery.now();
-
-               // Mark it as fixed
-               this[ jQuery.expando ] = true;
-       };
-
-       function returnFalse() {
-               return false;
-       }
-       function returnTrue() {
-               return true;
-       }
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-       jQuery.Event.prototype = {
-               preventDefault: function() {
-                       this.isDefaultPrevented = returnTrue;
-
-                       var e = this.originalEvent;
-                       if ( !e ) {
-                               return;
-                       }
-
-                       // if preventDefault exists run it on the original event
-                       if ( e.preventDefault ) {
-                               e.preventDefault();
-
-                               // otherwise set the returnValue property of the original event to false (IE)
-                       } else {
-                               e.returnValue = false;
-                       }
-               },
-               stopPropagation: function() {
-                       this.isPropagationStopped = returnTrue;
-
-                       var e = this.originalEvent;
-                       if ( !e ) {
-                               return;
-                       }
-                       // if stopPropagation exists run it on the original event
-                       if ( e.stopPropagation ) {
-                               e.stopPropagation();
-                       }
-                       // otherwise set the cancelBubble property of the original event to true (IE)
-                       e.cancelBubble = true;
-               },
-               stopImmediatePropagation: function() {
-                       this.isImmediatePropagationStopped = returnTrue;
-                       this.stopPropagation();
-               },
-               isDefaultPrevented: returnFalse,
-               isPropagationStopped: returnFalse,
-               isImmediatePropagationStopped: returnFalse
-       };
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-       jQuery.each({
-               mouseenter: "mouseover",
-               mouseleave: "mouseout"
-       }, function( orig, fix ) {
-               jQuery.event.special[ orig ] = {
-                       delegateType: fix,
-                       bindType: fix,
-
-                       handle: function( event ) {
-                               var target = this,
-                                       related = event.relatedTarget,
-                                       handleObj = event.handleObj,
-                                       selector = handleObj.selector,
-                                       ret;
-
-                               // For mousenter/leave call the handler if related is outside the target.
-                               // NB: No relatedTarget if the mouse left/entered the browser window
-                               if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                                       event.type = handleObj.origType;
-                                       ret = handleObj.handler.apply( this, arguments );
-                                       event.type = fix;
-                               }
-                               return ret;
-                       }
-               };
-       });
-
-// IE submit delegation
-       if ( !jQuery.support.submitBubbles ) {
-
-               jQuery.event.special.submit = {
-                       setup: function() {
-                               // Only need this for delegated form submit events
-                               if ( jQuery.nodeName( this, "form" ) ) {
-                                       return false;
-                               }
-
-                               // Lazy-add a submit handler when a descendant form may potentially be submitted
-                               jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                                       // Node name check avoids a VML-related crash in IE (#9807)
-                                       var elem = e.target,
-                                               form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                                       if ( form && !form._submit_attached ) {
-                                               jQuery.event.add( form, "submit._submit", function( event ) {
-                                                       event._submit_bubble = true;
-                                               });
-                                               form._submit_attached = true;
-                                       }
-                               });
-                               // return undefined since we don't need an event listener
-                       },
-
-                       postDispatch: function( event ) {
-                               // If form was submitted by the user, bubble the event up the tree
-                               if ( event._submit_bubble ) {
-                                       delete event._submit_bubble;
-                                       if ( this.parentNode && !event.isTrigger ) {
-                                               jQuery.event.simulate( "submit", this.parentNode, event, true );
-                                       }
-                               }
-                       },
-
-                       teardown: function() {
-                               // Only need this for delegated form submit events
-                               if ( jQuery.nodeName( this, "form" ) ) {
-                                       return false;
-                               }
-
-                               // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                               jQuery.event.remove( this, "._submit" );
-                       }
-               };
-       }
-
-// IE change delegation and checkbox/radio fix
-       if ( !jQuery.support.changeBubbles ) {
-
-               jQuery.event.special.change = {
-
-                       setup: function() {
-
-                               if ( rformElems.test( this.nodeName ) ) {
-                                       // IE doesn't fire change on a check/radio until blur; trigger it on click
-                                       // after a propertychange. Eat the blur-change in special.change.handle.
-                                       // This still fires onchange a second time for check/radio after blur.
-                                       if ( this.type === "checkbox" || this.type === "radio" ) {
-                                               jQuery.event.add( this, "propertychange._change", function( event ) {
-                                                       if ( event.originalEvent.propertyName === "checked" ) {
-                                                               this._just_changed = true;
-                                                       }
-                                               });
-                                               jQuery.event.add( this, "click._change", function( event ) {
-                                                       if ( this._just_changed && !event.isTrigger ) {
-                                                               this._just_changed = false;
-                                                               jQuery.event.simulate( "change", this, event, true );
-                                                       }
-                                               });
-                                       }
-                                       return false;
-                               }
-                               // Delegated event; lazy-add a change handler on descendant inputs
-                               jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                                       var elem = e.target;
-
-                                       if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
-                                               jQuery.event.add( elem, "change._change", function( event ) {
-                                                       if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                               jQuery.event.simulate( "change", this.parentNode, event, true );
-                                                       }
-                                               });
-                                               elem._change_attached = true;
-                                       }
-                               });
-                       },
-
-                       handle: function( event ) {
-                               var elem = event.target;
-
-                               // Swallow native change events from checkbox/radio, we already triggered them above
-                               if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                                       return event.handleObj.handler.apply( this, arguments );
-                               }
-                       },
-
-                       teardown: function() {
-                               jQuery.event.remove( this, "._change" );
-
-                               return rformElems.test( this.nodeName );
-                       }
-               };
-       }
-
-// Create "bubbling" focus and blur events
-       if ( !jQuery.support.focusinBubbles ) {
-               jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-                       // Attach a single capturing handler while someone wants focusin/focusout
-                       var attaches = 0,
-                               handler = function( event ) {
-                                       jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                               };
-
-                       jQuery.event.special[ fix ] = {
-                               setup: function() {
-                                       if ( attaches++ === 0 ) {
-                                               document.addEventListener( orig, handler, true );
-                                       }
-                               },
-                               teardown: function() {
-                                       if ( --attaches === 0 ) {
-                                               document.removeEventListener( orig, handler, true );
-                                       }
-                               }
-                       };
-               });
-       }
-
-       jQuery.fn.extend({
-
-               on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-                       var origFn, type;
-
-                       // Types can be a map of types/handlers
-                       if ( typeof types === "object" ) {
-                               // ( types-Object, selector, data )
-                               if ( typeof selector !== "string" ) { // && selector != null
-                                       // ( types-Object, data )
-                                       data = data || selector;
-                                       selector = undefined;
-                               }
-                               for ( type in types ) {
-                                       this.on( type, selector, data, types[ type ], one );
-                               }
-                               return this;
-                       }
-
-                       if ( data == null && fn == null ) {
-                               // ( types, fn )
-                               fn = selector;
-                               data = selector = undefined;
-                       } else if ( fn == null ) {
-                               if ( typeof selector === "string" ) {
-                                       // ( types, selector, fn )
-                                       fn = data;
-                                       data = undefined;
-                               } else {
-                                       // ( types, data, fn )
-                                       fn = data;
-                                       data = selector;
-                                       selector = undefined;
-                               }
-                       }
-                       if ( fn === false ) {
-                               fn = returnFalse;
-                       } else if ( !fn ) {
-                               return this;
-                       }
-
-                       if ( one === 1 ) {
-                               origFn = fn;
-                               fn = function( event ) {
-                                       // Can use an empty set, since event contains the info
-                                       jQuery().off( event );
-                                       return origFn.apply( this, arguments );
-                               };
-                               // Use same guid so caller can remove using origFn
-                               fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-                       }
-                       return this.each( function() {
-                               jQuery.event.add( this, types, fn, data, selector );
-                       });
-               },
-               one: function( types, selector, data, fn ) {
-                       return this.on( types, selector, data, fn, 1 );
-               },
-               off: function( types, selector, fn ) {
-                       if ( types && types.preventDefault && types.handleObj ) {
-                               // ( event )  dispatched jQuery.Event
-                               var handleObj = types.handleObj;
-                               jQuery( types.delegateTarget ).off(
-                                       handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                                       handleObj.selector,
-                                       handleObj.handler
-                               );
-                               return this;
-                       }
-                       if ( typeof types === "object" ) {
-                               // ( types-object [, selector] )
-                               for ( var type in types ) {
-                                       this.off( type, selector, types[ type ] );
-                               }
-                               return this;
-                       }
-                       if ( selector === false || typeof selector === "function" ) {
-                               // ( types [, fn] )
-                               fn = selector;
-                               selector = undefined;
-                       }
-                       if ( fn === false ) {
-                               fn = returnFalse;
-                       }
-                       return this.each(function() {
-                               jQuery.event.remove( this, types, fn, selector );
-                       });
-               },
-
-               bind: function( types, data, fn ) {
-                       return this.on( types, null, data, fn );
-               },
-               unbind: function( types, fn ) {
-                       return this.off( types, null, fn );
-               },
-
-               live: function( types, data, fn ) {
-                       jQuery( this.context ).on( types, this.selector, data, fn );
-                       return this;
-               },
-               die: function( types, fn ) {
-                       jQuery( this.context ).off( types, this.selector || "**", fn );
-                       return this;
-               },
-
-               delegate: function( selector, types, data, fn ) {
-                       return this.on( types, selector, data, fn );
-               },
-               undelegate: function( selector, types, fn ) {
-                       // ( namespace ) or ( selector, types [, fn] )
-                       return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
-               },
-
-               trigger: function( type, data ) {
-                       return this.each(function() {
-                               jQuery.event.trigger( type, data, this );
-                       });
-               },
-               triggerHandler: function( type, data ) {
-                       if ( this[0] ) {
-                               return jQuery.event.trigger( type, data, this[0], true );
-                       }
-               },
-
-               toggle: function( fn ) {
-                       // Save reference to arguments for access in closure
-                       var args = arguments,
-                               guid = fn.guid || jQuery.guid++,
-                               i = 0,
-                               toggler = function( event ) {
-                                       // Figure out which function to execute
-                                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-                                       // Make sure that clicks stop
-                                       event.preventDefault();
-
-                                       // and execute the function
-                                       return args[ lastToggle ].apply( this, arguments ) || false;
-                               };
-
-                       // link all the functions, so any of them can unbind this click handler
-                       toggler.guid = guid;
-                       while ( i < args.length ) {
-                               args[ i++ ].guid = guid;
-                       }
-
-                       return this.click( toggler );
-               },
-
-               hover: function( fnOver, fnOut ) {
-                       return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-               }
-       });
-
-       jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-               "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-               "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-               // Handle event binding
-               jQuery.fn[ name ] = function( data, fn ) {
-                       if ( fn == null ) {
-                               fn = data;
-                               data = null;
-                       }
-
-                       return arguments.length > 0 ?
-                               this.on( name, null, data, fn ) :
-                               this.trigger( name );
-               };
-
-               if ( jQuery.attrFn ) {
-                       jQuery.attrFn[ name ] = true;
-               }
-
-               if ( rkeyEvent.test( name ) ) {
-                       jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-               }
-
-               if ( rmouseEvent.test( name ) ) {
-                       jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-               }
-       });
-
-
-
-       /*!
-        * Sizzle CSS Selector Engine
-        *  Copyright 2011, The Dojo Foundation
-        *  Released under the MIT, BSD, and GPL Licenses.
-        *  More information: http://sizzlejs.com/
-        */
-       (function(){
-
-               var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-                       expando = "sizcache" + (Math.random() + '').replace('.', ''),
-                       done = 0,
-                       toString = Object.prototype.toString,
-                       hasDuplicate = false,
-                       baseHasDuplicate = true,
-                       rBackslash = /\\/g,
-                       rReturn = /\r\n/g,
-                       rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-               [0, 0].sort(function() {
-                       baseHasDuplicate = false;
-                       return 0;
-               });
-
-               var Sizzle = function( selector, context, results, seed ) {
-                       results = results || [];
-                       context = context || document;
-
-                       var origContext = context;
-
-                       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
-                               return [];
-                       }
-
-                       if ( !selector || typeof selector !== "string" ) {
-                               return results;
-                       }
-
-                       var m, set, checkSet, extra, ret, cur, pop, i,
-                               prune = true,
-                               contextXML = Sizzle.isXML( context ),
-                               parts = [],
-                               soFar = selector;
-
-                       // Reset the position of the chunker regexp (start from head)
-                       do {
-                               chunker.exec( "" );
-                               m = chunker.exec( soFar );
-
-                               if ( m ) {
-                                       soFar = m[3];
-
-                                       parts.push( m[1] );
-
-                                       if ( m[2] ) {
-                                               extra = m[3];
-                                               break;
-                                       }
-                               }
-                       } while ( m );
-
-                       if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
-                               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-                                       set = posProcess( parts[0] + parts[1], context, seed );
-
-                               } else {
-                                       set = Expr.relative[ parts[0] ] ?
-                                               [ context ] :
-                                               Sizzle( parts.shift(), context );
-
-                                       while ( parts.length ) {
-                                               selector = parts.shift();
-
-                                               if ( Expr.relative[ selector ] ) {
-                                                       selector += parts.shift();
-                                               }
-
-                                               set = posProcess( selector, set, seed );
-                                       }
-                               }
-
-                       } else {
-                               // Take a shortcut and set the context if the root selector is an ID
-                               // (but not if it'll be faster if the inner selector is an ID)
-                               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-                                       Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
-                                       ret = Sizzle.find( parts.shift(), context, contextXML );
-                                       context = ret.expr ?
-                                               Sizzle.filter( ret.expr, ret.set )[0] :
-                                               ret.set[0];
-                               }
-
-                               if ( context ) {
-                                       ret = seed ?
-                                       { expr: parts.pop(), set: makeArray(seed) } :
-                                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
-                                       set = ret.expr ?
-                                               Sizzle.filter( ret.expr, ret.set ) :
-                                               ret.set;
-
-                                       if ( parts.length > 0 ) {
-                                               checkSet = makeArray( set );
-
-                                       } else {
-                                               prune = false;
-                                       }
-
-                                       while ( parts.length ) {
-                                               cur = parts.pop();
-                                               pop = cur;
-
-                                               if ( !Expr.relative[ cur ] ) {
-                                                       cur = "";
-                                               } else {
-                                                       pop = parts.pop();
-                                               }
-
-                                               if ( pop == null ) {
-                                                       pop = context;
-                                               }
-
-                                               Expr.relative[ cur ]( checkSet, pop, contextXML );
-                                       }
-
-                               } else {
-                                       checkSet = parts = [];
-                               }
-                       }
-
-                       if ( !checkSet ) {
-                               checkSet = set;
-                       }
-
-                       if ( !checkSet ) {
-                               Sizzle.error( cur || selector );
-                       }
-
-                       if ( toString.call(checkSet) === "[object Array]" ) {
-                               if ( !prune ) {
-                                       results.push.apply( results, checkSet );
-
-                               } else if ( context && context.nodeType === 1 ) {
-                                       for ( i = 0; checkSet[i] != null; i++ ) {
-                                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
-                                                       results.push( set[i] );
-                                               }
-                                       }
-
-                               } else {
-                                       for ( i = 0; checkSet[i] != null; i++ ) {
-                                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
-                                                       results.push( set[i] );
-                                               }
-                                       }
-                               }
-
-                       } else {
-                               makeArray( checkSet, results );
-                       }
-
-                       if ( extra ) {
-                               Sizzle( extra, origContext, results, seed );
-                               Sizzle.uniqueSort( results );
-                       }
-
-                       return results;
-               };
-
-               Sizzle.uniqueSort = function( results ) {
-                       if ( sortOrder ) {
-                               hasDuplicate = baseHasDuplicate;
-                               results.sort( sortOrder );
-
-                               if ( hasDuplicate ) {
-                                       for ( var i = 1; i < results.length; i++ ) {
-                                               if ( results[i] === results[ i - 1 ] ) {
-                                                       results.splice( i--, 1 );
-                                               }
-                                       }
-                               }
-                       }
-
-                       return results;
-               };
-
-               Sizzle.matches = function( expr, set ) {
-                       return Sizzle( expr, null, null, set );
-               };
-
-               Sizzle.matchesSelector = function( node, expr ) {
-                       return Sizzle( expr, null, null, [node] ).length > 0;
-               };
-
-               Sizzle.find = function( expr, context, isXML ) {
-                       var set, i, len, match, type, left;
-
-                       if ( !expr ) {
-                               return [];
-                       }
-
-                       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
-                               type = Expr.order[i];
-
-                               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
-                                       left = match[1];
-                                       match.splice( 1, 1 );
-
-                                       if ( left.substr( left.length - 1 ) !== "\\" ) {
-                                               match[1] = (match[1] || "").replace( rBackslash, "" );
-                                               set = Expr.find[ type ]( match, context, isXML );
-
-                                               if ( set != null ) {
-                                                       expr = expr.replace( Expr.match[ type ], "" );
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-
-                       if ( !set ) {
-                               set = typeof context.getElementsByTagName !== "undefined" ?
-                                       context.getElementsByTagName( "*" ) :
-                                       [];
-                       }
-
-                       return { set: set, expr: expr };
-               };
-
-               Sizzle.filter = function( expr, set, inplace, not ) {
-                       var match, anyFound,
-                               type, found, item, filter, left,
-                               i, pass,
-                               old = expr,
-                               result = [],
-                               curLoop = set,
-                               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
-                       while ( expr && set.length ) {
-                               for ( type in Expr.filter ) {
-                                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-                                               filter = Expr.filter[ type ];
-                                               left = match[1];
-
-                                               anyFound = false;
-
-                                               match.splice(1,1);
-
-                                               if ( left.substr( left.length - 1 ) === "\\" ) {
-                                                       continue;
-                                               }
-
-                                               if ( curLoop === result ) {
-                                                       result = [];
-                                               }
-
-                                               if ( Expr.preFilter[ type ] ) {
-                                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
-                                                       if ( !match ) {
-                                                               anyFound = found = true;
-
-                                                       } else if ( match === true ) {
-                                                               continue;
-                                                       }
-                                               }
-
-                                               if ( match ) {
-                                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
-                                                               if ( item ) {
-                                                                       found = filter( item, match, i, curLoop );
-                                                                       pass = not ^ found;
-
-                                                                       if ( inplace && found != null ) {
-                                                                               if ( pass ) {
-                                                                                       anyFound = true;
-
-                                                                               } else {
-                                                                                       curLoop[i] = false;
-                                                                               }
-
-                                                                       } else if ( pass ) {
-                                                                               result.push( item );
-                                                                               anyFound = true;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-
-                                               if ( found !== undefined ) {
-                                                       if ( !inplace ) {
-                                                               curLoop = result;
-                                                       }
-
-                                                       expr = expr.replace( Expr.match[ type ], "" );
-
-                                                       if ( !anyFound ) {
-                                                               return [];
-                                                       }
-
-                                                       break;
-                                               }
-                                       }
-                               }
-
-                               // Improper expression
-                               if ( expr === old ) {
-                                       if ( anyFound == null ) {
-                                               Sizzle.error( expr );
-
-                                       } else {
-                                               break;
-                                       }
-                               }
-
-                               old = expr;
-                       }
-
-                       return curLoop;
-               };
-
-               Sizzle.error = function( msg ) {
-                       throw new Error( "Syntax error, unrecognized expression: " + msg );
-               };
-
-               /**
-                * Utility function for retreiving the text value of an array of DOM nodes
-                * @param {Array|Element} elem
-                */
-               var getText = Sizzle.getText = function( elem ) {
-                       var i, node,
-                               nodeType = elem.nodeType,
-                               ret = "";
-
-                       if ( nodeType ) {
-                               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-                                       // Use textContent || innerText for elements
-                                       if ( typeof elem.textContent === 'string' ) {
-                                               return elem.textContent;
-                                       } else if ( typeof elem.innerText === 'string' ) {
-                                               // Replace IE's carriage returns
-                                               return elem.innerText.replace( rReturn, '' );
-                                       } else {
-                                               // Traverse it's children
-                                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
-                                                       ret += getText( elem );
-                                               }
-                                       }
-                               } else if ( nodeType === 3 || nodeType === 4 ) {
-                                       return elem.nodeValue;
-                               }
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
                        } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
 
-                               // If no nodeType, this is expected to be an array
-                               for ( i = 0; (node = elem[i]); i++ ) {
-                                       // Do not traverse comment nodes
-                                       if ( node.nodeType !== 8 ) {
-                                               ret += getText( node );
-                                       }
-                               }
-                       }
-                       return ret;
-               };
-
-               var Expr = Sizzle.selectors = {
-                       order: [ "ID", "NAME", "TAG" ],
-
-                       match: {
-                               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-                               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-                               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
-                               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
-                               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
-                               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
-                               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
-                               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
-                       },
-
-                       leftMatch: {},
-
-                       attrMap: {
-                               "class": "className",
-                               "for": "htmlFor"
-                       },
-
-                       attrHandle: {
-                               href: function( elem ) {
-                                       return elem.getAttribute( "href" );
-                               },
-                               type: function( elem ) {
-                                       return elem.getAttribute( "type" );
-                               }
-                       },
-
-                       relative: {
-                               "+": function(checkSet, part){
-                                       var isPartStr = typeof part === "string",
-                                               isTag = isPartStr && !rNonWord.test( part ),
-                                               isPartStrNotTag = isPartStr && !isTag;
-
-                                       if ( isTag ) {
-                                               part = part.toLowerCase();
-                                       }
-
-                                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-                                               if ( (elem = checkSet[i]) ) {
-                                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
-                                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
-                                                               elem || false :
-                                                               elem === part;
-                                               }
-                                       }
-
-                                       if ( isPartStrNotTag ) {
-                                               Sizzle.filter( part, checkSet, true );
-                                       }
-                               },
-
-                               ">": function( checkSet, part ) {
-                                       var elem,
-                                               isPartStr = typeof part === "string",
-                                               i = 0,
-                                               l = checkSet.length;
-
-                                       if ( isPartStr && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-
-                                               for ( ; i < l; i++ ) {
-                                                       elem = checkSet[i];
-
-                                                       if ( elem ) {
-                                                               var parent = elem.parentNode;
-                                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
-                                                       }
-                                               }
-
-                                       } else {
-                                               for ( ; i < l; i++ ) {
-                                                       elem = checkSet[i];
-
-                                                       if ( elem ) {
-                                                               checkSet[i] = isPartStr ?
-                                                                       elem.parentNode :
-                                                                       elem.parentNode === part;
-                                                       }
-                                               }
-
-                                               if ( isPartStr ) {
-                                                       Sizzle.filter( part, checkSet, true );
-                                               }
-                                       }
-                               },
-
-                               "": function(checkSet, part, isXML){
-                                       var nodeCheck,
-                                               doneName = done++,
-                                               checkFn = dirCheck;
-
-                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-                                               nodeCheck = part;
-                                               checkFn = dirNodeCheck;
-                                       }
-
-                                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
-                               },
-
-                               "~": function( checkSet, part, isXML ) {
-                                       var nodeCheck,
-                                               doneName = done++,
-                                               checkFn = dirCheck;
-
-                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-                                               nodeCheck = part;
-                                               checkFn = dirNodeCheck;
-                                       }
-
-                                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
-                               }
-                       },
-
-                       find: {
-                               ID: function( match, context, isXML ) {
-                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                                               var m = context.getElementById(match[1]);
-                                               // Check parentNode to catch when Blackberry 4.6 returns
-                                               // nodes that are no longer in the document #6963
-                                               return m && m.parentNode ? [m] : [];
-                                       }
-                               },
-
-                               NAME: function( match, context ) {
-                                       if ( typeof context.getElementsByName !== "undefined" ) {
-                                               var ret = [],
-                                                       results = context.getElementsByName( match[1] );
-
-                                               for ( var i = 0, l = results.length; i < l; i++ ) {
-                                                       if ( results[i].getAttribute("name") === match[1] ) {
-                                                               ret.push( results[i] );
-                                                       }
-                                               }
-
-                                               return ret.length === 0 ? null : ret;
-                                       }
-                               },
-
-                               TAG: function( match, context ) {
-                                       if ( typeof context.getElementsByTagName !== "undefined" ) {
-                                               return context.getElementsByTagName( match[1] );
-                                       }
-                               }
-                       },
-                       preFilter: {
-                               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
-                                       match = " " + match[1].replace( rBackslash, "" ) + " ";
-
-                                       if ( isXML ) {
-                                               return match;
-                                       }
-
-                                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-                                               if ( elem ) {
-                                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
-                                                               if ( !inplace ) {
-                                                                       result.push( elem );
-                                                               }
-
-                                                       } else if ( inplace ) {
-                                                               curLoop[i] = false;
-                                                       }
-                                               }
-                                       }
-
-                                       return false;
-                               },
-
-                               ID: function( match ) {
-                                       return match[1].replace( rBackslash, "" );
-                               },
-
-                               TAG: function( match, curLoop ) {
-                                       return match[1].replace( rBackslash, "" ).toLowerCase();
-                               },
-
-                               CHILD: function( match ) {
-                                       if ( match[1] === "nth" ) {
-                                               if ( !match[2] ) {
-                                                       Sizzle.error( match[0] );
-                                               }
-
-                                               match[2] = match[2].replace(/^\+|\s*/g, '');
-
-                                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-                                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
-                                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
-                                                               !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
-                                               // calculate the numbers (first)n+(last) including if they are negative
-                                               match[2] = (test[1] + (test[2] || 1)) - 0;
-                                               match[3] = test[3] - 0;
-                                       }
-                                       else if ( match[2] ) {
-                                               Sizzle.error( match[0] );
-                                       }
+               thisCache = cache[ id ];
 
-                                       // TODO: Move to normal caching system
-                                       match[0] = done++;
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
 
-                                       return match;
-                               },
+                       thisCache = thisCache.data;
+               }
 
-                               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
-                                       var name = match[1] = match[1].replace( rBackslash, "" );
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
 
-                                       if ( !isXML && Expr.attrMap[name] ) {
-                                               match[1] = Expr.attrMap[name];
-                                       }
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
 
-                                       // Handle if an un-quoted value was used
-                                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
 
-                                       if ( match[2] === "~=" ) {
-                                               match[4] = " " + match[4] + " ";
-                                       }
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
 
-                                       return match;
-                               },
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
 
-                               PSEUDO: function( match, curLoop, inplace, result, not ) {
-                                       if ( match[1] === "not" ) {
-                                               // If we're dealing with a complex expression, or a simple one
-                                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
-                                                       match[3] = Sizzle(match[3], null, null, curLoop);
+               return ret;
+       },
 
-                                               } else {
-                                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
 
-                                                       if ( !inplace ) {
-                                                               result.push.apply( result, ret );
-                                                       }
+               var thisCache, i, l,
 
-                                                       return false;
-                                               }
+                       isNode = elem.nodeType,
 
-                                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
-                                               return true;
-                                       }
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 
-                                       return match;
-                               },
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
 
-                               POS: function( match ) {
-                                       match.unshift( true );
+               if ( name ) {
 
-                                       return match;
-                               }
-                       },
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
 
-                       filters: {
-                               enabled: function( elem ) {
-                                       return elem.disabled === false && elem.type !== "hidden";
-                               },
+                       if ( thisCache ) {
 
-                               disabled: function( elem ) {
-                                       return elem.disabled === true;
-                               },
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
 
-                               checked: function( elem ) {
-                                       return elem.checked === true;
-                               },
+                                       // try the string as a key before any manipulation
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
 
-                               selected: function( elem ) {
-                                       // Accessing this property makes selected-by-default
-                                       // options in Safari work properly
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.selectedIndex;
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split(" ");
+                                               }
                                        }
+                               }
 
-                                       return elem.selected === true;
-                               },
-
-                               parent: function( elem ) {
-                                       return !!elem.firstChild;
-                               },
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
 
-                               empty: function( elem ) {
-                                       return !elem.firstChild;
-                               },
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
 
-                               has: function( elem, i, match ) {
-                                       return !!Sizzle( match[3], elem ).length;
-                               },
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
 
-                               header: function( elem ) {
-                                       return (/h\d/i).test( elem.nodeName );
-                               },
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject( cache[ id ] ) ) {
+                               return;
+                       }
+               }
 
-                               text: function( elem ) {
-                                       var attr = elem.getAttribute( "type" ), type = elem.type;
-                                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-                                       // use getAttribute instead to test this case
-                                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
-                               },
+               // Destroy the cache
+               if ( isNode ) {
+                       jQuery.cleanData( [ elem ], true );
 
-                               radio: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
-                               },
+               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+                       delete cache[ id ];
 
-                               checkbox: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
-                               },
+               // When all else fails, null
+               } else {
+                       cache[ id ] = null;
+               }
+       },
 
-                               file: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
-                               },
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
 
-                               password: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
-                               },
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
 
-                               submit: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return (name === "input" || name === "button") && "submit" === elem.type;
-                               },
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+       }
+});
 
-                               image: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
-                               },
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, part, attr, name, l,
+                       elem = this[0],
+                       i = 0,
+                       data = null;
 
-                               reset: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return (name === "input" || name === "button") && "reset" === elem.type;
-                               },
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
 
-                               button: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return name === "input" && "button" === elem.type || name === "button";
-                               },
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attr = elem.attributes;
+                                       for ( l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
 
-                               input: function( elem ) {
-                                       return (/input|select|textarea|button/i).test( elem.nodeName );
-                               },
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
 
-                               focus: function( elem ) {
-                                       return elem === elem.ownerDocument.activeElement;
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
                                }
-                       },
-                       setFilters: {
-                               first: function( elem, i ) {
-                                       return i === 0;
-                               },
-
-                               last: function( elem, i, match, array ) {
-                                       return i === array.length - 1;
-                               },
+                       }
 
-                               even: function( elem, i ) {
-                                       return i % 2 === 0;
-                               },
+                       return data;
+               }
 
-                               odd: function( elem, i ) {
-                                       return i % 2 === 1;
-                               },
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
 
-                               lt: function( elem, i, match ) {
-                                       return i < match[3] - 0;
-                               },
+               parts = key.split( ".", 2 );
+               parts[1] = parts[1] ? "." + parts[1] : "";
+               part = parts[1] + "!";
 
-                               gt: function( elem, i, match ) {
-                                       return i > match[3] - 0;
-                               },
+               return jQuery.access( this, function( value ) {
 
-                               nth: function( elem, i, match ) {
-                                       return match[3] - 0 === i;
-                               },
+                       if ( value === undefined ) {
+                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
 
-                               eq: function( elem, i, match ) {
-                                       return match[3] - 0 === i;
+                               // Try to fetch any internally stored data first
+                               if ( data === undefined && elem ) {
+                                       data = jQuery.data( elem, key );
+                                       data = dataAttr( elem, key, data );
                                }
-                       },
-                       filter: {
-                               PSEUDO: function( elem, match, i, array ) {
-                                       var name = match[1],
-                                               filter = Expr.filters[ name ];
 
-                                       if ( filter ) {
-                                               return filter( elem, i, match, array );
+                               return data === undefined && parts[1] ?
+                                       this.data( parts[0] ) :
+                                       data;
+                       }
 
-                                       } else if ( name === "contains" ) {
-                                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+                       parts[1] = value;
+                       this.each(function() {
+                               var self = jQuery( this );
 
-                                       } else if ( name === "not" ) {
-                                               var not = match[3];
+                               self.triggerHandler( "setData" + part, parts );
+                               jQuery.data( this, key, value );
+                               self.triggerHandler( "changeData" + part, parts );
+                       });
+               }, null, value, arguments.length > 1, null, false );
+       },
 
-                                               for ( var j = 0, l = not.length; j < l; j++ ) {
-                                                       if ( not[j] === elem ) {
-                                                               return false;
-                                                       }
-                                               }
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
 
-                                               return true;
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
 
-                                       } else {
-                                               Sizzle.error( name );
-                                       }
-                               },
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
 
-                               CHILD: function( elem, match ) {
-                                       var first, last,
-                                               doneName, parent, cache,
-                                               count, diff,
-                                               type = match[1],
-                                               node = elem;
-
-                                       switch ( type ) {
-                                               case "only":
-                                               case "first":
-                                                       while ( (node = node.previousSibling) ) {
-                                                               if ( node.nodeType === 1 ) {
-                                                                       return false;
-                                                               }
-                                                       }
+               data = elem.getAttribute( name );
 
-                                                       if ( type === "first" ) {
-                                                               return true;
-                                                       }
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               // Only convert to a number if it doesn't change the string
+                               +data + "" === data ? +data :
+                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
 
-                                                       node = elem;
+               } else {
+                       data = undefined;
+               }
+       }
 
-                                               /* falls through */
-                                               case "last":
-                                                       while ( (node = node.nextSibling) ) {
-                                                               if ( node.nodeType === 1 ) {
-                                                                       return false;
-                                                               }
-                                                       }
+       return data;
+}
 
-                                                       return true;
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
 
-                                               case "nth":
-                                                       first = match[2];
-                                                       last = match[3];
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
 
-                                                       if ( first === 1 && last === 0 ) {
-                                                               return true;
-                                                       }
+       return true;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
 
-                                                       doneName = match[0];
-                                                       parent = elem.parentNode;
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
 
-                                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
-                                                               count = 0;
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
 
-                                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
-                                                                       if ( node.nodeType === 1 ) {
-                                                                               node.nodeIndex = ++count;
-                                                                       }
-                                                               }
+       dequeue: function( elem, type ) {
+               type = type || "fx";
 
-                                                               parent[ expando ] = doneName;
-                                                       }
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
 
-                                                       diff = elem.nodeIndex - last;
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
 
-                                                       if ( first === 0 ) {
-                                                               return diff === 0;
+               if ( fn ) {
 
-                                                       } else {
-                                                               return ( diff % first === 0 && diff / first >= 0 );
-                                                       }
-                                       }
-                               },
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
 
-                               ID: function( elem, match ) {
-                                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
-                               },
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
 
-                               TAG: function( elem, match ) {
-                                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
-                               },
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery.removeData( elem, type + "queue", true );
+                               jQuery.removeData( elem, key, true );
+                       })
+               });
+       }
+});
 
-                               CLASS: function( elem, match ) {
-                                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
-                                               .indexOf( match ) > -1;
-                               },
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
 
-                               ATTR: function( elem, match ) {
-                                       var name = match[1],
-                                               result = Sizzle.attr ?
-                                                       Sizzle.attr( elem, name ) :
-                                                       Expr.attrHandle[ name ] ?
-                                                               Expr.attrHandle[ name ]( elem ) :
-                                                               elem[ name ] != null ?
-                                                                       elem[ name ] :
-                                                                       elem.getAttribute( name ),
-                                               value = result + "",
-                                               type = match[2],
-                                               check = match[4];
-
-                                       return result == null ?
-                                               type === "!=" :
-                                               !type && Sizzle.attr ?
-                                                       result != null :
-                                                       type === "=" ?
-                                                               value === check :
-                                                               type === "*=" ?
-                                                                       value.indexOf(check) >= 0 :
-                                                                       type === "~=" ?
-                                                                               (" " + value + " ").indexOf(check) >= 0 :
-                                                                               !check ?
-                                                                                       value && result !== false :
-                                                                                       type === "!=" ?
-                                                                                               value !== check :
-                                                                                               type === "^=" ?
-                                                                                                       value.indexOf(check) === 0 :
-                                                                                                       type === "$=" ?
-                                                                                                               value.substr(value.length - check.length) === check :
-                                                                                                               type === "|=" ?
-                                                                                                                       value === check || value.substr(0, check.length + 1) === check + "-" :
-                                                                                                                       false;
-                               },
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
 
-                               POS: function( elem, match, i, array ) {
-                                       var name = match[2],
-                                               filter = Expr.setFilters[ name ];
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
 
-                                       if ( filter ) {
-                                               return filter( elem, i, match, array );
-                                       }
-                               }
-                       }
-               };
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
 
-               var origPOS = Expr.match.POS,
-                       fescape = function(all, num){
-                               return "\\" + (num - 0 + 1);
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
                        };
 
-               for ( var type in Expr.match ) {
-                       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
-                       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
                }
-// Expose origPOS
-// "global" as in regardless of relation to brackets/parens
-               Expr.match.globalPOS = origPOS;
+               type = type || "fx";
 
-               var makeArray = function( array, results ) {
-                       array = Array.prototype.slice.call( array, 0 );
-
-                       if ( results ) {
-                               results.push.apply( results, array );
-                               return results;
+               while( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
                        }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook, fixSpecified,
+       rclass = /[\t\r\n]/g,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea|)$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
 
-                       return array;
-               };
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
 
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-               try {
-                       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
 
-// Provide a fallback method if it does not work
-               } catch( e ) {
-                       makeArray = function( array, results ) {
-                               var i = 0,
-                                       ret = results || [];
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
 
-                               if ( toString.call(array) === "[object Array]" ) {
-                                       Array.prototype.push.apply( ret, array );
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( core_rspace );
 
-                               } else {
-                                       if ( typeof array.length === "number" ) {
-                                               for ( var l = array.length; i < l; i++ ) {
-                                                       ret.push( array[i] );
-                                               }
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
 
                                        } else {
-                                               for ( ; array[i]; i++ ) {
-                                                       ret.push( array[i] );
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
                                                }
+                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
-
-                               return ret;
-                       };
+                       }
                }
 
-               var sortOrder, siblingCheck;
+               return this;
+       },
 
-               if ( document.documentElement.compareDocumentPosition ) {
-                       sortOrder = function( a, b ) {
-                               if ( a === b ) {
-                                       hasDuplicate = true;
-                                       return 0;
-                               }
+       removeClass: function( value ) {
+               var removes, className, elem, c, cl, i, l;
 
-                               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
-                                       return a.compareDocumentPosition ? -1 : 1;
-                               }
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       removes = ( value || "" ).split( core_rspace );
 
-                               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
-                       };
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+                               if ( elem.nodeType === 1 && elem.className ) {
 
-               } else {
-                       sortOrder = function( a, b ) {
-                               // The nodes are identical, we can exit early
-                               if ( a === b ) {
-                                       hasDuplicate = true;
-                                       return 0;
-
-                                       // Fallback to using sourceIndex (in IE) if it's available on both nodes
-                               } else if ( a.sourceIndex && b.sourceIndex ) {
-                                       return a.sourceIndex - b.sourceIndex;
+                                       className = (" " + elem.className + " ").replace( rclass, " " );
+
+                                       // loop over each item in the removal list
+                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
+                                               // Remove until there is nothing to remove,
+                                               while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
+                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( className ) : "";
                                }
+                       }
+               }
+
+               return this;
+       },
 
-                               var al, bl,
-                                       ap = [],
-                                       bp = [],
-                                       aup = a.parentNode,
-                                       bup = b.parentNode,
-                                       cur = aup;
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
 
-                               // If the nodes are siblings (or identical) we can do a quick check
-                               if ( aup === bup ) {
-                                       return siblingCheck( a, b );
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
 
-                                       // If no parents were found then the nodes are disconnected
-                               } else if ( !aup ) {
-                                       return -1;
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( core_rspace );
 
-                               } else if ( !bup ) {
-                                       return 1;
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
                                }
 
-                               // Otherwise they're somewhere else in the tree so we need
-                               // to build up a full list of the parentNodes for comparison
-                               while ( cur ) {
-                                       ap.unshift( cur );
-                                       cur = cur.parentNode;
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
                                }
 
-                               cur = bup;
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
 
-                               while ( cur ) {
-                                       bp.unshift( cur );
-                                       cur = cur.parentNode;
-                               }
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                               return true;
+                       }
+               }
 
-                               al = ap.length;
-                               bl = bp.length;
+               return false;
+       },
 
-                               // Start walking down the tree looking for a discrepancy
-                               for ( var i = 0; i < al && i < bl; i++ ) {
-                                       if ( ap[i] !== bp[i] ) {
-                                               return siblingCheck( ap[i], bp[i] );
-                                       }
-                               }
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
 
-                               // We ended someplace up the tree so do a sibling check
-                               return i === al ?
-                                       siblingCheck( a, bp[i], -1 ) :
-                                       siblingCheck( ap[i], b, 1 );
-                       };
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
-                       siblingCheck = function( a, b, ret ) {
-                               if ( a === b ) {
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                                        return ret;
                                }
 
-                               var cur = a.nextSibling;
-
-                               while ( cur ) {
-                                       if ( cur === b ) {
-                                               return -1;
-                                       }
+                               ret = elem.value;
 
-                                       cur = cur.nextSibling;
-                               }
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
 
-                               return 1;
-                       };
+                       return;
                }
 
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-               (function(){
-                       // We're going to inject a fake input element with a specified name
-                       var form = document.createElement("div"),
-                               id = "script" + (new Date()).getTime(),
-                               root = document.documentElement;
+               isFunction = jQuery.isFunction( value );
 
-                       form.innerHTML = "<a name='" + id + "'/>";
+               return this.each(function( i ) {
+                       var val,
+                               self = jQuery(this);
 
-                       // Inject it into the root element, check its status, and remove it quickly
-                       root.insertBefore( form, root.firstChild );
-
-                       // The workaround has to do additional checks after a getElementById
-                       // Which slows things down for other browsers (hence the branching)
-                       if ( document.getElementById( id ) ) {
-                               Expr.find.ID = function( match, context, isXML ) {
-                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                                               var m = context.getElementById(match[1]);
-
-                                               return m ?
-                                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
-                                                               [m] :
-                                                               undefined :
-                                                       [];
-                                       }
-                               };
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-                               Expr.filter.ID = function( elem, match ) {
-                                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
 
-                                       return elem.nodeType === 1 && node && node.nodeValue === match;
-                               };
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
                        }
 
-                       root.removeChild( form );
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
-                       // release memory in IE
-                       root = form = null;
-               })();
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
 
-               (function(){
-                       // Check to see if the browser returns only elements
-                       // when doing getElementsByTagName("*")
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, i, max, option,
+                                       index = elem.selectedIndex,
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
 
-                       // Create a fake element
-                       var div = document.createElement("div");
-                       div.appendChild( document.createComment("") );
+                               // Loop through all the selected options
+                               i = one ? index : 0;
+                               max = one ? index + 1 : options.length;
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
 
-                       // Make sure no comments are found
-                       if ( div.getElementsByTagName("*").length > 0 ) {
-                               Expr.find.TAG = function( match, context ) {
-                                       var results = context.getElementsByTagName( match[1] );
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
 
-                                       // Filter out possible comments
-                                       if ( match[1] === "*" ) {
-                                               var tmp = [];
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
 
-                                               for ( var i = 0; results[i]; i++ ) {
-                                                       if ( results[i].nodeType === 1 ) {
-                                                               tmp.push( results[i] );
-                                                       }
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
                                                }
 
-                                               results = tmp;
+                                               // Multi-Selects return an array
+                                               values.push( value );
                                        }
+                               }
 
-                                       return results;
-                               };
-                       }
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
 
-                       // Check to see if an attribute returns normalized href attributes
-                       div.innerHTML = "<a href='#'></a>";
+                               return values;
+                       },
 
-                       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-                               div.firstChild.getAttribute("href") !== "#" ) {
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
 
-                               Expr.attrHandle.href = function( elem ) {
-                                       return elem.getAttribute( "href", 2 );
-                               };
-                       }
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
 
-                       // release memory in IE
-                       div = null;
-               })();
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
 
-               if ( document.querySelectorAll ) {
-                       (function(){
-                               var oldSizzle = Sizzle,
-                                       div = document.createElement("div"),
-                                       id = "__sizzle__";
+       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+       attrFn: {},
 
-                               div.innerHTML = "<p class='TEST'></p>";
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
 
-                               // Safari can't handle uppercase or unicode characters when
-                               // in quirks mode.
-                               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-                                       return;
-                               }
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-                               Sizzle = function( query, context, extra, seed ) {
-                                       context = context || document;
+               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
 
-                                       // Only use querySelectorAll on non-XML documents
-                                       // (ID selectors don't work in non-HTML documents)
-                                       if ( !seed && !Sizzle.isXML(context) ) {
-                                               // See if we find a selector to speed up
-                                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
 
-                                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
-                                                       // Speed-up: Sizzle("TAG")
-                                                       if ( match[1] ) {
-                                                               return makeArray( context.getElementsByTagName( query ), extra );
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-                                                               // Speed-up: Sizzle(".CLASS")
-                                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
-                                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
-                                                       }
-                                               }
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
 
-                                               if ( context.nodeType === 9 ) {
-                                                       // Speed-up: Sizzle("body")
-                                                       // The body element only exists once, optimize finding it
-                                                       if ( query === "body" && context.body ) {
-                                                               return makeArray( [ context.body ], extra );
-
-                                                               // Speed-up: Sizzle("#ID")
-                                                       } else if ( match && match[3] ) {
-                                                               var elem = context.getElementById( match[3] );
-
-                                                               // Check parentNode to catch when Blackberry 4.6 returns
-                                                               // nodes that are no longer in the document #6963
-                                                               if ( elem && elem.parentNode ) {
-                                                                       // Handle the case where IE and Opera return items
-                                                                       // by name instead of ID
-                                                                       if ( elem.id === match[3] ) {
-                                                                               return makeArray( [ elem ], extra );
-                                                                       }
+               if ( value !== undefined ) {
 
-                                                               } else {
-                                                                       return makeArray( [], extra );
-                                                               }
-                                                       }
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
 
-                                                       try {
-                                                               return makeArray( context.querySelectorAll(query), extra );
-                                                       } catch(qsaError) {}
-
-                                                       // qSA works strangely on Element-rooted queries
-                                                       // We can work around this by specifying an extra ID on the root
-                                                       // and working up from there (Thanks to Andrew Dupont for the technique)
-                                                       // IE 8 doesn't work on object elements
-                                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-                                                       var oldContext = context,
-                                                               old = context.getAttribute( "id" ),
-                                                               nid = old || id,
-                                                               hasParent = context.parentNode,
-                                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
-
-                                                       if ( !old ) {
-                                                               context.setAttribute( "id", nid );
-                                                       } else {
-                                                               nid = nid.replace( /'/g, "\\$&" );
-                                                       }
-                                                       if ( relativeHierarchySelector && hasParent ) {
-                                                               context = context.parentNode;
-                                                       }
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
 
-                                                       try {
-                                                               if ( !relativeHierarchySelector || hasParent ) {
-                                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
-                                                               }
+                       } else {
+                               elem.setAttribute( name, "" + value );
+                               return value;
+                       }
 
-                                                       } catch(pseudoError) {
-                                                       } finally {
-                                                               if ( !old ) {
-                                                                       oldContext.removeAttribute( "id" );
-                                                               }
-                                                       }
-                                               }
-                                       }
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
 
-                                       return oldSizzle(query, context, extra, seed);
-                               };
+               } else {
 
-                               for ( var prop in oldSizzle ) {
-                                       Sizzle[ prop ] = oldSizzle[ prop ];
-                               }
+                       ret = elem.getAttribute( name );
 
-                               // release memory in IE
-                               div = null;
-                       })();
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
                }
+       },
 
-               (function(){
-                       var html = document.documentElement,
-                               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, isBool,
+                       i = 0;
 
-                       if ( matches ) {
-                               // Check to see if it's possible to do matchesSelector
-                               // on a disconnected node (IE 9 fails this)
-                               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
-                                       pseudoWorks = false;
+               if ( value && elem.nodeType === 1 ) {
 
-                               try {
-                                       // This should fail with an exception
-                                       // Gecko does not error, returns false instead
-                                       matches.call( document.documentElement, "[test!='']:sizzle" );
+                       attrNames = value.split( core_rspace );
 
-                               } catch( pseudoError ) {
-                                       pseudoWorks = true;
-                               }
+                       for ( ; i < attrNames.length; i++ ) {
+                               name = attrNames[ i ];
 
-                               Sizzle.matchesSelector = function( node, expr ) {
-                                       // Make sure that attribute selectors are quoted
-                                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+                                       isBool = rboolean.test( name );
 
-                                       if ( !Sizzle.isXML( node ) ) {
-                                               try {
-                                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
-                                                               var ret = matches.call( node, expr );
-
-                                                               // IE 9's matchesSelector returns false on disconnected nodes
-                                                               if ( ret || !disconnectedMatch ||
-                                                                       // As well, disconnected nodes are said to be in a document
-                                                                       // fragment in IE 9, so check for that
-                                                                       node.document && node.document.nodeType !== 11 ) {
-                                                                       return ret;
-                                                               }
-                                                       }
-                                               } catch(e) {}
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       // Do not do this for boolean attributes (see #10870)
+                                       if ( !isBool ) {
+                                               jQuery.attr( elem, name, "" );
                                        }
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
 
-                                       return Sizzle(expr, null, null, [node]).length > 0;
-                               };
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( isBool && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
                        }
-               })();
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-               (function(){
-                       var div = document.createElement("div");
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-                       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
 
-                       // Opera can't find a second classname (in 9.6)
-                       // Also, make sure that getElementsByClassName actually exists
-                       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-                               return;
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
                        }
 
-                       // Safari caches class attributes, doesn't catch changes (in 3.2)
-                       div.lastChild.className = "e";
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
 
-                       if ( div.getElementsByClassName("e").length === 1 ) {
-                               return;
+                       } else {
+                               return elem[ name ];
                        }
+               }
+       },
 
-                       Expr.order.splice(1, 0, "CLASS");
-                       Expr.find.CLASS = function( match, context, isXML ) {
-                               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
-                                       return context.getElementsByClassName(match[1]);
-                               }
-                       };
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
 
-                       // release memory in IE
-                       div = null;
-               })();
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
 
-               function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-                               var elem = checkSet[i];
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
 
-                               if ( elem ) {
-                                       var match = false;
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
 
-                                       elem = elem[dir];
+       fixSpecified = {
+               name: true,
+               id: true,
+               coords: true
+       };
 
-                                       while ( elem ) {
-                                               if ( elem[ expando ] === doneName ) {
-                                                       match = checkSet[elem.sizset];
-                                                       break;
-                                               }
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+                               ret.value :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.value = value + "" );
+               }
+       };
 
-                                               if ( elem.nodeType === 1 && !isXML ){
-                                                       elem[ expando ] = doneName;
-                                                       elem.sizset = i;
-                                               }
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
 
-                                               if ( elem.nodeName.toLowerCase() === cur ) {
-                                                       match = elem;
-                                                       break;
-                                               }
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
 
-                                               elem = elem[dir];
-                                       }
 
-                                       checkSet[i] = match;
-                               }
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
                        }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = "" + value );
                }
+       };
+}
 
-               function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-                               var elem = checkSet[i];
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
 
-                               if ( elem ) {
-                                       var match = false;
+                       if ( parent ) {
+                               parent.selectedIndex;
 
-                                       elem = elem[dir];
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
 
-                                       while ( elem ) {
-                                               if ( elem[ expando ] === doneName ) {
-                                                       match = checkSet[elem.sizset];
-                                                       break;
-                                               }
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
 
-                                               if ( elem.nodeType === 1 ) {
-                                                       if ( !isXML ) {
-                                                               elem[ expando ] = doneName;
-                                                               elem.sizset = i;
-                                                       }
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
 
-                                                       if ( typeof cur !== "string" ) {
-                                                               if ( elem === cur ) {
-                                                                       match = true;
-                                                                       break;
-                                                               }
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
 
-                                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
-                                                               match = elem;
-                                                               break;
-                                                       }
-                                               }
+       add: function( elem, types, handler, data, selector ) {
 
-                                               elem = elem[dir];
-                                       }
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, handlers, special;
 
-                                       checkSet[i] = match;
-                               }
-                       }
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
                }
 
-               if ( document.documentElement.contains ) {
-                       Sizzle.contains = function( a, b ) {
-                               return a !== b && (a.contains ? a.contains(b) : true);
-                       };
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
 
-               } else if ( document.documentElement.compareDocumentPosition ) {
-                       Sizzle.contains = function( a, b ) {
-                               return !!(a.compareDocumentPosition(b) & 16);
-                       };
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
 
-               } else {
-                       Sizzle.contains = function() {
-                               return false;
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
                        };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
                }
 
-               Sizzle.isXML = function( elem ) {
-                       // documentElement is verified for cases where it doesn't yet exist
-                       // (such as loading iframes in IE - #4833)
-                       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = jQuery.trim( hoverHack(types) ).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
 
-                       return documentElement ? documentElement.nodeName !== "HTML" : false;
-               };
-
-               var posProcess = function( selector, context, seed ) {
-                       var match,
-                               tmpSet = [],
-                               later = "",
-                               root = context.nodeType ? [context] : context;
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
 
-                       // Position selectors must be done after the filter
-                       // And so must :not(positional) so we move all PSEUDOs to the end
-                       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-                               later += match[0];
-                               selector = selector.replace( Expr.match.PSEUDO, "" );
-                       }
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
 
-                       selector = Expr.relative[selector] ? selector + "*" : selector;
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
 
-                       for ( var i = 0, l = root.length; i < l; i++ ) {
-                               Sizzle( selector, root[i], tmpSet, seed );
-                       }
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
 
-                       return Sizzle.filter( later, tmpSet );
-               };
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
 
-// EXPOSE
-// Override sizzle attribute retrieval
-               Sizzle.attr = jQuery.attr;
-               Sizzle.selectors.attrMap = {};
-               jQuery.find = Sizzle;
-               jQuery.expr = Sizzle.selectors;
-               jQuery.expr[":"] = jQuery.expr.filters;
-               jQuery.unique = Sizzle.uniqueSort;
-               jQuery.text = Sizzle.getText;
-               jQuery.isXMLDoc = Sizzle.isXML;
-               jQuery.contains = Sizzle.contains;
-
-
-       })();
-
-
-       var runtil = /Until$/,
-               rparentsprev = /^(?:parents|prevUntil|prevAll)/,
-       // Note: This RegExp should be improved, or likely pulled from Sizzle
-               rmultiselector = /,/,
-               isSimple = /^.[^:#\[\.,]*$/,
-               slice = Array.prototype.slice,
-               POS = jQuery.expr.match.globalPOS,
-       // methods guaranteed to produce a unique set when starting from a unique set
-               guaranteedUnique = {
-                       children: true,
-                       contents: true,
-                       next: true,
-                       prev: true
-               };
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
 
-       jQuery.fn.extend({
-               find: function( selector ) {
-                       var self = this,
-                               i, l;
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
 
-                       if ( typeof selector !== "string" ) {
-                               return jQuery( selector ).filter(function() {
-                                       for ( i = 0, l = self.length; i < l; i++ ) {
-                                               if ( jQuery.contains( self[ i ], this ) ) {
-                                                       return true;
-                                               }
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
                                        }
-                               });
+                               }
                        }
 
-                       var ret = this.pushStack( "", "find", selector ),
-                               length, n, r;
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               length = ret.length;
-                               jQuery.find( selector, this[i], ret );
-
-                               if ( i > 0 ) {
-                                       // Make sure that the results are unique
-                                       for ( n = length; n < ret.length; n++ ) {
-                                               for ( r = 0; r < length; r++ ) {
-                                                       if ( ret[r] === ret[n] ) {
-                                                               ret.splice(n--, 1);
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
                                }
                        }
 
-                       return ret;
-               },
-
-               has: function( target ) {
-                       var targets = jQuery( target );
-                       return this.filter(function() {
-                               for ( var i = 0, l = targets.length; i < l; i++ ) {
-                                       if ( jQuery.contains( this, targets[i] ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
-               },
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
 
-               not: function( selector ) {
-                       return this.pushStack( winnow(this, selector, false), "not", selector);
-               },
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
 
-               filter: function( selector ) {
-                       return this.pushStack( winnow(this, selector, true), "filter", selector );
-               },
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
 
-               is: function( selector ) {
-                       return !!selector && (
-                               typeof selector === "string" ?
-                                       // If this is a positional selector, check membership in the returned set
-                                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                                       POS.test( selector ) ?
-                                               jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                               jQuery.filter( selector, this ).length > 0 :
-                                       this.filter( selector ).length > 0 );
-               },
+       global: {},
 
-               closest: function( selectors, context ) {
-                       var ret = [], i, l, cur = this[0];
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
 
-                       // Array (deprecated as of jQuery 1.7)
-                       if ( jQuery.isArray( selectors ) ) {
-                               var level = 1;
+               var t, tns, type, origType, namespaces, origCount,
+                       j, events, special, eventType, handleObj,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 
-                               while ( cur && cur.ownerDocument && cur !== context ) {
-                                       for ( i = 0; i < selectors.length; i++ ) {
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
 
-                                               if ( jQuery( cur ).is( selectors[ i ] ) ) {
-                                                       ret.push({ selector: selectors[ i ], elem: cur, level: level });
-                                               }
-                                       }
+               // Once for each type.namespace in types; type may be omitted
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tns[1];
+                       namespaces = tns[2];
 
-                                       cur = cur.parentNode;
-                                       level++;
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
                                }
-
-                               return ret;
+                               continue;
                        }
 
-                       // String
-                       var pos = POS.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               cur = this[i];
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
 
-                               while ( cur ) {
-                                       if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                               ret.push( cur );
-                                               break;
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
 
-                                       } else {
-                                               cur = cur.parentNode;
-                                               if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
-                                                       break;
-                                               }
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
                                        }
                                }
                        }
 
-                       ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
 
-                       return this.pushStack( ret, "closest", selectors );
-               },
+                               delete events[ type ];
+                       }
+               }
 
-               // Determine the position of an element within
-               // the matched set of elements
-               index: function( elem ) {
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
 
-                       // No argument, return index in parent
-                       if ( !elem ) {
-                               return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-                       }
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, "events", true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
 
-                       // index in selector
-                       if ( typeof elem === "string" ) {
-                               return jQuery.inArray( this[0], jQuery( elem ) );
-                       }
+               // Event object or event type
+               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+                       type = event.type || event,
+                       namespaces = [];
 
-                       // Locate the position of the desired element
-                       return jQuery.inArray(
-                               // If it receives a jQuery object, the first element is used
-                               elem.jquery ? elem[0] : elem, this );
-               },
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
 
-               add: function( selector, context ) {
-                       var set = typeof selector === "string" ?
-                                       jQuery( selector, context ) :
-                                       jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-                               all = jQuery.merge( this.get(), set );
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
 
-                       return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                               all :
-                               jQuery.unique( all ) );
-               },
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
 
-               andSelf: function() {
-                       return this.add( this.prevObject );
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
                }
-       });
 
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-       function isDisconnected( node ) {
-               return !node || !node.parentNode || node.parentNode.nodeType === 11;
-       }
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
 
-       jQuery.each({
-               parent: function( elem ) {
-                       var parent = elem.parentNode;
-                       return parent && parent.nodeType !== 11 ? parent : null;
-               },
-               parents: function( elem ) {
-                       return jQuery.dir( elem, "parentNode" );
-               },
-               parentsUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "parentNode", until );
-               },
-               next: function( elem ) {
-                       return jQuery.nth( elem, 2, "nextSibling" );
-               },
-               prev: function( elem ) {
-                       return jQuery.nth( elem, 2, "previousSibling" );
-               },
-               nextAll: function( elem ) {
-                       return jQuery.dir( elem, "nextSibling" );
-               },
-               prevAll: function( elem ) {
-                       return jQuery.dir( elem, "previousSibling" );
-               },
-               nextUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "nextSibling", until );
-               },
-               prevUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "previousSibling", until );
-               },
-               siblings: function( elem ) {
-                       return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-               },
-               children: function( elem ) {
-                       return jQuery.sibling( elem.firstChild );
-               },
-               contents: function( elem ) {
-                       return jQuery.nodeName( elem, "iframe" ) ?
-                               elem.contentDocument || elem.contentWindow.document :
-                               jQuery.makeArray( elem.childNodes );
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
                }
-       }, function( name, fn ) {
-               jQuery.fn[ name ] = function( until, selector ) {
-                       var ret = jQuery.map( this, fn, until );
 
-                       if ( !runtil.test( name ) ) {
-                               selector = until;
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                       for ( old = elem; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
                        }
 
-                       if ( selector && typeof selector === "string" ) {
-                               ret = jQuery.filter( selector, ret );
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old === (elem.ownerDocument || document) ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
                        }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
 
-                       ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
 
-                       if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
-                               ret = ret.reverse();
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       // Note that this is a bare JS function and not a jQuery handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
                        }
+               }
+               event.type = type;
 
-                       return this.pushStack( ret, name, slice.call( arguments ).join(",") );
-               };
-       });
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
-       jQuery.extend({
-               filter: function( expr, elems, not ) {
-                       if ( not ) {
-                               expr = ":not(" + expr + ")";
-                       }
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
 
-                       return elems.length === 1 ?
-                               jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                               jQuery.find.matches(expr, elems);
-               },
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
 
-               dir: function( elem, dir, until ) {
-                       var matched = [],
-                               cur = elem[ dir ];
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
 
-                       while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                               if ( cur.nodeType === 1 ) {
-                                       matched.push( cur );
-                               }
-                               cur = cur[dir];
-                       }
-                       return matched;
-               },
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
 
-               nth: function( cur, result, dir, elem ) {
-                       result = result || 1;
-                       var num = 0;
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
 
-                       for ( ; cur; cur = cur[dir] ) {
-                               if ( cur.nodeType === 1 && ++num === result ) {
-                                       break;
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
                                }
                        }
+               }
 
-                       return cur;
-               },
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = [].slice.call( arguments ),
+                       run_all = !event.exclusive && !event.namespace,
+                       special = jQuery.event.special[ event.type ] || {},
+                       handlerQueue = [];
 
-               sibling: function( n, elem ) {
-                       var r = [];
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
 
-                       for ( ; n; n = n.nextSibling ) {
-                               if ( n.nodeType === 1 && n !== elem ) {
-                                       r.push( n );
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
+                                       selMatch = {};
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+                                               sel = handleObj.selector;
+
+                                               if ( selMatch[ sel ] === undefined ) {
+                                                       selMatch[ sel ] = jQuery( sel, this ).index( cur ) >= 0;
+                                               }
+                                               if ( selMatch[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, matches: matches });
+                                       }
                                }
                        }
+               }
 
-                       return r;
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
                }
-       });
 
-// Implement the identical functionality for filter and not
-       function winnow( elements, qualifier, keep ) {
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
 
-               // Can't pass null or undefined to indexOf in Firefox 4
-               // Set to 0 to skip string check
-               qualifier = qualifier || 0;
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
 
-               if ( jQuery.isFunction( qualifier ) ) {
-                       return jQuery.grep(elements, function( elem, i ) {
-                               var retVal = !!qualifier.call( elem, i, elem );
-                               return retVal === keep;
-                       });
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
 
-               } else if ( qualifier.nodeType ) {
-                       return jQuery.grep(elements, function( elem, i ) {
-                               return ( elem === qualifier ) === keep;
-                       });
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
 
-               } else if ( typeof qualifier === "string" ) {
-                       var filtered = jQuery.grep(elements, function( elem ) {
-                               return elem.nodeType === 1;
-                       });
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
 
-                       if ( isSimple.test( qualifier ) ) {
-                               return jQuery.filter(qualifier, filtered, !keep);
-                       } else {
-                               qualifier = jQuery.filter( qualifier, filtered );
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
                        }
                }
 
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-               });
-       }
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
 
+               return event.result;
+       },
 
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
 
+       fixHooks: {},
 
-       function createSafeFragment( document ) {
-               var list = nodeNames.split( "|" ),
-                       safeFrag = document.createDocumentFragment();
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
 
-               if ( safeFrag.createElement ) {
-                       while ( list.length ) {
-                               safeFrag.createElement(
-                                       list.pop()
-                               );
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
                        }
+
+                       return event;
                }
-               return safeFrag;
-       }
+       },
 
-       var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-                       "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-               rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
-               rleadingWhitespace = /^\s+/,
-               rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
-               rtagName = /<([\w:]+)/,
-               rtbody = /<tbody/i,
-               rhtml = /<|&#?\w+;/,
-               rnoInnerhtml = /<(?:script|style)/i,
-               rnocache = /<(?:script|object|embed|option|style)/i,
-               rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       // checked="checked" or checked
-               rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-               rscriptType = /\/(java|ecma)script/i,
-               rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
-               wrapMap = {
-                       option: [ 1, "<select multiple='multiple'>", "</select>" ],
-                       legend: [ 1, "<fieldset>", "</fieldset>" ],
-                       thead: [ 1, "<table>", "</table>" ],
-                       tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-                       td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-                       col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-                       area: [ 1, "<map>", "</map>" ],
-                       _default: [ 0, "", "" ]
-               },
-               safeFragment = createSafeFragment( document );
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
 
-       wrapMap.optgroup = wrapMap.option;
-       wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-       wrapMap.th = wrapMap.td;
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
 
-// IE can't serialize <link> and <script> tags normally
-       if ( !jQuery.support.htmlSerialize ) {
-               wrapMap._default = [ 1, "div<div>", "</div>" ];
-       }
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
 
-       jQuery.fn.extend({
-               text: function( value ) {
-                       return jQuery.access( this, function( value ) {
-                               return value === undefined ?
-                                       jQuery.text( this ) :
-                                       this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-                       }, null, value, arguments.length );
-               },
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
 
-               wrapAll: function( html ) {
-                       if ( jQuery.isFunction( html ) ) {
-                               return this.each(function(i) {
-                                       jQuery(this).wrapAll( html.call(this, i) );
-                               });
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
                        }
 
-                       if ( this[0] ) {
-                               // The elements to wrap the target around
-                               var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+                       return event;
+               }
+       },
 
-                               if ( this[0].parentNode ) {
-                                       wrap.insertBefore( this[0] );
-                               }
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
 
-                               wrap.map(function() {
-                                       var elem = this;
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
 
-                                       while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                               elem = elem.firstChild;
-                                       }
+               event = jQuery.Event( originalEvent );
 
-                                       return elem;
-                               }).append( this );
-                       }
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
 
-                       return this;
-               },
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
 
-               wrapInner: function( html ) {
-                       if ( jQuery.isFunction( html ) ) {
-                               return this.each(function(i) {
-                                       jQuery(this).wrapInner( html.call(this, i) );
-                               });
-                       }
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
 
-                       return this.each(function() {
-                               var self = jQuery( this ),
-                                       contents = self.contents();
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+               event.metaKey = !!event.metaKey;
 
-                               if ( contents.length ) {
-                                       contents.wrapAll( html );
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
 
-                               } else {
-                                       self.append( html );
-                               }
-                       });
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
                },
 
-               wrap: function( html ) {
-                       var isFunction = jQuery.isFunction( html );
-
-                       return this.each(function(i) {
-                               jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-                       });
+               focus: {
+                       delegateType: "focusin"
                },
-
-               unwrap: function() {
-                       return this.parent().each(function() {
-                               if ( !jQuery.nodeName( this, "body" ) ) {
-                                       jQuery( this ).replaceWith( this.childNodes );
-                               }
-                       }).end();
+               blur: {
+                       delegateType: "focusout"
                },
 
-               append: function() {
-                       return this.domManip(arguments, true, function( elem ) {
-                               if ( this.nodeType === 1 ) {
-                                       this.appendChild( elem );
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
                                }
-                       });
-               },
+                       },
 
-               prepend: function() {
-                       return this.domManip(arguments, true, function( elem ) {
-                               if ( this.nodeType === 1 ) {
-                                       this.insertBefore( elem, this.firstChild );
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
                                }
-                       });
-               },
-
-               before: function() {
-                       if ( this[0] && this[0].parentNode ) {
-                               return this.domManip(arguments, false, function( elem ) {
-                                       this.parentNode.insertBefore( elem, this );
-                               });
-                       } else if ( arguments.length ) {
-                               var set = jQuery.clean( arguments );
-                               set.push.apply( set, this.toArray() );
-                               return this.pushStack( set, "before", arguments );
-                       }
-               },
-
-               after: function() {
-                       if ( this[0] && this[0].parentNode ) {
-                               return this.domManip(arguments, false, function( elem ) {
-                                       this.parentNode.insertBefore( elem, this.nextSibling );
-                               });
-                       } else if ( arguments.length ) {
-                               var set = this.pushStack( this, "after", arguments );
-                               set.push.apply( set, jQuery.clean(arguments) );
-                               return set;
                        }
-               },
-
-               // keepData is for internal use only--do not document
-               remove: function( selector, keepData ) {
-                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-                               if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-                                       if ( !keepData && elem.nodeType === 1 ) {
-                                               jQuery.cleanData( elem.getElementsByTagName("*") );
-                                               jQuery.cleanData( [ elem ] );
-                                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
 
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               }
-                       }
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
 
-                       return this;
-               },
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
 
-               empty: function() {
-                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-                               // Remove element nodes and prevent memory leaks
-                               if ( elem.nodeType === 1 ) {
-                                       jQuery.cleanData( elem.getElementsByTagName("*") );
-                               }
+               if ( elem.detachEvent ) {
 
-                               // Remove any remaining nodes
-                               while ( elem.firstChild ) {
-                                       elem.removeChild( elem.firstChild );
-                               }
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === "undefined" ) {
+                               elem[ name ] = null;
                        }
 
-                       return this;
-               },
+                       elem.detachEvent( name, handle );
+               }
+       };
 
-               clone: function( dataAndEvents, deepDataAndEvents ) {
-                       dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-                       deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
 
-                       return this.map( function () {
-                               return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-                       });
-               },
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
 
-               html: function( value ) {
-                       return jQuery.access( this, function( value ) {
-                               var elem = this[0] || {},
-                                       i = 0,
-                                       l = this.length;
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
 
-                               if ( value === undefined ) {
-                                       return elem.nodeType === 1 ?
-                                               elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                               null;
-                               }
+       // Event type
+       } else {
+               this.type = src;
+       }
 
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
 
-                               if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                                       ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                                       !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
 
-                                       value = value.replace( rxhtmlTag, "<$1></$2>" );
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
 
-                                       try {
-                                               for (; i < l; i++ ) {
-                                                       // Remove element nodes and prevent memory leaks
-                                                       elem = this[i] || {};
-                                                       if ( elem.nodeType === 1 ) {
-                                                               jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-                                                               elem.innerHTML = value;
-                                                       }
-                                               }
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
 
-                                               elem = 0;
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
 
-                                               // If using innerHTML throws an exception, use the fallback method
-                                       } catch(e) {}
-                               }
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
 
-                               if ( elem ) {
-                                       this.empty().append( value );
-                               }
-                       }, null, value, arguments.length );
-               },
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
 
-               replaceWith: function( value ) {
-                       if ( this[0] && this[0].parentNode ) {
-                               // Make sure that the elements are removed from the DOM before they are inserted
-                               // this can help fix replacing a parent with child elements
-                               if ( jQuery.isFunction( value ) ) {
-                                       return this.each(function(i) {
-                                               var self = jQuery(this), old = self.html();
-                                               self.replaceWith( value.call( this, i, old ) );
-                                       });
-                               }
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
 
-                               if ( typeof value !== "string" ) {
-                                       value = jQuery( value ).detach();
-                               }
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
 
-                               return this.each(function() {
-                                       var next = this.nextSibling,
-                                               parent = this.parentNode;
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
 
-                                       jQuery( this ).remove();
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
 
-                                       if ( next ) {
-                                               jQuery(next).before( value );
-                                       } else {
-                                               jQuery(parent).append( value );
-                                       }
-                               });
-                       } else {
-                               return this.length ?
-                                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                                       this;
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
                        }
-               },
 
-               detach: function( selector ) {
-                       return this.remove( selector, true );
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "_submit_attached", true );
+                               }
+                       });
+                       // return undefined since we don't need an event listener
                },
 
-               domManip: function( args, table, callback ) {
-                       var results, first, fragment, parent,
-                               value = args[0],
-                               scripts = [];
-
-                       // We can't cloneNode fragments that contain checked, in WebKit
-                       if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
-                               return this.each(function() {
-                                       jQuery(this).domManip( args, table, callback, true );
-                               });
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
                        }
+               },
 
-                       if ( jQuery.isFunction(value) ) {
-                               return this.each(function(i) {
-                                       var self = jQuery(this);
-                                       args[0] = value.call(this, i, table ? self.html() : undefined);
-                                       self.domManip( args, table, callback );
-                               });
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
                        }
 
-                       if ( this[0] ) {
-                               parent = value && value.parentNode;
-
-                               // If we're in a fragment, just use that instead of building a new one
-                               if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
-                                       results = { fragment: parent };
-
-                               } else {
-                                       results = jQuery.buildFragment( args, this, scripts );
-                               }
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
 
-                               fragment = results.fragment;
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
 
-                               if ( fragment.childNodes.length === 1 ) {
-                                       first = fragment = fragment.firstChild;
-                               } else {
-                                       first = fragment.firstChild;
-                               }
+       jQuery.event.special.change = {
 
-                               if ( first ) {
-                                       table = table && jQuery.nodeName( first, "tr" );
-
-                                       for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
-                                               callback.call(
-                                                       table ?
-                                                               root(this[i], first) :
-                                                               this[i],
-                                                       // Make sure that we do not leak memory by inadvertently discarding
-                                                       // the original fragment (which might have attached data) instead of
-                                                       // using it; in addition, use the original fragment object for the last
-                                                       // item instead of first because it can end up being emptied incorrectly
-                                                       // in certain situations (Bug #8070).
-                                                       // Fragments from the fragment cache must always be cloned and never used
-                                                       // in place.
-                                                       results.cacheable || ( l > 1 && i < lastIndex ) ?
-                                                               jQuery.clone( fragment, true, true ) :
-                                                               fragment
-                                               );
-                                       }
-                               }
+               setup: function() {
 
-                               if ( scripts.length ) {
-                                       jQuery.each( scripts, function( i, elem ) {
-                                               if ( elem.src ) {
-                                                       jQuery.ajax({
-                                                               type: "GET",
-                                                               global: false,
-                                                               url: elem.src,
-                                                               async: false,
-                                                               dataType: "script"
-                                                       });
-                                               } else {
-                                                       jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
                                                }
-
-                                               if ( elem.parentNode ) {
-                                                       elem.parentNode.removeChild( elem );
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
                                                }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
                                        });
                                }
+                               return false;
                        }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
 
-                       return this;
-               }
-       });
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "_change_attached", true );
+                               }
+                       });
+               },
 
-       function root( elem, cur ) {
-               return jQuery.nodeName(elem, "table") ?
-                       (elem.getElementsByTagName("tbody")[0] ||
-                               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-                       elem;
-       }
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
 
-       function cloneCopyEvent( src, dest ) {
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
 
-               if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-                       return;
+                       return !rformElems.test( this.nodeName );
                }
+       };
+}
 
-               var type, i, l,
-                       oldData = jQuery._data( src ),
-                       curData = jQuery._data( dest, oldData ),
-                       events = oldData.events;
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
-               if ( events ) {
-                       delete curData.handle;
-                       curData.events = {};
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
 
-                       for ( type in events ) {
-                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                                       jQuery.event.add( dest, type, events[ type ][ i ] );
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
                                }
                        }
-               }
-
-               // make the cloned public data object a copy from the original
-               if ( curData.data ) {
-                       curData.data = jQuery.extend( {}, curData.data );
-               }
-       }
-
-       function cloneFixAttributes( src, dest ) {
-               var nodeName;
-
-               // We do not need to do anything for non-Elements
-               if ( dest.nodeType !== 1 ) {
-                       return;
-               }
-
-               // clearAttributes removes the attributes, which we don't want,
-               // but also removes the attachEvent events, which we *do* want
-               if ( dest.clearAttributes ) {
-                       dest.clearAttributes();
-               }
-
-               // mergeAttributes, in contrast, only merges back on the
-               // original attributes, not the events
-               if ( dest.mergeAttributes ) {
-                       dest.mergeAttributes( src );
-               }
+               };
+       });
+}
 
-               nodeName = dest.nodeName.toLowerCase();
+jQuery.fn.extend({
 
-               // IE6-8 fail to clone children inside object elements that use
-               // the proprietary classid attribute value (rather than the type
-               // attribute) to identify the type of content to display
-               if ( nodeName === "object" ) {
-                       dest.outerHTML = src.outerHTML;
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
 
-               } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
-                       // IE6-8 fails to persist the checked state of a cloned checkbox
-                       // or radio button. Worse, IE6-7 fail to give the cloned element
-                       // a checked appearance if the defaultChecked value isn't also set
-                       if ( src.checked ) {
-                               dest.defaultChecked = dest.checked = src.checked;
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) { // && selector != null
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
                        }
-
-                       // IE6-7 get confused and end up setting the value of a cloned
-                       // checkbox/radio button to an empty string instead of "on"
-                       if ( dest.value !== src.value ) {
-                               dest.value = src.value;
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
                        }
-
-                       // IE6-8 fails to return the selected option to the default selected
-                       // state when cloning options
-               } else if ( nodeName === "option" ) {
-                       dest.selected = src.defaultSelected;
-
-                       // IE6-8 fails to set the defaultValue to the correct value when
-                       // cloning other types of input fields
-               } else if ( nodeName === "input" || nodeName === "textarea" ) {
-                       dest.defaultValue = src.defaultValue;
-
-                       // IE blanks contents when cloning scripts
-               } else if ( nodeName === "script" && dest.text !== src.text ) {
-                       dest.text = src.text;
+                       return this;
                }
 
-               // Event data gets referenced instead of copied if the expando
-               // gets copied too
-               dest.removeAttribute( jQuery.expando );
-
-               // Clear flags for bubbling special change/submit events, they must
-               // be reattached when the newly cloned events are first activated
-               dest.removeAttribute( "_submit_attached" );
-               dest.removeAttribute( "_change_attached" );
-       }
-
-       jQuery.buildFragment = function( args, nodes, scripts ) {
-               var fragment, cacheable, cacheresults, doc,
-                       first = args[ 0 ];
-
-               // nodes may contain either an explicit document object,
-               // a jQuery collection or context object.
-               // If nodes[0] contains a valid object to assign to doc
-               if ( nodes && nodes[0] ) {
-                       doc = nodes[0].ownerDocument || nodes[0];
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
                }
-
-               // Ensure that an attr object doesn't incorrectly stand in as a document object
-               // Chrome and Firefox seem to allow this to occur and will throw exception
-               // Fixes #8950
-               if ( !doc.createDocumentFragment ) {
-                       doc = document;
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
                }
 
-               // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-               // Cloning options loses the selected state, so don't cache them
-               // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-               // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-               // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-               if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
-                       first.charAt(0) === "<" && !rnocache.test( first ) &&
-                       (jQuery.support.checkClone || !rchecked.test( first )) &&
-                       (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-                       cacheable = true;
-
-                       cacheresults = jQuery.fragments[ first ];
-                       if ( cacheresults && cacheresults !== 1 ) {
-                               fragment = cacheresults;
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
                        }
+                       return this;
                }
-
-               if ( !fragment ) {
-                       fragment = doc.createDocumentFragment();
-                       jQuery.clean( args, doc, fragment, scripts );
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
                }
-
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+               if ( fn === false ) {
+                       fn = returnFalse;
                }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
 
-               return { fragment: fragment, cacheable: cacheable };
-       };
-
-       jQuery.fragments = {};
-
-       jQuery.each({
-               appendTo: "append",
-               prependTo: "prepend",
-               insertBefore: "before",
-               insertAfter: "after",
-               replaceAll: "replaceWith"
-       }, function( name, original ) {
-               jQuery.fn[ name ] = function( selector ) {
-                       var ret = [],
-                               insert = jQuery( selector ),
-                               parent = this.length === 1 && this[0].parentNode;
-
-                       if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
-                               insert[ original ]( this[0] );
-                               return this;
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
 
-                       } else {
-                               for ( var i = 0, l = insert.length; i < l; i++ ) {
-                                       var elems = ( i > 0 ? this.clone(true) : this ).get();
-                                       jQuery( insert[i] )[ original ]( elems );
-                                       ret = ret.concat( elems );
-                               }
+                               // Make sure that clicks stop
+                               event.preventDefault();
 
-                               return this.pushStack( ret, name, insert.selector );
-                       }
-               };
-       });
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
 
-       function getAll( elem ) {
-               if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                       return elem.getElementsByTagName( "*" );
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
 
-               } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-                       return elem.querySelectorAll( "*" );
+               return this.click( toggler );
+       },
 
-               } else {
-                       return [];
-               }
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        }
+});
 
-// Used in clean, fixes the defaultChecked property
-       function fixDefaultChecked( elem ) {
-               if ( elem.type === "checkbox" || elem.type === "radio" ) {
-                       elem.defaultChecked = elem.checked;
-               }
-       }
-// Finds all inputs and passes them to fixDefaultChecked
-       function findInputs( elem ) {
-               var nodeName = ( elem.nodeName || "" ).toLowerCase();
-               if ( nodeName === "input" ) {
-                       fixDefaultChecked( elem );
-                       // Skip scripts, get other children
-               } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
-                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
                }
-       }
 
-// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
-       function shimCloneNode( elem ) {
-               var div = document.createElement( "div" );
-               safeFragment.appendChild( div );
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
 
-               div.innerHTML = elem.outerHTML;
-               return div.firstChild;
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
        }
 
-       jQuery.extend({
-               clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-                       var srcElements,
-                               destElements,
-                               i,
-                       // IE<=8 does not properly clone detached, unknown element nodes
-                               clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
-                                       elem.cloneNode( true ) :
-                                       shimCloneNode( elem );
-
-                       if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-                               // IE copies events bound via attachEvent when using cloneNode.
-                               // Calling detachEvent on the clone will also remove the events
-                               // from the original. In order to get around this, we use some
-                               // proprietary methods to clear the events. Thanks to MooTools
-                               // guys for this hotness.
-
-                               cloneFixAttributes( elem, clone );
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+/*!\r
+ * Sizzle CSS Selector Engine\r
+ *  Copyright 2012 jQuery Foundation and other contributors\r
+ *  Released under the MIT license\r
+ *  http://sizzlejs.com/\r
+ */\r
+(function( window, undefined ) {\r
+\r
+var dirruns,\r
+       cachedruns,\r
+       assertGetIdNotName,\r
+       Expr,\r
+       getText,\r
+       isXML,\r
+       contains,\r
+       compile,\r
+       sortOrder,\r
+       hasDuplicate,\r
+\r
+       baseHasDuplicate = true,\r
+       strundefined = "undefined",\r
+\r
+       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
+\r
+       document = window.document,\r
+       docElem = document.documentElement,\r
+       done = 0,\r
+       slice = [].slice,\r
+       push = [].push,\r
+\r
+       // Augment a function for special use by Sizzle\r
+       markFunction = function( fn, value ) {\r
+               fn[ expando ] = value || true;\r
+               return fn;\r
+       },\r
+\r
+       createCache = function() {\r
+               var cache = {},\r
+                       keys = [];\r
+\r
+               return markFunction(function( key, value ) {\r
+                       // Only keep the most recent entries\r
+                       if ( keys.push( key ) > Expr.cacheLength ) {\r
+                               delete cache[ keys.shift() ];\r
+                       }\r
+\r
+                       return (cache[ key ] = value);\r
+               }, cache );\r
+       },\r
+\r
+       classCache = createCache(),\r
+       tokenCache = createCache(),\r
+       compilerCache = createCache(),\r
+\r
+       // Regex\r
+\r
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
+       whitespace = "[\\x20\\t\\r\\n\\f]",\r
+       // http://www.w3.org/TR/css3-syntax/#characters\r
+       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
+\r
+       // Loosely modeled on CSS identifier characters\r
+       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
+       identifier = characterEncoding.replace( "w", "w#" ),\r
+\r
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
+       operators = "([*^$|!~]?=)",\r
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
+               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
+\r
+       // Prefer arguments not in parens/brackets,\r
+       //   then attribute selectors and non-pseudos (denoted by :),\r
+       //   then anything else\r
+       // These preferences are here to reduce the number of selectors\r
+       //   needing tokenize in the PSEUDO preFilter\r
+       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
+\r
+       // For matchExpr.POS and matchExpr.needsContext\r
+       pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",\r
+\r
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
+\r
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
+       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
+       rpseudo = new RegExp( pseudos ),\r
+\r
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
+       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
+\r
+       rnot = /^:not/,\r
+       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
+       rendsWithNot = /:not\($/,\r
+\r
+       rheader = /h\d/i,\r
+       rinputs = /input|select|textarea|button/i,\r
+\r
+       rbackslash = /\\(?!\\)/g,\r
+\r
+       matchExpr = {\r
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
+               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
+               "ATTR": new RegExp( "^" + attributes ),\r
+               "PSEUDO": new RegExp( "^" + pseudos ),\r
+               "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +\r
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
+               "POS": new RegExp( pos, "ig" ),\r
+               // For use in libraries implementing .is()\r
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
+       },\r
+\r
+       // Support\r
+\r
+       // Used for testing something on an element\r
+       assert = function( fn ) {\r
+               var div = document.createElement("div");\r
+\r
+               try {\r
+                       return fn( div );\r
+               } catch (e) {\r
+                       return false;\r
+               } finally {\r
+                       // release memory in IE\r
+                       div = null;\r
+               }\r
+       },\r
+\r
+       // Check if getElementsByTagName("*") returns only elements\r
+       assertTagNameNoComments = assert(function( div ) {\r
+               div.appendChild( document.createComment("") );\r
+               return !div.getElementsByTagName("*").length;\r
+       }),\r
+\r
+       // Check if getAttribute returns normalized href attributes\r
+       assertHrefNotNormalized = assert(function( div ) {\r
+               div.innerHTML = "<a href='#'></a>";\r
+               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
+                       div.firstChild.getAttribute("href") === "#";\r
+       }),\r
+\r
+       // Check if attributes should be retrieved by attribute nodes\r
+       assertAttributes = assert(function( div ) {\r
+               div.innerHTML = "<select></select>";\r
+               var type = typeof div.lastChild.getAttribute("multiple");\r
+               // IE8 returns a string for some attributes even when not present\r
+               return type !== "boolean" && type !== "string";\r
+       }),\r
+\r
+       // Check if getElementsByClassName can be trusted\r
+       assertUsableClassName = assert(function( div ) {\r
+               // Opera can't find a second classname (in 9.6)\r
+               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
+               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
+                       return false;\r
+               }\r
+\r
+               // Safari 3.2 caches class attributes and doesn't catch changes\r
+               div.lastChild.className = "e";\r
+               return div.getElementsByClassName("e").length === 2;\r
+       }),\r
+\r
+       // Check if getElementById returns elements by name\r
+       // Check if getElementsByName privileges form controls or returns elements by ID\r
+       assertUsableName = assert(function( div ) {\r
+               // Inject content\r
+               div.id = expando + 0;\r
+               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
+               docElem.insertBefore( div, docElem.firstChild );\r
+\r
+               // Test\r
+               var pass = document.getElementsByName &&\r
+                       // buggy browsers will return fewer than the correct 2\r
+                       document.getElementsByName( expando ).length === 2 +\r
+                       // buggy browsers will return more than the correct 0\r
+                       document.getElementsByName( expando + 0 ).length;\r
+               assertGetIdNotName = !document.getElementById( expando );\r
+\r
+               // Cleanup\r
+               docElem.removeChild( div );\r
+\r
+               return pass;\r
+       });\r
+\r
+// If slice is not available, provide a backup\r
+try {\r
+       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
+} catch ( e ) {\r
+       slice = function( i ) {\r
+               var elem, results = [];\r
+               for ( ; (elem = this[i]); i++ ) {\r
+                       results.push( elem );\r
+               }\r
+               return results;\r
+       };\r
+}\r
+\r
+function Sizzle( selector, context, results, seed ) {\r
+       results = results || [];\r
+       context = context || document;\r
+       var match, elem, xml, m,\r
+               nodeType = context.nodeType;\r
+\r
+       if ( nodeType !== 1 && nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+\r
+       if ( !selector || typeof selector !== "string" ) {\r
+               return results;\r
+       }\r
+\r
+       xml = isXML( context );\r
+\r
+       if ( !xml && !seed ) {\r
+               if ( (match = rquickExpr.exec( selector )) ) {\r
+                       // Speed-up: Sizzle("#ID")\r
+                       if ( (m = match[1]) ) {\r
+                               if ( nodeType === 9 ) {\r
+                                       elem = context.getElementById( m );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       if ( elem && elem.parentNode ) {\r
+                                               // Handle the case where IE, Opera, and Webkit return items\r
+                                               // by name instead of ID\r
+                                               if ( elem.id === m ) {\r
+                                                       results.push( elem );\r
+                                                       return results;\r
+                                               }\r
+                                       } else {\r
+                                               return results;\r
+                                       }\r
+                               } else {\r
+                                       // Context is not a document\r
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
+                                               contains( context, elem ) && elem.id === m ) {\r
+                                               results.push( elem );\r
+                                               return results;\r
+                                       }\r
+                               }\r
+\r
+                       // Speed-up: Sizzle("TAG")\r
+                       } else if ( match[2] ) {\r
+                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
+                               return results;\r
+\r
+                       // Speed-up: Sizzle(".CLASS")\r
+                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
+                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
+                               return results;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // All others\r
+       return select( selector, context, results, seed, xml );\r
+}\r
+\r
+Sizzle.matches = function( expr, elements ) {\r
+       return Sizzle( expr, null, null, elements );\r
+};\r
+\r
+Sizzle.matchesSelector = function( elem, expr ) {\r
+       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+};\r
+\r
+// Returns a function to use in pseudos for input types\r
+function createInputPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return name === "input" && elem.type === type;\r
+       };\r
+}\r
+\r
+// Returns a function to use in pseudos for buttons\r
+function createButtonPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return (name === "input" || name === "button") && elem.type === type;\r
+       };\r
+}\r
+\r
+/**\r
+ * Utility function for retrieving the text value of an array of DOM nodes\r
+ * @param {Array|Element} elem\r
+ */\r
+getText = Sizzle.getText = function( elem ) {\r
+       var node,\r
+               ret = "",\r
+               i = 0,\r
+               nodeType = elem.nodeType;\r
+\r
+       if ( nodeType ) {\r
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
+                       // Use textContent for elements\r
+                       // innerText usage removed for consistency of new lines (see #11153)\r
+                       if ( typeof elem.textContent === "string" ) {\r
+                               return elem.textContent;\r
+                       } else {\r
+                               // Traverse its children\r
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
+                                       ret += getText( elem );\r
+                               }\r
+                       }\r
+               } else if ( nodeType === 3 || nodeType === 4 ) {\r
+                       return elem.nodeValue;\r
+               }\r
+               // Do not include comment or processing instruction nodes\r
+       } else {\r
+\r
+               // If no nodeType, this is expected to be an array\r
+               for ( ; (node = elem[i]); i++ ) {\r
+                       // Do not traverse comment nodes\r
+                       ret += getText( node );\r
+               }\r
+       }\r
+       return ret;\r
+};\r
+\r
+isXML = Sizzle.isXML = function isXML( elem ) {\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833)\r
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
+};\r
+\r
+// Element contains another\r
+contains = Sizzle.contains = docElem.contains ?\r
+       function( a, b ) {\r
+               var adown = a.nodeType === 9 ? a.documentElement : a,\r
+                       bup = b && b.parentNode;\r
+               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
+       } :\r
+       docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
+       } :\r
+       function( a, b ) {\r
+               while ( (b = b.parentNode) ) {\r
+                       if ( b === a ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+\r
+Sizzle.attr = function( elem, name ) {\r
+       var attr,\r
+               xml = isXML( elem );\r
+\r
+       if ( !xml ) {\r
+               name = name.toLowerCase();\r
+       }\r
+       if ( Expr.attrHandle[ name ] ) {\r
+               return Expr.attrHandle[ name ]( elem );\r
+       }\r
+       if ( assertAttributes || xml ) {\r
+               return elem.getAttribute( name );\r
+       }\r
+       attr = elem.getAttributeNode( name );\r
+       return attr ?\r
+               typeof elem[ name ] === "boolean" ?\r
+                       elem[ name ] ? name : null :\r
+                       attr.specified ? attr.value : null :\r
+               null;\r
+};\r
+\r
+Expr = Sizzle.selectors = {\r
+\r
+       // Can be adjusted by the user\r
+       cacheLength: 50,\r
+\r
+       createPseudo: markFunction,\r
+\r
+       match: matchExpr,\r
+\r
+       order: new RegExp( "ID|TAG" +\r
+               (assertUsableName ? "|NAME" : "") +\r
+               (assertUsableClassName ? "|CLASS" : "")\r
+       ),\r
+\r
+       // IE6/7 return a modified href\r
+       attrHandle: assertHrefNotNormalized ?\r
+               {} :\r
+               {\r
+                       "href": function( elem ) {\r
+                               return elem.getAttribute( "href", 2 );\r
+                       },\r
+                       "type": function( elem ) {\r
+                               return elem.getAttribute("type");\r
+                       }\r
+               },\r
+\r
+       find: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       return m && m.parentNode ? [m] : [];\r
+                               }\r
+                       } :\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+\r
+                                       return m ?\r
+                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
+                                                       [m] :\r
+                                                       undefined :\r
+                                               [];\r
+                               }\r
+                       },\r
+\r
+               "TAG": assertTagNameNoComments ?\r
+                       function( tag, context ) {\r
+                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
+                                       return context.getElementsByTagName( tag );\r
+                               }\r
+                       } :\r
+                       function( tag, context ) {\r
+                               var results = context.getElementsByTagName( tag );\r
+\r
+                               // Filter out possible comments\r
+                               if ( tag === "*" ) {\r
+                                       var elem,\r
+                                               tmp = [],\r
+                                               i = 0;\r
+\r
+                                       for ( ; (elem = results[i]); i++ ) {\r
+                                               if ( elem.nodeType === 1 ) {\r
+                                                       tmp.push( elem );\r
+                                               }\r
+                                       }\r
+\r
+                                       return tmp;\r
+                               }\r
+                               return results;\r
+                       },\r
+\r
+               "NAME": function( tag, context ) {\r
+                       if ( typeof context.getElementsByName !== strundefined ) {\r
+                               return context.getElementsByName( name );\r
+                       }\r
+               },\r
+\r
+               "CLASS": function( className, context, xml ) {\r
+                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
+                               return context.getElementsByClassName( className );\r
+                       }\r
+               }\r
+       },\r
+\r
+       relative: {\r
+               ">": { dir: "parentNode", first: true },\r
+               " ": { dir: "parentNode" },\r
+               "+": { dir: "previousSibling", first: true },\r
+               "~": { dir: "previousSibling" }\r
+       },\r
+\r
+       preFilter: {\r
+               "ATTR": function( match ) {\r
+                       match[1] = match[1].replace( rbackslash, "" );\r
+\r
+                       // Move the given value to match[3] whether quoted or unquoted\r
+                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
+\r
+                       if ( match[2] === "~=" ) {\r
+                               match[3] = " " + match[3] + " ";\r
+                       }\r
+\r
+                       return match.slice( 0, 4 );\r
+               },\r
+\r
+               "CHILD": function( match ) {\r
+                       /* matches from matchExpr.CHILD\r
+                               1 type (only|nth|...)\r
+                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
+                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
+                               4 sign of xn-component\r
+                               5 x of xn-component\r
+                               6 sign of y-component\r
+                               7 y of y-component\r
+                       */\r
+                       match[1] = match[1].toLowerCase();\r
+\r
+                       if ( match[1] === "nth" ) {\r
+                               // nth-child requires argument\r
+                               if ( !match[2] ) {\r
+                                       Sizzle.error( match[0] );\r
+                               }\r
+\r
+                               // numeric x and y parameters for Expr.filter.CHILD\r
+                               // remember that false/true cast respectively to 0/1\r
+                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
+                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
+\r
+                       // other types prohibit arguments\r
+                       } else if ( match[2] ) {\r
+                               Sizzle.error( match[0] );\r
+                       }\r
+\r
+                       return match;\r
+               },\r
+\r
+               "PSEUDO": function( match, context, xml ) {\r
+                       var unquoted, excess;\r
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
+                               return null;\r
+                       }\r
+\r
+                       if ( match[3] ) {\r
+                               match[2] = match[3];\r
+                       } else if ( (unquoted = match[4]) ) {\r
+                               // Only check arguments that contain a pseudo\r
+                               if ( rpseudo.test(unquoted) &&\r
+                                       // Get excess from tokenize (recursively)\r
+                                       (excess = tokenize( unquoted, context, xml, true )) &&\r
+                                       // advance to the next closing parenthesis\r
+                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
+\r
+                                       // excess is a negative index\r
+                                       unquoted = unquoted.slice( 0, excess );\r
+                                       match[0] = match[0].slice( 0, excess );\r
+                               }\r
+                               match[2] = unquoted;\r
+                       }\r
+\r
+                       // Return only captures needed by the pseudo filter method (type and argument)\r
+                       return match.slice( 0, 3 );\r
+               }\r
+       },\r
+\r
+       filter: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       return elem.getAttribute("id") === id;\r
+                               };\r
+                       } :\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
+                                       return node && node.value === id;\r
+                               };\r
+                       },\r
+\r
+               "TAG": function( nodeName ) {\r
+                       if ( nodeName === "*" ) {\r
+                               return function() { return true; };\r
+                       }\r
+                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
+\r
+                       return function( elem ) {\r
+                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
+                       };\r
+               },\r
+\r
+               "CLASS": function( className ) {\r
+                       var pattern = classCache[ expando ][ className ];\r
+                       if ( !pattern ) {\r
+                               pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );\r
+                       }\r
+                       return function( elem ) {\r
+                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
+                       };\r
+               },\r
+\r
+               "ATTR": function( name, operator, check ) {\r
+                       if ( !operator ) {\r
+                               return function( elem ) {\r
+                                       return Sizzle.attr( elem, name ) != null;\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var result = Sizzle.attr( elem, name ),\r
+                                       value = result + "";\r
+\r
+                               if ( result == null ) {\r
+                                       return operator === "!=";\r
+                               }\r
+\r
+                               switch ( operator ) {\r
+                                       case "=":\r
+                                               return value === check;\r
+                                       case "!=":\r
+                                               return value !== check;\r
+                                       case "^=":\r
+                                               return check && value.indexOf( check ) === 0;\r
+                                       case "*=":\r
+                                               return check && value.indexOf( check ) > -1;\r
+                                       case "$=":\r
+                                               return check && value.substr( value.length - check.length ) === check;\r
+                                       case "~=":\r
+                                               return ( " " + value + " " ).indexOf( check ) > -1;\r
+                                       case "|=":\r
+                                               return value === check || value.substr( 0, check.length + 1 ) === check + "-";\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "CHILD": function( type, argument, first, last ) {\r
+\r
+                       if ( type === "nth" ) {\r
+                               var doneName = done++;\r
+\r
+                               return function( elem ) {\r
+                                       var parent, diff,\r
+                                               count = 0,\r
+                                               node = elem;\r
+\r
+                                       if ( first === 1 && last === 0 ) {\r
+                                               return true;\r
+                                       }\r
+\r
+                                       parent = elem.parentNode;\r
+\r
+                                       if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\r
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               node.sizset = ++count;\r
+                                                               if ( node === elem ) {\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               parent[ expando ] = doneName;\r
+                                       }\r
+\r
+                                       diff = elem.sizset - last;\r
+\r
+                                       if ( first === 0 ) {\r
+                                               return diff === 0;\r
+\r
+                                       } else {\r
+                                               return ( diff % first === 0 && diff / first >= 0 );\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var node = elem;\r
+\r
+                               switch ( type ) {\r
+                                       case "only":\r
+                                       case "first":\r
+                                               while ( (node = node.previousSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if ( type === "first" ) {\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               node = elem;\r
+\r
+                                               /* falls through */\r
+                                       case "last":\r
+                                               while ( (node = node.nextSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return true;\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "PSEUDO": function( pseudo, argument, context, xml ) {\r
+                       // pseudo-class names are case-insensitive\r
+                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
+                       var args,\r
+                               fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\r
+\r
+                       if ( !fn ) {\r
+                               Sizzle.error( "unsupported pseudo: " + pseudo );\r
+                       }\r
+\r
+                       // The user may use createPseudo to indicate that\r
+                       // arguments are needed to create the filter function\r
+                       // just as Sizzle does\r
+                       if ( !fn[ expando ] ) {\r
+                               if ( fn.length > 1 ) {\r
+                                       args = [ pseudo, pseudo, "", argument ];\r
+                                       return function( elem ) {\r
+                                               return fn( elem, 0, args );\r
+                                       };\r
+                               }\r
+                               return fn;\r
+                       }\r
+\r
+                       return fn( argument, context, xml );\r
+               }\r
+       },\r
+\r
+       pseudos: {\r
+               "not": markFunction(function( selector, context, xml ) {\r
+                       // Trim the selector passed to compile\r
+                       // to avoid treating leading and trailing\r
+                       // spaces as combinators\r
+                       var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );\r
+                       return function( elem ) {\r
+                               return !matcher( elem );\r
+                       };\r
+               }),\r
+\r
+               "enabled": function( elem ) {\r
+                       return elem.disabled === false;\r
+               },\r
+\r
+               "disabled": function( elem ) {\r
+                       return elem.disabled === true;\r
+               },\r
+\r
+               "checked": function( elem ) {\r
+                       // In CSS3, :checked should return both checked and selected elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       var nodeName = elem.nodeName.toLowerCase();\r
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
+               },\r
+\r
+               "selected": function( elem ) {\r
+                       // Accessing this property makes selected-by-default\r
+                       // options in Safari work properly\r
+                       if ( elem.parentNode ) {\r
+                               elem.parentNode.selectedIndex;\r
+                       }\r
+\r
+                       return elem.selected === true;\r
+               },\r
+\r
+               "parent": function( elem ) {\r
+                       return !Expr.pseudos["empty"]( elem );\r
+               },\r
+\r
+               "empty": function( elem ) {\r
+                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
+                       //   not comment, processing instructions, or others\r
+                       // Thanks to Diego Perini for the nodeName shortcut\r
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
+                       var nodeType;\r
+                       elem = elem.firstChild;\r
+                       while ( elem ) {\r
+                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
+                                       return false;\r
+                               }\r
+                               elem = elem.nextSibling;\r
+                       }\r
+                       return true;\r
+               },\r
+\r
+               "contains": markFunction(function( text ) {\r
+                       return function( elem ) {\r
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
+                       };\r
+               }),\r
+\r
+               "has": markFunction(function( selector ) {\r
+                       return function( elem ) {\r
+                               return Sizzle( selector, elem ).length > 0;\r
+                       };\r
+               }),\r
+\r
+               "header": function( elem ) {\r
+                       return rheader.test( elem.nodeName );\r
+               },\r
+\r
+               "text": function( elem ) {\r
+                       var type, attr;\r
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
+                       // use getAttribute instead to test this case\r
+                       return elem.nodeName.toLowerCase() === "input" &&\r
+                               (type = elem.type) === "text" &&\r
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
+               },\r
+\r
+               // Input types\r
+               "radio": createInputPseudo("radio"),\r
+               "checkbox": createInputPseudo("checkbox"),\r
+               "file": createInputPseudo("file"),\r
+               "password": createInputPseudo("password"),\r
+               "image": createInputPseudo("image"),\r
+\r
+               "submit": createButtonPseudo("submit"),\r
+               "reset": createButtonPseudo("reset"),\r
+\r
+               "button": function( elem ) {\r
+                       var name = elem.nodeName.toLowerCase();\r
+                       return name === "input" && elem.type === "button" || name === "button";\r
+               },\r
+\r
+               "input": function( elem ) {\r
+                       return rinputs.test( elem.nodeName );\r
+               },\r
+\r
+               "focus": function( elem ) {\r
+                       var doc = elem.ownerDocument;\r
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\r
+               },\r
+\r
+               "active": function( elem ) {\r
+                       return elem === elem.ownerDocument.activeElement;\r
+               }\r
+       },\r
+\r
+       setFilters: {\r
+               "first": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 1 ) : [ elements[0] ];\r
+               },\r
+\r
+               "last": function( elements, argument, not ) {\r
+                       var elem = elements.pop();\r
+                       return not ? elements : [ elem ];\r
+               },\r
+\r
+               "even": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 1 : 0,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "odd": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 0 : 1,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "lt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( +argument ) : elements.slice( 0, +argument );\r
+               },\r
+\r
+               "gt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\r
+               },\r
+\r
+               "eq": function( elements, argument, not ) {\r
+                       var elem = elements.splice( +argument, 1 );\r
+                       return not ? elements : elem;\r
+               }\r
+       }\r
+};\r
+\r
+function siblingCheck( a, b, ret ) {\r
+       if ( a === b ) {\r
+               return ret;\r
+       }\r
+\r
+       var cur = a.nextSibling;\r
+\r
+       while ( cur ) {\r
+               if ( cur === b ) {\r
+                       return -1;\r
+               }\r
+\r
+               cur = cur.nextSibling;\r
+       }\r
+\r
+       return 1;\r
+}\r
+\r
+sortOrder = docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+               }\r
+\r
+               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
+                       a.compareDocumentPosition :\r
+                       a.compareDocumentPosition(b) & 4\r
+               ) ? -1 : 1;\r
+       } :\r
+       function( a, b ) {\r
+               // The nodes are identical, we can exit early\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+\r
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
+               } else if ( a.sourceIndex && b.sourceIndex ) {\r
+                       return a.sourceIndex - b.sourceIndex;\r
+               }\r
+\r
+               var al, bl,\r
+                       ap = [],\r
+                       bp = [],\r
+                       aup = a.parentNode,\r
+                       bup = b.parentNode,\r
+                       cur = aup;\r
+\r
+               // If the nodes are siblings (or identical) we can do a quick check\r
+               if ( aup === bup ) {\r
+                       return siblingCheck( a, b );\r
+\r
+               // If no parents were found then the nodes are disconnected\r
+               } else if ( !aup ) {\r
+                       return -1;\r
+\r
+               } else if ( !bup ) {\r
+                       return 1;\r
+               }\r
+\r
+               // Otherwise they're somewhere else in the tree so we need\r
+               // to build up a full list of the parentNodes for comparison\r
+               while ( cur ) {\r
+                       ap.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               cur = bup;\r
+\r
+               while ( cur ) {\r
+                       bp.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               al = ap.length;\r
+               bl = bp.length;\r
+\r
+               // Start walking down the tree looking for a discrepancy\r
+               for ( var i = 0; i < al && i < bl; i++ ) {\r
+                       if ( ap[i] !== bp[i] ) {\r
+                               return siblingCheck( ap[i], bp[i] );\r
+                       }\r
+               }\r
+\r
+               // We ended someplace up the tree so do a sibling check\r
+               return i === al ?\r
+                       siblingCheck( a, bp[i], -1 ) :\r
+                       siblingCheck( ap[i], b, 1 );\r
+       };\r
+\r
+// Always assume the presence of duplicates if sort doesn't\r
+// pass them to our comparison function (as in Google Chrome).\r
+[0, 0].sort( sortOrder );\r
+baseHasDuplicate = !hasDuplicate;\r
+\r
+// Document sorting and removing duplicates\r
+Sizzle.uniqueSort = function( results ) {\r
+       var elem,\r
+               i = 1;\r
+\r
+       hasDuplicate = baseHasDuplicate;\r
+       results.sort( sortOrder );\r
+\r
+       if ( hasDuplicate ) {\r
+               for ( ; (elem = results[i]); i++ ) {\r
+                       if ( elem === results[ i - 1 ] ) {\r
+                               results.splice( i--, 1 );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+Sizzle.error = function( msg ) {\r
+       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
+};\r
+\r
+function tokenize( selector, context, xml, parseOnly ) {\r
+       var matched, match, tokens, type,\r
+               soFar, groups, group, i,\r
+               preFilters, filters,\r
+               checkContext = !xml && context !== document,\r
+               // Token cache should maintain spaces\r
+               key = ( checkContext ? "<s>" : "" ) + selector.replace( rtrim, "$1<s>" ),\r
+               cached = tokenCache[ expando ][ key ];\r
+\r
+       if ( cached ) {\r
+               return parseOnly ? 0 : slice.call( cached, 0 );\r
+       }\r
+\r
+       soFar = selector;\r
+       groups = [];\r
+       i = 0;\r
+       preFilters = Expr.preFilter;\r
+       filters = Expr.filter;\r
+\r
+       while ( soFar ) {\r
+\r
+               // Comma and first run\r
+               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
+                       if ( match ) {\r
+                               soFar = soFar.slice( match[0].length );\r
+                               tokens.selector = group;\r
+                       }\r
+                       groups.push( tokens = [] );\r
+                       group = "";\r
+\r
+                       // Need to make sure we're within a narrower context if necessary\r
+                       // Adding a descendant combinator will generate what is needed\r
+                       if ( checkContext ) {\r
+                               soFar = " " + soFar;\r
+                       }\r
+               }\r
+\r
+               matched = false;\r
+\r
+               // Combinators\r
+               if ( (match = rcombinators.exec( soFar )) ) {\r
+                       group += match[0];\r
+                       soFar = soFar.slice( match[0].length );\r
+\r
+                       // Cast descendant combinators to space\r
+                       matched = tokens.push({\r
+                               part: match.pop().replace( rtrim, " " ),\r
+                               string: match[0],\r
+                               captures: match\r
+                       });\r
+               }\r
+\r
+               // Filters\r
+               for ( type in filters ) {\r
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
+                               ( match = preFilters[ type ](match, context, xml) )) ) {\r
+\r
+                               group += match[0];\r
+                               soFar = soFar.slice( match[0].length );\r
+                               matched = tokens.push({\r
+                                       part: type,\r
+                                       string: match.shift(),\r
+                                       captures: match\r
+                               });\r
+                       }\r
+               }\r
+\r
+               if ( !matched ) {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       // Attach the full group as a selector\r
+       if ( group ) {\r
+               tokens.selector = group;\r
+       }\r
+\r
+       // Return the length of the invalid excess\r
+       // if we're just parsing\r
+       // Otherwise, throw an error or return tokens\r
+       return parseOnly ?\r
+               soFar.length :\r
+               soFar ?\r
+                       Sizzle.error( selector ) :\r
+                       // Cache the tokens\r
+                       slice.call( tokenCache(key, groups), 0 );\r
+}\r
+\r
+function addCombinator( matcher, combinator, context, xml ) {\r
+       var dir = combinator.dir,\r
+               doneName = done++;\r
+\r
+       if ( !matcher ) {\r
+               // If there is no matcher to check, check against the context\r
+               matcher = function( elem ) {\r
+                       return elem === context;\r
+               };\r
+       }\r
+       return combinator.first ?\r
+               function( elem ) {\r
+                       while ( (elem = elem[ dir ]) ) {\r
+                               if ( elem.nodeType === 1 ) {\r
+                                       return matcher( elem ) && elem;\r
+                               }\r
+                       }\r
+               } :\r
+               xml ?\r
+                       function( elem ) {\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( elem.nodeType === 1 ) {\r
+                                               if ( matcher( elem ) ) {\r
+                                                       return elem;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       } :\r
+                       function( elem ) {\r
+                               var cache,\r
+                                       dirkey = doneName + "." + dirruns,\r
+                                       cachedkey = dirkey + "." + cachedruns;\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( elem.nodeType === 1 ) {\r
+                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
+                                                       return elem.sizset;\r
+                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
+                                                       if ( elem.sizset ) {\r
+                                                               return elem;\r
+                                                       }\r
+                                               } else {\r
+                                                       elem[ expando ] = cachedkey;\r
+                                                       if ( matcher( elem ) ) {\r
+                                                               elem.sizset = true;\r
+                                                               return elem;\r
+                                                       }\r
+                                                       elem.sizset = false;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       };\r
+}\r
+\r
+function addMatcher( higher, deeper ) {\r
+       return higher ?\r
+               function( elem ) {\r
+                       var result = deeper( elem );\r
+                       return result && higher( result === true ? elem : result );\r
+               } :\r
+               deeper;\r
+}\r
+\r
+// ["TAG", ">", "ID", " ", "CLASS"]\r
+function matcherFromTokens( tokens, context, xml ) {\r
+       var token, matcher,\r
+               i = 0;\r
+\r
+       for ( ; (token = tokens[i]); i++ ) {\r
+               if ( Expr.relative[ token.part ] ) {\r
+                       matcher = addCombinator( matcher, Expr.relative[ token.part ], context, xml );\r
+               } else {\r
+                       matcher = addMatcher( matcher, Expr.filter[ token.part ].apply(null, token.captures.concat( context, xml )) );\r
+               }\r
+       }\r
+\r
+       return matcher;\r
+}\r
+\r
+function matcherFromGroupMatchers( matchers ) {\r
+       return function( elem ) {\r
+               var matcher,\r
+                       j = 0;\r
+               for ( ; (matcher = matchers[j]); j++ ) {\r
+                       if ( matcher(elem) ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+}\r
+\r
+compile = Sizzle.compile = function( selector, context, xml ) {\r
+       var group, i, len,\r
+               cached = compilerCache[ expando ][ selector ];\r
+\r
+       // Return a cached group function if already generated (context dependent)\r
+       if ( cached && cached.context === context ) {\r
+               return cached;\r
+       }\r
+\r
+       // Generate a function of recursive functions that can be used to check each element\r
+       group = tokenize( selector, context, xml );\r
+       for ( i = 0, len = group.length; i < len; i++ ) {\r
+               group[i] = matcherFromTokens(group[i], context, xml);\r
+       }\r
+\r
+       // Cache the compiled function\r
+       cached = compilerCache( selector, matcherFromGroupMatchers(group) );\r
+       cached.context = context;\r
+       cached.runs = cached.dirruns = 0;\r
+       return cached;\r
+};\r
+\r
+function multipleContexts( selector, contexts, results, seed ) {\r
+       var i = 0,\r
+               len = contexts.length;\r
+       for ( ; i < len; i++ ) {\r
+               Sizzle( selector, contexts[i], results, seed );\r
+       }\r
+}\r
+\r
+function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
+       var results,\r
+               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
+\r
+       if ( !fn ) {\r
+               Sizzle.error( posfilter );\r
+       }\r
+\r
+       if ( selector || !(results = seed) ) {\r
+               multipleContexts( selector || "*", contexts, (results = []), seed );\r
+       }\r
+\r
+       return results.length > 0 ? fn( results, argument, not ) : [];\r
+}\r
+\r
+function handlePOS( groups, context, results, seed ) {\r
+       var group, part, j, groupLen, token, selector,\r
+               anchor, elements, match, matched,\r
+               lastIndex, currentContexts, not,\r
+               i = 0,\r
+               len = groups.length,\r
+               rpos = matchExpr["POS"],\r
+               // This is generated here in case matchExpr["POS"] is extended\r
+               rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),\r
+               // This is for making sure non-participating\r
+               // matching groups are represented cross-browser (IE6-8)\r
+               setUndefined = function() {\r
+                       var i = 1,\r
+                               len = arguments.length - 2;\r
+                       for ( ; i < len; i++ ) {\r
+                               if ( arguments[i] === undefined ) {\r
+                                       match[i] = undefined;\r
+                               }\r
+                       }\r
+               };\r
+\r
+       for ( ; i < len; i++ ) {\r
+               group = groups[i];\r
+               part = "";\r
+               elements = seed;\r
+               for ( j = 0, groupLen = group.length; j < groupLen; j++ ) {\r
+                       token = group[j];\r
+                       selector = token.string;\r
+                       if ( token.part === "PSEUDO" ) {\r
+                               // Reset regex index to 0\r
+                               rpos.exec("");\r
+                               anchor = 0;\r
+                               while ( (match = rpos.exec( selector )) ) {\r
+                                       matched = true;\r
+                                       lastIndex = rpos.lastIndex = match.index + match[0].length;\r
+                                       if ( lastIndex > anchor ) {\r
+                                               part += selector.slice( anchor, match.index );\r
+                                               anchor = lastIndex;\r
+                                               currentContexts = [ context ];\r
+\r
+                                               if ( rcombinators.test(part) ) {\r
+                                                       if ( elements ) {\r
+                                                               currentContexts = elements;\r
+                                                       }\r
+                                                       elements = seed;\r
+                                               }\r
+\r
+                                               if ( (not = rendsWithNot.test( part )) ) {\r
+                                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
+                                                       anchor++;\r
+                                               }\r
+\r
+                                               if ( match.length > 1 ) {\r
+                                                       match[0].replace( rposgroups, setUndefined );\r
+                                               }\r
+                                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
+                                       }\r
+                                       part = "";\r
+                               }\r
+\r
+                       }\r
+\r
+                       if ( !matched ) {\r
+                               part += selector;\r
+                       }\r
+                       matched = false;\r
+               }\r
+\r
+               if ( part ) {\r
+                       if ( rcombinators.test(part) ) {\r
+                               multipleContexts( part, elements || [ context ], results, seed );\r
+                       } else {\r
+                               Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
+                       }\r
+               } else {\r
+                       push.apply( results, elements );\r
+               }\r
+       }\r
+\r
+       // Do not sort if this is a single filter\r
+       return len === 1 ? results : Sizzle.uniqueSort( results );\r
+}\r
+\r
+function select( selector, context, results, seed, xml ) {\r
+       // Remove excessive whitespace\r
+       selector = selector.replace( rtrim, "$1" );\r
+       var elements, matcher, cached, elem,\r
+               i, tokens, token, lastToken, findContext, type,\r
+               match = tokenize( selector, context, xml ),\r
+               contextNodeType = context.nodeType;\r
+\r
+       // POS handling\r
+       if ( matchExpr["POS"].test(selector) ) {\r
+               return handlePOS( match, context, results, seed );\r
+       }\r
+\r
+       if ( seed ) {\r
+               elements = slice.call( seed, 0 );\r
+\r
+       // To maintain document order, only narrow the\r
+       // set if there is one group\r
+       } else if ( match.length === 1 ) {\r
+\r
+               // Take a shortcut and set the context if the root selector is an ID\r
+               if ( (tokens = slice.call( match[0], 0 )).length > 2 &&\r
+                               (token = tokens[0]).part === "ID" &&\r
+                               contextNodeType === 9 && !xml &&\r
+                               Expr.relative[ tokens[1].part ] ) {\r
+\r
+                       context = Expr.find["ID"]( token.captures[0].replace( rbackslash, "" ), context, xml )[0];\r
+                       if ( !context ) {\r
+                               return results;\r
+                       }\r
+\r
+                       selector = selector.slice( tokens.shift().string.length );\r
+               }\r
+\r
+               findContext = ( (match = rsibling.exec( tokens[0].string )) && !match.index && context.parentNode ) || context;\r
+\r
+               // Reduce the set if possible\r
+               lastToken = "";\r
+               for ( i = tokens.length - 1; i >= 0; i-- ) {\r
+                       token = tokens[i];\r
+                       type = token.part;\r
+                       lastToken = token.string + lastToken;\r
+                       if ( Expr.relative[ type ] ) {\r
+                               break;\r
+                       }\r
+                       if ( Expr.order.test(type) ) {\r
+                               elements = Expr.find[ type ]( token.captures[0].replace( rbackslash, "" ), findContext, xml );\r
+                               if ( elements == null ) {\r
+                                       continue;\r
+                               } else {\r
+                                       selector = selector.slice( 0, selector.length - lastToken.length ) +\r
+                                               lastToken.replace( matchExpr[ type ], "" );\r
+\r
+                                       if ( !selector ) {\r
+                                               push.apply( results, slice.call(elements, 0) );\r
+                                       }\r
+\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Only loop over the given elements once\r
+       if ( selector ) {\r
+               matcher = compile( selector, context, xml );\r
+               dirruns = matcher.dirruns++;\r
+               if ( elements == null ) {\r
+                       elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );\r
+               }\r
+\r
+               for ( i = 0; (elem = elements[i]); i++ ) {\r
+                       cachedruns = matcher.runs++;\r
+                       if ( matcher(elem) ) {\r
+                               results.push( elem );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+}\r
+\r
+if ( document.querySelectorAll ) {\r
+       (function() {\r
+               var disconnectedMatch,\r
+                       oldSelect = select,\r
+                       rescape = /'|\\/g,\r
+                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
+                       rbuggyQSA = [],\r
+                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
+                       // A support test would require too much code (would include document ready)\r
+                       // just skip matchesSelector for :active\r
+                       rbuggyMatches = [":active"],\r
+                       matches = docElem.matchesSelector ||\r
+                               docElem.mozMatchesSelector ||\r
+                               docElem.webkitMatchesSelector ||\r
+                               docElem.oMatchesSelector ||\r
+                               docElem.msMatchesSelector;\r
+\r
+               // Build QSA regex\r
+               // Regex strategy adopted from Diego Perini\r
+               assert(function( div ) {\r
+                       // Select is set to empty string on purpose\r
+                       // This is to test IE's treatment of not explictly\r
+                       // setting a boolean content attribute,\r
+                       // since its presence should be enough\r
+                       // http://bugs.jquery.com/ticket/12359\r
+                       div.innerHTML = "<select><option selected=''></option></select>";\r
+\r
+                       // IE8 - Some boolean attributes are not treated correctly\r
+                       if ( !div.querySelectorAll("[selected]").length ) {\r
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
+                       }\r
+\r
+                       // Webkit/Opera - :checked should return selected option elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       if ( !div.querySelectorAll(":checked").length ) {\r
+                               rbuggyQSA.push(":checked");\r
+                       }\r
+               });\r
+\r
+               assert(function( div ) {\r
+\r
+                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
+                       // Should not select anything\r
+                       div.innerHTML = "<p test=''></p>";\r
+                       if ( div.querySelectorAll("[test^='']").length ) {\r
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
+                       }\r
+\r
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       div.innerHTML = "<input type='hidden'/>";\r
+                       if ( !div.querySelectorAll(":enabled").length ) {\r
+                               rbuggyQSA.push(":enabled", ":disabled");\r
+                       }\r
+               });\r
+\r
+               rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\r
+\r
+               select = function( selector, context, results, seed, xml ) {\r
+                       // Only use querySelectorAll when not filtering,\r
+                       // when this is not xml,\r
+                       // and when no QSA bugs apply\r
+                       if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r
+                               if ( context.nodeType === 9 ) {\r
+                                       try {\r
+                                               push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\r
+                                               return results;\r
+                                       } catch(qsaError) {}\r
+                               // qSA works strangely on Element-rooted queries\r
+                               // We can work around this by specifying an extra ID on the root\r
+                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
+                               // IE 8 doesn't work on object elements\r
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
+                                       var groups, i, len,\r
+                                               old = context.getAttribute("id"),\r
+                                               nid = old || expando,\r
+                                               newContext = rsibling.test( selector ) && context.parentNode || context;\r
+\r
+                                       if ( old ) {\r
+                                               nid = nid.replace( rescape, "\\$&" );\r
+                                       } else {\r
+                                               context.setAttribute( "id", nid );\r
+                                       }\r
+\r
+                                       groups = tokenize(selector, context, xml);\r
+                                       // Trailing space is unnecessary\r
+                                       // There is always a context check\r
+                                       nid = "[id='" + nid + "']";\r
+                                       for ( i = 0, len = groups.length; i < len; i++ ) {\r
+                                               groups[i] = nid + groups[i].selector;\r
+                                       }\r
+                                       try {\r
+                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
+                                                       groups.join(",")\r
+                                               ), 0 ) );\r
+                                               return results;\r
+                                       } catch(qsaError) {\r
+                                       } finally {\r
+                                               if ( !old ) {\r
+                                                       context.removeAttribute("id");\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return oldSelect( selector, context, results, seed, xml );\r
+               };\r
+\r
+               if ( matches ) {\r
+                       assert(function( div ) {\r
+                               // Check to see if it's possible to do matchesSelector\r
+                               // on a disconnected node (IE 9)\r
+                               disconnectedMatch = matches.call( div, "div" );\r
+\r
+                               // This should fail with an exception\r
+                               // Gecko does not error, returns false instead\r
+                               try {\r
+                                       matches.call( div, "[test!='']:sizzle" );\r
+                                       rbuggyMatches.push( matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=" );\r
+                               } catch ( e ) {}\r
+                       });\r
+\r
+                       // rbuggyMatches always contains :active, so no need for a length check\r
+                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
+\r
+                       Sizzle.matchesSelector = function( elem, expr ) {\r
+                               // Make sure that attribute selectors are quoted\r
+                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
+\r
+                               // rbuggyMatches always contains :active, so no need for an existence check\r
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\r
+                                       try {\r
+                                               var ret = matches.call( elem, expr );\r
+\r
+                                               // IE 9's matchesSelector returns false on disconnected nodes\r
+                                               if ( ret || disconnectedMatch ||\r
+                                                               // As well, disconnected nodes are said to be in a document\r
+                                                               // fragment in IE 9\r
+                                                               elem.document && elem.document.nodeType !== 11 ) {\r
+                                                       return ret;\r
+                                               }\r
+                                       } catch(e) {}\r
+                               }\r
+\r
+                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+                       };\r
+               }\r
+       })();\r
+}\r
+\r
+// Deprecated\r
+Expr.setFilters["nth"] = Expr.setFilters["eq"];\r
+\r
+// Back-compat\r
+Expr.filters = Expr.pseudos;\r
+\r
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+\r
+\r
+})( window );\r
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
 
-                               // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i, l, length, n, r, ret,
+                       self = this;
 
-                               // Weird iteration because IE will replace the length property
-                               // with an element if you are cloning the body and one of the
-                               // elements on the page has a name or id of "length"
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       // Ensure that the destination node is not null; Fixes #9587
-                                       if ( destElements[i] ) {
-                                               cloneFixAttributes( srcElements[i], destElements[i] );
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
                                        }
                                }
-                       }
+                       });
+               }
 
-                       // Copy the events from the original to the clone
-                       if ( dataAndEvents ) {
-                               cloneCopyEvent( elem, clone );
+               ret = this.pushStack( "", "find", selector );
 
-                               if ( deepDataAndEvents ) {
-                                       srcElements = getAll( elem );
-                                       destElements = getAll( clone );
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
 
-                                       for ( i = 0; srcElements[i]; ++i ) {
-                                               cloneCopyEvent( srcElements[i], destElements[i] );
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
                                        }
                                }
                        }
+               }
 
-                       srcElements = destElements = null;
-
-                       // Return the cloned set
-                       return clone;
-               },
-
-               clean: function( elems, context, fragment, scripts ) {
-                       var checkScriptType, script, j,
-                               ret = [];
+               return ret;
+       },
 
-                       context = context || document;
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
 
-                       // !context.createElement fails in IE with an error but returns typeof 'object'
-                       if ( typeof context.createElement === "undefined" ) {
-                               context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
                        }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && (
+                       typeof selector === "string" ?
+                               // If this is a positional/relative selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               rneedsContext.test( selector ) ?
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
 
-                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                               if ( typeof elem === "number" ) {
-                                       elem += "";
-                               }
+               for ( ; i < l; i++ ) {
+                       cur = this[i];
 
-                               if ( !elem ) {
-                                       continue;
+                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
                                }
+                               cur = cur.parentNode;
+                       }
+               }
 
-                               // Convert html string into DOM nodes
-                               if ( typeof elem === "string" ) {
-                                       if ( !rhtml.test( elem ) ) {
-                                               elem = context.createTextNode( elem );
-                                       } else {
-                                               // Fix "XHTML"-style tags in all browsers
-                                               elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-                                               // Trim whitespace, otherwise indexOf won't work as expected
-                                               var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
-                                                       wrap = wrapMap[ tag ] || wrapMap._default,
-                                                       depth = wrap[0],
-                                                       div = context.createElement("div"),
-                                                       safeChildNodes = safeFragment.childNodes,
-                                                       remove;
-
-                                               // Append wrapper element to unknown element safe doc fragment
-                                               if ( context === document ) {
-                                                       // Use the fragment we've already created for this document
-                                                       safeFragment.appendChild( div );
-                                               } else {
-                                                       // Use a fragment created with the owner document
-                                                       createSafeFragment( context ).appendChild( div );
-                                               }
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
-                                               // Go to html and back, then peel off extra wrappers
-                                               div.innerHTML = wrap[1] + elem + wrap[2];
+               return this.pushStack( ret, "closest", selectors );
+       },
 
-                                               // Move to the right depth
-                                               while ( depth-- ) {
-                                                       div = div.lastChild;
-                                               }
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
 
-                                               // Remove IE's autoinserted <tbody> from table fragments
-                                               if ( !jQuery.support.tbody ) {
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
 
-                                                       // String was a <table>, *may* have spurious <tbody>
-                                                       var hasBody = rtbody.test(elem),
-                                                               tbody = tag === "table" && !hasBody ?
-                                                                       div.firstChild && div.firstChild.childNodes :
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
 
-                                                                       // String was a bare <thead> or <tfoot>
-                                                                       wrap[1] === "<table>" && !hasBody ?
-                                                                               div.childNodes :
-                                                                               [];
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
 
-                                                       for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                               if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                                       tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                               }
-                                                       }
-                                               }
+jQuery.fn.andSelf = jQuery.fn.addBack;
 
-                                               // IE completely kills leading whitespace when innerHTML is used
-                                               if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                                       div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-                                               }
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
 
-                                               elem = div.childNodes;
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
 
-                                               // Clear elements from DocumentFragment (safeFragment or otherwise)
-                                               // to avoid hoarding elements. Fixes #11356
-                                               if ( div ) {
-                                                       div.parentNode.removeChild( div );
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
 
-                                                       // Guard against -1 index exceptions in FF3.6
-                                                       if ( safeChildNodes.length > 0 ) {
-                                                               remove = safeChildNodes[ safeChildNodes.length - 1 ];
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
-                                                               if ( remove && remove.parentNode ) {
-                                                                       remove.parentNode.removeChild( remove );
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
+               if ( this.length > 1 && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
 
-                               // Resets defaultChecked for any radios and checkboxes
-                               // about to be appended to the DOM in IE 6/7 (#8060)
-                               var len;
-                               if ( !jQuery.support.appendChecked ) {
-                                       if ( elem[0] && typeof (len = elem.length) === "number" ) {
-                                               for ( j = 0; j < len; j++ ) {
-                                                       findInputs( elem[j] );
-                                               }
-                                       } else {
-                                               findInputs( elem );
-                                       }
-                               }
+               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+       };
+});
 
-                               if ( elem.nodeType ) {
-                                       ret.push( elem );
-                               } else {
-                                       ret = jQuery.merge( ret, elem );
-                               }
-                       }
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
 
-                       if ( fragment ) {
-                               checkScriptType = function( elem ) {
-                                       return !elem.type || rscriptType.test( elem.type );
-                               };
-                               for ( i = 0; ret[i]; i++ ) {
-                                       script = ret[i];
-                                       if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
-                                               scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
 
-                                       } else {
-                                               if ( script.nodeType === 1 ) {
-                                                       var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
 
-                                                       ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               }
-                                               fragment.appendChild( script );
-                                       }
-                               }
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
                        }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
 
-                       return ret;
-               },
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
 
-               cleanData: function( elems ) {
-                       var data, id,
-                               cache = jQuery.cache,
-                               special = jQuery.event.special,
-                               deleteExpando = jQuery.support.deleteExpando;
+               return r;
+       }
+});
 
-                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
-                                       continue;
-                               }
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
 
-                               id = elem[ jQuery.expando ];
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
 
-                               if ( id ) {
-                                       data = cache[ id ];
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
 
-                                       if ( data && data.events ) {
-                                               for ( var type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
 
-                                                               // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
 
-                                               // Null the DOM reference to avoid IE6/7/8 leak (#7054)
-                                               if ( data.handle ) {
-                                                       data.handle.elem = null;
-                                               }
-                                       }
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
 
-                                       if ( deleteExpando ) {
-                                               delete elem[ jQuery.expando ];
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rcheckableType = /^(?:checkbox|radio)$/,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
 
-                                       } else if ( elem.removeAttribute ) {
-                                               elem.removeAttribute( jQuery.expando );
-                                       }
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
 
-                                       delete cache[ id ];
-                               }
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
                        }
-               }
-       });
 
+                       wrap.map(function() {
+                               var elem = this;
 
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
 
+                               return elem;
+                       }).append( this );
+               }
 
-       var ralpha = /alpha\([^)]*\)/i,
-               ropacity = /opacity=([^)]*)/,
-       // fixed for IE9, see #8346
-               rupper = /([A-Z]|^ms)/g,
-               rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
-               rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
-               rrelNum = /^([\-+])=([\-+.\de]+)/,
-               rmargin = /^margin/,
+               return this;
+       },
 
-               cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
 
-       // order is important!
-               cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
 
-               curCSS,
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
 
-               getComputedStyle,
-               currentStyle;
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
 
-       jQuery.fn.css = function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       };
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
 
-       jQuery.extend({
-               // Add in style property hooks for overriding the default
-               // behavior of getting and setting a style property
-               cssHooks: {
-                       opacity: {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               // We should always get a number back from opacity
-                                               var ret = curCSS( elem, "opacity" );
-                                               return ret === "" ? "1" : ret;
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
 
-                                       } else {
-                                               return elem.style.opacity;
-                                       }
-                               }
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
                        }
-               },
-
-               // Exclude the following css properties to add px
-               cssNumber: {
-                       "fillOpacity": true,
-                       "fontWeight": true,
-                       "lineHeight": true,
-                       "opacity": true,
-                       "orphans": true,
-                       "widows": true,
-                       "zIndex": true,
-                       "zoom": true
-               },
+               }).end();
+       },
 
-               // Add in properties whose names you wish to fix before
-               // setting or getting the value
-               cssProps: {
-                       // normalize float css property
-                       "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-               },
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
 
-               // Get and set the style property on a DOM Node
-               style: function( elem, name, value, extra ) {
-                       // Don't set styles on text and comment nodes
-                       if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-                               return;
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.insertBefore( elem, this.firstChild );
                        }
+               });
+       },
 
-                       // Make sure that we're working with the right name
-                       var ret, type, origName = jQuery.camelCase( name ),
-                               style = elem.style, hooks = jQuery.cssHooks[ origName ];
+       before: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               }
 
-                       name = jQuery.cssProps[ origName ] || origName;
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               }
+       },
 
-                       // Check if we're setting a value
-                       if ( value !== undefined ) {
-                               type = typeof value;
+       after: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               }
 
-                               // convert relative number strings (+= or -=) to relative numbers. #7345
-                               if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                                       value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
-                                       // Fixes bug #9237
-                                       type = "number";
-                               }
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+               }
+       },
 
-                               // Make sure that NaN and null values aren't set. See: #7116
-                               if ( value == null || type === "number" && isNaN( value ) ) {
-                                       return;
-                               }
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       i = 0;
 
-                               // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                               if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                                       value += "px";
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
                                }
 
-                               // If a hook was provided, use that value, otherwise just set the specified value
-                               if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
-                                       // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-                                       // Fixes bug #5509
-                                       try {
-                                               style[ name ] = value;
-                                       } catch(e) {}
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
                                }
+                       }
+               }
 
-                       } else {
-                               // If a hook was provided get the non-computed value from there
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-                                       return ret;
-                               }
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
 
-                               // Otherwise just get the value from the style object
-                               return style[ name ];
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
                        }
-               },
 
-               css: function( elem, name, extra ) {
-                       var ret, hooks;
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
 
-                       // Make sure that we're working with the right name
-                       name = jQuery.camelCase( name );
-                       hooks = jQuery.cssHooks[ name ];
-                       name = jQuery.cssProps[ name ] || name;
+               return this;
+       },
 
-                       // cssFloat needs a special treatment
-                       if ( name === "cssFloat" ) {
-                               name = "float";
-                       }
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-                       // If a hook was provided get the computed value from there
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
-                               return ret;
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
 
-                               // Otherwise, if a way to get the computed value exists, use that
-                       } else if ( curCSS ) {
-                               return curCSS( elem, name );
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
                        }
-               },
 
-               // A method for quickly swapping in/out CSS properties to get correct calculations
-               swap: function( elem, options, callback ) {
-                       var old = {},
-                               ret, name;
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
 
-                       // Remember the old values, and insert the new ones
-                       for ( name in options ) {
-                               old[ name ] = elem.style[ name ];
-                               elem.style[ name ] = options[ name ];
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
                        }
+               }, null, value, arguments.length );
+       },
 
-                       ret = callback.call( elem );
+       replaceWith: function( value ) {
+               if ( !isDisconnected( this[0] ) ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
 
-                       // Revert the old values
-                       for ( name in options ) {
-                               elem.style[ name ] = old[ name ];
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
                        }
 
-                       return ret;
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
                }
-       });
 
-// DEPRECATED in 1.3, Use jQuery.css() instead
-       jQuery.curCSS = jQuery.css;
+               return this.length ?
+                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                       this;
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
 
-       if ( document.defaultView && document.defaultView.getComputedStyle ) {
-               getComputedStyle = function( elem, name ) {
-                       var ret, defaultView, computedStyle, width,
-                               style = elem.style;
+       domManip: function( args, table, callback ) {
 
-                       name = name.replace( rupper, "-$1" ).toLowerCase();
+               // Flatten any nested arrays
+               args = [].concat.apply( [], args );
 
-                       if ( (defaultView = elem.ownerDocument.defaultView) &&
-                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+               var results, first, fragment, iNoClone,
+                       i = 0,
+                       value = args[0],
+                       scripts = [],
+                       l = this.length;
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call( this, i, table ? self.html() : undefined );
+                               self.domManip( args, table, callback );
+                       });
+               }
 
-                               ret = computedStyle.getPropertyValue( name );
-                               if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-                                       ret = jQuery.style( elem, name );
+               if ( this[0] ) {
+                       results = jQuery.buildFragment( args, this, scripts );
+                       fragment = results.fragment;
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               // Fragments from the fragment cache must always be cloned and never used in place.
+                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table && jQuery.nodeName( this[i], "table" ) ?
+                                                       findOrAppend( this[i], "tbody" ) :
+                                                       this[i],
+                                               i === iNoClone ?
+                                                       fragment :
+                                                       jQuery.clone( fragment, true, true )
+                                       );
                                }
                        }
 
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
-                       // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
-                               width = style.width;
-                               style.width = ret;
-                               ret = computedStyle.width;
-                               style.width = width;
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, function( i, elem ) {
+                                       if ( elem.src ) {
+                                               if ( jQuery.ajax ) {
+                                                       jQuery.ajax({
+                                                               url: elem.src,
+                                                               type: "GET",
+                                                               dataType: "script",
+                                                               async: false,
+                                                               global: false,
+                                                               "throws": true
+                                                       });
+                                               } else {
+                                                       jQuery.error("no ajax");
+                                               }
+                                       } else {
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                       }
+
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
+                               });
                        }
+               }
 
-                       return ret;
-               };
+               return this;
        }
+});
 
-       if ( document.documentElement.currentStyle ) {
-               currentStyle = function( elem, name ) {
-                       var left, rsLeft, uncomputed,
-                               ret = elem.currentStyle && elem.currentStyle[ name ],
-                               style = elem.style;
+function findOrAppend( elem, tag ) {
+       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
 
-                       // Avoid setting ret to empty string here
-                       // so we don't default to auto
-                       if ( ret == null && style && (uncomputed = style[ name ]) ) {
-                               ret = uncomputed;
-                       }
-
-                       // From the awesome hack by Dean Edwards
-                       // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+function cloneCopyEvent( src, dest ) {
 
-                       // If we're not dealing with a regular pixel number
-                       // but a number that has a weird ending, we need to convert it to pixels
-                       if ( rnumnonpx.test( ret ) ) {
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
 
-                               // Remember the original values
-                               left = style.left;
-                               rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
 
-                               // Put in the new values to get a computed value out
-                               if ( rsLeft ) {
-                                       elem.runtimeStyle.left = elem.currentStyle.left;
-                               }
-                               style.left = name === "fontSize" ? "1em" : ret;
-                               ret = style.pixelLeft + "px";
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
 
-                               // Revert the changed values
-                               style.left = left;
-                               if ( rsLeft ) {
-                                       elem.runtimeStyle.left = rsLeft;
-                               }
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
                        }
+               }
+       }
 
-                       return ret === "" ? "auto" : ret;
-               };
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
        }
+}
 
-       curCSS = getComputedStyle || currentStyle;
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
 
-       function getWidthOrHeight( elem, name, extra ) {
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
 
-               // Start with offset property
-               var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-                       i = name === "width" ? 1 : 0,
-                       len = 4;
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
 
-               if ( val > 0 ) {
-                       if ( extra !== "border" ) {
-                               for ( ; i < len; i += 2 ) {
-                                       if ( !extra ) {
-                                               val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                                       }
-                                       if ( extra === "margin" ) {
-                                               val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
-                                       } else {
-                                               val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                                       }
-                               }
-                       }
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
 
-                       return val + "px";
-               }
+       nodeName = dest.nodeName.toLowerCase();
 
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
+       if ( nodeName === "object" ) {
+               // IE6-10 improperly clones children of object elements using classid.
+               // IE10 throws NoModificationAllowedError if parent is null, #12132.
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
                }
 
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+                       dest.innerHTML = src.innerHTML;
                }
 
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
 
-               // Add padding, border, margin
-               if ( extra ) {
-                       for ( ; i < len; i += 2 ) {
-                               val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                               if ( extra !== "padding" ) {
-                                       val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                               }
-                               if ( extra === "margin" ) {
-                                       val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
-                               }
-                       }
+               dest.defaultChecked = dest.checked = src.checked;
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
                }
 
-               return val + "px";
-       }
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
 
-       jQuery.each([ "height", "width" ], function( i, name ) {
-               jQuery.cssHooks[ name ] = {
-                       get: function( elem, computed, extra ) {
-                               if ( computed ) {
-                                       if ( elem.offsetWidth !== 0 ) {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       } else {
-                                               return jQuery.swap( elem, cssShow, function() {
-                                                       return getWidthOrHeight( elem, name, extra );
-                                               });
-                                       }
-                               }
-                       },
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
 
-                       set: function( elem, value ) {
-                               return rnum.test( value ) ?
-                                       value + "px" :
-                                       value;
-                       }
-               };
-       });
+       // IE blanks contents when cloning scripts
+       } else if ( nodeName === "script" && dest.text !== src.text ) {
+               dest.text = src.text;
+       }
 
-       if ( !jQuery.support.opacity ) {
-               jQuery.cssHooks.opacity = {
-                       get: function( elem, computed ) {
-                               // IE uses filters for opacity
-                               return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                                       ( parseFloat( RegExp.$1 ) / 100 ) + "" :
-                                       computed ? "1" : "";
-                       },
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+       var fragment, cacheable, cachehit,
+               first = args[ 0 ];
+
+       // Set context from what may come in as undefined or a jQuery collection or a node
+       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+       context = context || document;
+       context = !context.nodeType && context[0] || context;
+       context = context.ownerDocument || context;
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+               // Mark cacheable and look for a hit
+               cacheable = true;
+               fragment = jQuery.fragments[ first ];
+               cachehit = fragment !== undefined;
+       }
 
-                       set: function( elem, value ) {
-                               var style = elem.style,
-                                       currentStyle = elem.currentStyle,
-                                       opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                                       filter = currentStyle && currentStyle.filter || style.filter || "";
+       if ( !fragment ) {
+               fragment = context.createDocumentFragment();
+               jQuery.clean( args, context, fragment, scripts );
 
-                               // IE has trouble with opacity if it does not have layout
-                               // Force it by setting the zoom level
-                               style.zoom = 1;
+               // Update the cache, but only store false
+               // unless this is a second parsing of the same content
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cachehit && fragment;
+               }
+       }
 
-                               // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                               if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+       return { fragment: fragment, cacheable: cacheable };
+};
 
-                                       // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                                       // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                                       // style.removeAttribute is IE Only, but so apparently is this code path...
-                                       style.removeAttribute( "filter" );
+jQuery.fragments = {};
 
-                                       // if there there is no filter style applied in a css rule, we are done
-                                       if ( currentStyle && !currentStyle.filter ) {
-                                               return;
-                                       }
-                               }
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       l = insert.length,
+                       parent = this.length === 1 && this[0].parentNode;
 
-                               // otherwise, set new filter values
-                               style.filter = ralpha.test( filter ) ?
-                                       filter.replace( ralpha, opacity ) :
-                                       filter + " " + opacity;
+               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+               } else {
+                       for ( ; i < l; i++ ) {
+                               elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
                        }
-               };
-       }
 
-       jQuery(function() {
-               // This hook cannot be added until DOM ready because the support test
-               // for it is not run until after DOM ready
-               if ( !jQuery.support.reliableMarginRight ) {
-                       jQuery.cssHooks.marginRight = {
-                               get: function( elem, computed ) {
-                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                                       // Work around by temporarily setting element display to inline-block
-                                       return jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                               if ( computed ) {
-                                                       return curCSS( elem, "margin-right" );
-                                               } else {
-                                                       return elem.style.marginRight;
-                                               }
-                                       });
-                               }
-                       };
+                       return this.pushStack( ret, name, insert.selector );
                }
-       });
+       };
+});
 
-       if ( jQuery.expr && jQuery.expr.filters ) {
-               jQuery.expr.filters.hidden = function( elem ) {
-                       var width = elem.offsetWidth,
-                               height = elem.offsetHeight;
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
 
-                       return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-               };
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
 
-               jQuery.expr.filters.visible = function( elem ) {
-                       return !jQuery.expr.filters.hidden( elem );
-               };
+       } else {
+               return [];
        }
+}
 
-// These hooks are used by animate to expand properties
-       jQuery.each({
-               margin: "",
-               padding: "",
-               border: "Width"
-       }, function( prefix, suffix ) {
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
 
-               jQuery.cssHooks[ prefix + suffix ] = {
-                       expand: function( value ) {
-                               var i,
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var srcElements,
+                       destElements,
+                       i,
+                       clone;
 
-                               // assumes a single number if not a string
-                                       parts = typeof value === "string" ? value.split(" ") : [ value ],
-                                       expanded = {};
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
 
-                               for ( i = 0; i < 4; i++ ) {
-                                       expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                               parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                               }
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
 
-                               return expanded;
-                       }
-               };
-       });
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
 
+                       cloneFixAttributes( elem, clone );
 
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
 
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
 
-       var r20 = /%20/g,
-               rbracket = /\[\]$/,
-               rCRLF = /\r?\n/g,
-               rhash = /#.*$/,
-               rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-               rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       // #7653, #8125, #8152: local protocol detection
-               rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-               rnoContent = /^(?:GET|HEAD)$/,
-               rprotocol = /^\/\//,
-               rquery = /\?/,
-               rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-               rselectTextarea = /^(?:select|textarea)/i,
-               rspacesAjax = /\s+/,
-               rts = /([?&])_=[^&]*/,
-               rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
 
-       // Keep a copy of the old load method
-               _load = jQuery.fn.load,
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
 
-       /* Prefilters
-        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-        * 2) These are called:
-        *    - BEFORE asking for a transport
-        *    - AFTER param serialization (s.data is a string if s.processData is true)
-        * 3) key is the dataType
-        * 4) the catchall symbol "*" can be used
-        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-        */
-               prefilters = {},
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
 
-       /* Transports bindings
-        * 1) key is the dataType
-        * 2) the catchall symbol "*" can be used
-        * 3) selection will start with transport dataType and THEN go to "*" if needed
-        */
-               transports = {},
+               srcElements = destElements = null;
 
-       // Document location
-               ajaxLocation,
+               // Return the cloned set
+               return clone;
+       },
 
-       // Document location segments
-               ajaxLocParts,
+       clean: function( elems, context, fragment, scripts ) {
+               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+                       safe = context === document && safeFragment,
+                       ret = [];
 
-       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-               allTypes = ["*/"] + ["*"];
+               // Ensure that context is a document
+               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+                       context = document;
+               }
 
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-       try {
-               ajaxLocation = location.href;
-       } catch( e ) {
-               // Use the href attribute of an A element
-               // since IE will modify it given document.location
-               ajaxLocation = document.createElement( "a" );
-               ajaxLocation.href = "";
-               ajaxLocation = ajaxLocation.href;
-       }
+               // Use the already-created safe fragment if context permits
+               for ( i = 0; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
 
-// Segment location into parts
-       ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+                       if ( !elem ) {
+                               continue;
+                       }
 
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-       function addToPrefiltersOrTransports( structure ) {
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Ensure a safe container in which to render the html
+                                       safe = safe || createSafeFragment( context );
+                                       div = context.createElement("div");
+                                       safe.appendChild( div );
 
-               // dataTypeExpression is optional and defaults to "*"
-               return function( dataTypeExpression, func ) {
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
-                       if ( typeof dataTypeExpression !== "string" ) {
-                               func = dataTypeExpression;
-                               dataTypeExpression = "*";
-                       }
+                                       // Go to html and back, then peel off extra wrappers
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       depth = wrap[0];
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
 
-                       if ( jQuery.isFunction( func ) ) {
-                               var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
-                                       i = 0,
-                                       length = dataTypes.length,
-                                       dataType,
-                                       list,
-                                       placeBefore;
-
-                               // For each dataType in the dataTypeExpression
-                               for ( ; i < length; i++ ) {
-                                       dataType = dataTypes[ i ];
-                                       // We control if we're asked to add before
-                                       // any existing element
-                                       placeBefore = /^\+/.test( dataType );
-                                       if ( placeBefore ) {
-                                               dataType = dataType.substr( 1 ) || "*";
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
                                        }
-                                       list = structure[ dataType ] = structure[ dataType ] || [];
-                                       // then we add to the structure accordingly
-                                       list[ placeBefore ? "unshift" : "push" ]( func );
-                               }
-                       }
-               };
-       }
 
-// Base inspection function for prefilters and transports
-       function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-                                               dataType /* internal */, inspected /* internal */ ) {
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
 
-               dataType = dataType || options.dataTypes[ 0 ];
-               inspected = inspected || {};
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               hasBody = rtbody.test(elem);
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
 
-               inspected[ dataType ] = true;
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
 
-               var list = structure[ dataType ],
-                       i = 0,
-                       length = list ? list.length : 0,
-                       executeOnly = ( structure === prefilters ),
-                       selection;
-
-               for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-                       selection = list[ i ]( options, originalOptions, jqXHR );
-                       // If we got redirected to another dataType
-                       // we try there if executing only and not done already
-                       if ( typeof selection === "string" ) {
-                               if ( !executeOnly || inspected[ selection ] ) {
-                                       selection = undefined;
-                               } else {
-                                       options.dataTypes.unshift( selection );
-                                       selection = inspectPrefiltersOrTransports(
-                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+
+                                       // Take out of fragment container (we need a fresh div each time)
+                                       div.parentNode.removeChild( div );
                                }
                        }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               jQuery.merge( ret, elem );
+                       }
                }
-               // If we're only executing or nothing was selected
-               // we try the catchall dataType if not done already
-               if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-                       selection = inspectPrefiltersOrTransports(
-                               structure, options, originalOptions, jqXHR, "*", inspected );
+
+               // Fix #11356: Clear elements from safeFragment
+               if ( div ) {
+                       elem = div = safe = null;
                }
-               // unnecessary when only executing (prefilters)
-               // but it'll be ignored by the caller in that case
-               return selection;
-       }
 
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-       function ajaxExtend( target, src ) {
-               var key, deep,
-                       flatOptions = jQuery.ajaxSettings.flatOptions || {};
-               for ( key in src ) {
-                       if ( src[ key ] !== undefined ) {
-                               ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               if ( jQuery.nodeName( elem, "input" ) ) {
+                                       fixDefaultChecked( elem );
+                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+                               }
                        }
                }
-               if ( deep ) {
-                       jQuery.extend( true, target, deep );
-               }
-       }
 
-       jQuery.fn.extend({
-               load: function( url, params, callback ) {
-                       if ( typeof url !== "string" && _load ) {
-                               return _load.apply( this, arguments );
+               // Append elements to a provided document fragment
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
 
-                               // Don't do a request if no elements are being requested
-                       } else if ( !this.length ) {
-                               return this;
-                       }
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
 
-                       var off = url.indexOf( " " );
-                       if ( off >= 0 ) {
-                               var selector = url.slice( off, url.length );
-                               url = url.slice( 0, off );
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
                        }
+               }
 
-                       // Default to a GET request
-                       var type = "GET";
+               return ret;
+       },
 
-                       // If the second parameter was provided
-                       if ( params ) {
-                               // If it's a function
-                               if ( jQuery.isFunction( params ) ) {
-                                       // We assume that it's the callback
-                                       callback = params;
-                                       params = undefined;
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var data, id, elem, type,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
 
-                                       // Otherwise, build a param string
-                               } else if ( typeof params === "object" ) {
-                                       params = jQuery.param( params, jQuery.ajaxSettings.traditional );
-                                       type = "POST";
-                               }
-                       }
+               for ( ; (elem = elems[i]) != null; i++ ) {
 
-                       var self = this;
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
 
-                       // Request the remote document
-                       jQuery.ajax({
-                               url: url,
-                               type: type,
-                               dataType: "html",
-                               data: params,
-                               // Complete callback (responseText is used internally)
-                               complete: function( jqXHR, status, responseText ) {
-                                       // Store the response as specified by the jqXHR object
-                                       responseText = jqXHR.responseText;
-                                       // If successful, inject the HTML into all the matched elements
-                                       if ( jqXHR.isResolved() ) {
-                                               // #4825: Get the actual response in case
-                                               // a dataFilter is present in ajaxSettings
-                                               jqXHR.done(function( r ) {
-                                                       responseText = r;
-                                               });
-                                               // See if a selector was specified
-                                               self.html( selector ?
-                                                       // Create a dummy div to hold the results
-                                                       jQuery("<div>")
-                                                               // inject the contents of the document in, removing the scripts
-                                                               // to avoid any 'Permission Denied' errors in IE
-                                                               .append(responseText.replace(rscript, ""))
-
-                                                               // Locate the specified elements
-                                                               .find(selector) :
-
-                                                       // If not, just inject the full result
-                                                       responseText );
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
+
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
                                        }
 
-                                       if ( callback ) {
-                                               self.each( callback, [ responseText, status, jqXHR ] );
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
+
+                                               delete cache[ id ];
+
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( elem.removeAttribute ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
+
+                                               jQuery.deletedIds.push( id );
                                        }
                                }
-                       });
+                       }
+               }
+       }
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
 
-                       return this;
-               },
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
 
-               serialize: function() {
-                       return jQuery.param( this.serializeArray() );
-               },
+if ( matched.browser ) {
+       browser[ matched.browser ] = true;
+       browser.version = matched.version;
+}
 
-               serializeArray: function() {
-                       return this.map(function(){
-                               return this.elements ? jQuery.makeArray( this.elements ) : this;
-                       })
-                               .filter(function(){
-                                       return this.name && !this.disabled &&
-                                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                                       rinput.test( this.type ) );
-                               })
-                               .map(function( i, elem ){
-                                       var val = jQuery( this ).val();
-
-                                       return val == null ?
-                                               null :
-                                               jQuery.isArray( val ) ?
-                                                       jQuery.map( val, function( val, i ){
-                                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                                       }) :
-                                               { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                               }).get();
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+       browser.webkit = true;
+} else if ( browser.webkit ) {
+       browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
                }
-       });
 
-// Attach a bunch of functions for handling common AJAX events
-       jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-               jQuery.fn[ o ] = function( f ){
-                       return this.on( o, f );
-               };
-       });
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+       ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       rposition = /^(top|right|bottom|left)$/,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+       elemdisplay = {},
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+       eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
 
-       jQuery.each( [ "get", "post" ], function( i, method ) {
-               jQuery[ method ] = function( url, data, callback, type ) {
-                       // shift arguments if data argument was omitted
-                       if ( jQuery.isFunction( data ) ) {
-                               type = type || callback;
-                               callback = data;
-                               data = undefined;
-                       }
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
 
-                       return jQuery.ajax({
-                               type: method,
-                               url: url,
-                               data: data,
-                               success: callback,
-                               dataType: type
-                       });
-               };
-       });
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
 
-       jQuery.extend({
+       return origName;
+}
 
-               getScript: function( url, callback ) {
-                       return jQuery.get( url, undefined, callback, "script" );
-               },
+function isHidden( elem, el ) {
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
 
-               getJSON: function( url, data, callback ) {
-                       return jQuery.get( url, data, callback, "json" );
-               },
+function showHide( elements, show ) {
+       var elem, display,
+               values = [],
+               index = 0,
+               length = elements.length;
 
-               // Creates a full fledged settings object into target
-               // with both ajaxSettings and settings fields.
-               // If target is omitted, writes into ajaxSettings.
-               ajaxSetup: function( target, settings ) {
-                       if ( settings ) {
-                               // Building a settings object
-                               ajaxExtend( target, jQuery.ajaxSettings );
-                       } else {
-                               // Extending ajaxSettings
-                               settings = target;
-                               target = jQuery.ajaxSettings;
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && elem.style.display === "none" ) {
+                               elem.style.display = "";
                        }
-                       ajaxExtend( target, settings );
-                       return target;
-               },
-
-               ajaxSettings: {
-                       url: ajaxLocation,
-                       isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-                       global: true,
-                       type: "GET",
-                       contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-                       processData: true,
-                       async: true,
-                       /*
-                        timeout: 0,
-                        data: null,
-                        dataType: null,
-                        username: null,
-                        password: null,
-                        cache: null,
-                        traditional: false,
-                        headers: {},
-                        */
-
-                       accepts: {
-                               xml: "application/xml, text/xml",
-                               html: "text/html",
-                               text: "text/plain",
-                               json: "application/json, text/javascript",
-                               "*": allTypes
-                       },
 
-                       contents: {
-                               xml: /xml/,
-                               html: /html/,
-                               json: /json/
-                       },
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       display = curCSS( elem, "display" );
 
-                       responseFields: {
-                               xml: "responseXML",
-                               text: "responseText"
-                       },
+                       if ( !values[ index ] && display !== "none" ) {
+                               jQuery._data( elem, "olddisplay", display );
+                       }
+               }
+       }
 
-                       // List of data converters
-                       // 1) key format is "source_type destination_type" (a single space in-between)
-                       // 2) the catchall symbol "*" can be used for source_type
-                       converters: {
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
 
-                               // Convert anything to text
-                               "* text": window.String,
+       return elements;
+}
 
-                               // Text to html (true = no transformation)
-                               "text html": true,
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state, fn2 ) {
+               var bool = typeof state === "boolean";
+
+               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+                       return eventsToggle.apply( this, arguments );
+               }
 
-                               // Evaluate text as a json expression
-                               "text json": jQuery.parseJSON,
+               return this.each(function() {
+                       if ( bool ? state : isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
 
-                               // Parse text as xml
-                               "text xml": jQuery.parseXML
-                       },
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
 
-                       // For options that shouldn't be deep extended:
-                       // you can add your own custom options here if
-                       // and when you create one that shouldn't be
-                       // deep extended (see ajaxExtend)
-                       flatOptions: {
-                               context: true,
-                               url: true
+                               }
                        }
-               },
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
 
-               ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-               ajaxTransport: addToPrefiltersOrTransports( transports ),
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
 
-               // Main method
-               ajax: function( url, options ) {
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
 
-                       // If url is an object, simulate pre-1.5 signature
-                       if ( typeof url === "object" ) {
-                               options = url;
-                               url = undefined;
-                       }
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-                       // Force options to be an object
-                       options = options || {};
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
 
-                       var // Create the final options object
-                               s = jQuery.ajaxSetup( {}, options ),
-                       // Callbacks context
-                               callbackContext = s.context || s,
-                       // Context for global events
-                       // It's the callbackContext if one was provided in the options
-                       // and if it's a DOM node or a jQuery collection
-                               globalEventContext = callbackContext !== s &&
-                                       ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-                                       jQuery( callbackContext ) : jQuery.event,
-                       // Deferreds
-                               deferred = jQuery.Deferred(),
-                               completeDeferred = jQuery.Callbacks( "once memory" ),
-                       // Status-dependent callbacks
-                               statusCode = s.statusCode || {},
-                       // ifModified key
-                               ifModifiedKey,
-                       // Headers (they are sent all at once)
-                               requestHeaders = {},
-                               requestHeadersNames = {},
-                       // Response headers
-                               responseHeadersString,
-                               responseHeaders,
-                       // transport
-                               transport,
-                       // timeout handle
-                               timeoutTimer,
-                       // Cross-domain detection vars
-                               parts,
-                       // The jqXHR state
-                               state = 0,
-                       // To know if global events are to be dispatched
-                               fireGlobals,
-                       // Loop variable
-                               i,
-                       // Fake xhr
-                               jqXHR = {
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
 
-                                       readyState: 0,
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
 
-                                       // Caches the header
-                                       setRequestHeader: function( name, value ) {
-                                               if ( !state ) {
-                                                       var lname = name.toLowerCase();
-                                                       name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                                       requestHeaders[ name ] = value;
-                                               }
-                                               return this;
-                                       },
-
-                                       // Raw string
-                                       getAllResponseHeaders: function() {
-                                               return state === 2 ? responseHeadersString : null;
-                                       },
-
-                                       // Builds headers hashtable if needed
-                                       getResponseHeader: function( key ) {
-                                               var match;
-                                               if ( state === 2 ) {
-                                                       if ( !responseHeaders ) {
-                                                               responseHeaders = {};
-                                                               while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                                                                       responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-                                                               }
-                                                       }
-                                                       match = responseHeaders[ key.toLowerCase() ];
-                                               }
-                                               return match === undefined ? null : match;
-                                       },
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
 
-                                       // Overrides response content-type header
-                                       overrideMimeType: function( type ) {
-                                               if ( !state ) {
-                                                       s.mimeType = type;
-                                               }
-                                               return this;
-                                       },
-
-                                       // Cancel the request
-                                       abort: function( statusText ) {
-                                               statusText = statusText || "abort";
-                                               if ( transport ) {
-                                                       transport.abort( statusText );
-                                               }
-                                               done( 0, statusText );
-                                               return this;
-                                       }
-                               };
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
 
-                       // Callback for when everything is done
-                       // It is defined here because jslint complains if it is declared
-                       // at the end of the function (which would be more logical and readable)
-                       function done( status, nativeStatusText, responses, headers ) {
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
 
-                               // Called once
-                               if ( state === 2 ) {
-                                       return;
-                               }
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
 
-                               // State is "done" now
-                               state = 2;
+       css: function( elem, name, numeric, extra ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
 
-                               // Clear timeout if it exists
-                               if ( timeoutTimer ) {
-                                       clearTimeout( timeoutTimer );
-                               }
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-                               // Dereference transport for early garbage collection
-                               // (no matter how long the jqXHR object will be used)
-                               transport = undefined;
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-                               // Cache response headers
-                               responseHeadersString = headers || "";
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
 
-                               // Set readyState
-                               jqXHR.readyState = status > 0 ? 4 : 0;
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name );
+               }
 
-                               var isSuccess,
-                                       success,
-                                       error,
-                                       statusText = nativeStatusText,
-                                       response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
-                                       lastModified,
-                                       etag;
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
 
-                               // If successful, handle type chaining
-                               if ( status >= 200 && status < 300 || status === 304 ) {
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( numeric || extra !== undefined ) {
+                       num = parseFloat( val );
+                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
 
-                                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                                       if ( s.ifModified ) {
+               ret = callback.call( elem );
 
-                                               if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
-                                                       jQuery.lastModified[ ifModifiedKey ] = lastModified;
-                                               }
-                                               if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
-                                                       jQuery.etag[ ifModifiedKey ] = etag;
-                                               }
-                                       }
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
 
-                                       // If not modified
-                                       if ( status === 304 ) {
+               return ret;
+       }
+});
 
-                                               statusText = "notmodified";
-                                               isSuccess = true;
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+       curCSS = function( elem, name ) {
+               var ret, width, minWidth, maxWidth,
+                       computed = window.getComputedStyle( elem, null ),
+                       style = elem.style;
 
-                                               // If we have data
-                                       } else {
+               if ( computed ) {
 
-                                               try {
-                                                       success = ajaxConvert( s, response );
-                                                       statusText = "success";
-                                                       isSuccess = true;
-                                               } catch(e) {
-                                                       // We have a parsererror
-                                                       statusText = "parsererror";
-                                                       error = e;
-                                               }
-                                       }
-                               } else {
-                                       // We extract error from statusText
-                                       // then normalize statusText and status for non-aborts
-                                       error = statusText;
-                                       if ( !statusText || status ) {
-                                               statusText = "error";
-                                               if ( status < 0 ) {
-                                                       status = 0;
-                                               }
-                                       }
-                               }
+                       ret = computed[ name ];
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
 
-                               // Set data for the fake xhr object
-                               jqXHR.status = status;
-                               jqXHR.statusText = "" + ( nativeStatusText || statusText );
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
 
-                               // Success/Error
-                               if ( isSuccess ) {
-                                       deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                               } else {
-                                       deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                               }
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
+               }
+
+               return ret;
+       };
+} else if ( document.documentElement.currentStyle ) {
+       curCSS = function( elem, name ) {
+               var left, rsLeft,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
 
-                               // Status-dependent callbacks
-                               jqXHR.statusCode( statusCode );
-                               statusCode = undefined;
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                               }
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
 
-                               // Complete
-                               completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
 
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                                       // Handle the global AJAX counter
-                                       if ( !( --jQuery.active ) ) {
-                                               jQuery.event.trigger( "ajaxStop" );
-                                       }
-                               }
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
                        }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
 
-                       // Attach deferreds
-                       deferred.promise( jqXHR );
-                       jqXHR.success = jqXHR.done;
-                       jqXHR.error = jqXHR.fail;
-                       jqXHR.complete = completeDeferred.add;
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
 
-                       // Status-dependent callbacks
-                       jqXHR.statusCode = function( map ) {
-                               if ( map ) {
-                                       var tmp;
-                                       if ( state < 2 ) {
-                                               for ( tmp in map ) {
-                                                       statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-                                               }
-                                       } else {
-                                               tmp = map[ jqXHR.status ];
-                                               jqXHR.then( tmp, tmp );
-                                       }
-                               }
-                               return this;
-                       };
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+                       value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       // we use jQuery.css instead of curCSS here
+                       // because of the reliableMarginRight CSS hook!
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               }
 
-                       // Remove hash character (#7531: and string promotion)
-                       // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-                       // We also use the url parameter if available
-                       s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-                       // Extract dataTypes list
-                       s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
-                       // Determine if a cross-domain request is in order
-                       if ( s.crossDomain == null ) {
-                               parts = rurl.exec( s.url.toLowerCase() );
-                               s.crossDomain = !!( parts &&
-                                       ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-                                               ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                                       ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-                                       );
+               // From this point on we use curCSS for maximum performance (relevant in animations)
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
                        }
 
-                       // Convert data if not already a string
-                       if ( s.data && s.processData && typeof s.data !== "string" ) {
-                               s.data = jQuery.param( s.data, s.traditional );
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
 
-                       // Apply prefilters
-                       inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-                       // If request was aborted inside a prefilter, stop there
-                       if ( state === 2 ) {
-                               return false;
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
+               }
+       }
 
-                       // We can fire global events as of now if asked to
-                       fireGlobals = s.global;
+       return val;
+}
 
-                       // Uppercase the type
-                       s.type = s.type.toUpperCase();
+function getWidthOrHeight( elem, name, extra ) {
 
-                       // Determine if request has content
-                       s.hasContent = !rnoContent.test( s.type );
+       // Start with offset property, which is equivalent to the border-box value
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               valueIsBorderBox = true,
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
 
-                       // Watch for a new set of requests
-                       if ( fireGlobals && jQuery.active++ === 0 ) {
-                               jQuery.event.trigger( "ajaxStart" );
-                       }
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
 
-                       // More options handling for requests with no content
-                       if ( !s.hasContent ) {
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
 
-                               // If data is available, append data to url
-                               if ( s.data ) {
-                                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-                                       // #9682: remove data so that it's not used in an eventual retry
-                                       delete s.data;
-                               }
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
 
-                               // Get ifModifiedKey before adding the anti-cache parameter
-                               ifModifiedKey = s.url;
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
 
-                               // Add anti-cache in url if needed
-                               if ( s.cache === false ) {
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox
+               )
+       ) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       if ( elemdisplay[ nodeName ] ) {
+               return elemdisplay[ nodeName ];
+       }
 
-                                       var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                               ret = s.url.replace( rts, "$1_=" + ts );
+       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+               display = elem.css("display");
+       elem.remove();
+
+       // If the simple way fails,
+       // get element's real default display by attaching it to a temp iframe
+       if ( display === "none" || display === "" ) {
+               // Use the already-created iframe if possible
+               iframe = document.body.appendChild(
+                       iframe || jQuery.extend( document.createElement("iframe"), {
+                               frameBorder: 0,
+                               width: 0,
+                               height: 0
+                       })
+               );
+
+               // Create a cacheable copy of the iframe document on first call.
+               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+               if ( !iframeDoc || !iframe.createElement ) {
+                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                       iframeDoc.write("<!doctype html><html><body>");
+                       iframeDoc.close();
+               }
 
-                                       // if nothing was replaced, add timestamp to the end
-                                       s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-                               }
-                       }
+               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
 
-                       // Set the correct header, if data is being sent
-                       if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                               jqXHR.setRequestHeader( "Content-Type", s.contentType );
-                       }
+               display = curCSS( elem, "display" );
+               document.body.removeChild( iframe );
+       }
 
-                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                       if ( s.ifModified ) {
-                               ifModifiedKey = ifModifiedKey || s.url;
-                               if ( jQuery.lastModified[ ifModifiedKey ] ) {
-                                       jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-                               }
-                               if ( jQuery.etag[ ifModifiedKey ] ) {
-                                       jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+       // Store the correct default display
+       elemdisplay[ nodeName ] = display;
+
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+                                       return jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       });
+                               } else {
+                                       return getWidthOrHeight( elem, name, extra );
                                }
                        }
+               },
 
-                       // Set the Accepts header for the server, depending on the dataType
-                       jqXHR.setRequestHeader(
-                               "Accept",
-                               s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-                                       s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-                                       s.accepts[ "*" ]
+               set: function( elem, value, extra ) {
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+                               ) : 0
                        );
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
 
-                       // Check for headers option
-                       for ( i in s.headers ) {
-                               jqXHR.setRequestHeader( i, s.headers[ i ] );
-                       }
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
 
-                       // Allow custom headers/mimetypes and early abort
-                       if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already
-                               jqXHR.abort();
-                               return false;
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
 
-                       }
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                               style.removeAttribute ) {
 
-                       // Install callbacks on deferreds
-                       for ( i in { success: 1, error: 1, complete: 1 } ) {
-                               jqXHR[ i ]( s[ i ] );
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
                        }
 
-                       // Get transport
-                       transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
 
-                       // If no transport, we auto-abort
-                       if ( !transport ) {
-                               done( -1, "No Transport" );
-                       } else {
-                               jqXHR.readyState = 1;
-                               // Send global event
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-                               }
-                               // Timeout
-                               if ( s.async && s.timeout > 0 ) {
-                                       timeoutTimer = setTimeout( function(){
-                                               jqXHR.abort( "timeout" );
-                                       }, s.timeout );
-                               }
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               return curCSS( elem, "marginRight" );
+                                       }
+                               });
+                       }
+               };
+       }
 
-                               try {
-                                       state = 1;
-                                       transport.send( requestHeaders, done );
-                               } catch (e) {
-                                       // Propagate exception as error if not done
-                                       if ( state < 2 ) {
-                                               done( -1, e );
-                                               // Simply rethrow otherwise
-                                       } else {
-                                               throw e;
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               var ret = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
                                        }
                                }
-                       }
+                       };
+               });
+       }
 
-                       return jqXHR;
-               },
+});
 
-               // Serialize an array of form elements or a set of
-               // key/values into a query string
-               param: function( a, traditional ) {
-                       var s = [],
-                               add = function( key, value ) {
-                                       // If value is a function, invoke it and return its value
-                                       value = jQuery.isFunction( value ) ? value() : value;
-                                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-                               };
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+       };
 
-                       // Set traditional to true for jQuery <= 1.3.2 behavior.
-                       if ( traditional === undefined ) {
-                               traditional = jQuery.ajaxSettings.traditional;
-                       }
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
 
-                       // If an array was passed in, assume that it is an array of form elements.
-                       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-                               // Serialize the form elements
-                               jQuery.each( a, function() {
-                                       add( this.name, this.value );
-                               });
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i,
 
-                       } else {
-                               // If traditional, encode the "old" way (the way 1.3.2 or older
-                               // did it), otherwise encode params recursively.
-                               for ( var prefix in a ) {
-                                       buildParams( prefix, a[ prefix ], traditional, add );
-                               }
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ],
+                               expanded = {};
+
+                       for ( i = 0; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
                        }
 
-                       // Return the resulting serialization
-                       return s.join( "&" ).replace( r20, "+" );
+                       return expanded;
                }
-       });
+       };
 
-       function buildParams( prefix, obj, traditional, add ) {
-               if ( jQuery.isArray( obj ) ) {
-                       // Serialize array item.
-                       jQuery.each( obj, function( i, v ) {
-                               if ( traditional || rbracket.test( prefix ) ) {
-                                       // Treat each array item as a scalar.
-                                       add( prefix, v );
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
 
-                               } else {
-                                       // If array item is non-scalar (array or object), encode its
-                                       // numeric index to resolve deserialization ambiguity issues.
-                                       // Note that rack (as of 1.0.0) can't currently deserialize
-                                       // nested arrays properly, and attempting to do so may cause
-                                       // a server error. Possible fixes are to modify rack's
-                                       // deserialization algorithm or to provide an option or flag
-                                       // to force array serialization to be shallow.
-                                       buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-                               }
-                       });
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
 
-               } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-                       // Serialize object item.
-                       for ( var name in obj ) {
-                               buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-                       }
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
 
-               } else {
-                       // Serialize scalar item.
-                       add( prefix, obj );
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
                }
        }
 
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-       jQuery.extend({
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
 
-               // Counter for holding the number of active queries
-               active: 0,
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
 
-               // Last-Modified header cache for next request
-               lastModified: {},
-               etag: {}
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
 
-       });
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+var // Document location
+       ajaxLocation,
+       // Document location segments
+       ajaxLocParts,
+
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
 
-       /* Handles responses to an ajax request:
-        * - sets all responseXXX fields accordingly
-        * - finds the right dataType (mediates between content-type and expected dataType)
-        * - returns the corresponding response
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
         */
-       function ajaxHandleResponses( s, jqXHR, responses ) {
+       prefilters = {},
 
-               var contents = s.contents,
-                       dataTypes = s.dataTypes,
-                       responseFields = s.responseFields,
-                       ct,
-                       type,
-                       finalDataType,
-                       firstDataType;
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
 
-               // Fill responseXXX fields
-               for ( type in responseFields ) {
-                       if ( type in responses ) {
-                               jqXHR[ responseFields[type] ] = responses[ type ];
-                       }
-               }
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
 
-               // Remove auto dataType and get content-type in the process
-               while( dataTypes[ 0 ] === "*" ) {
-                       dataTypes.shift();
-                       if ( ct === undefined ) {
-                               ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-                       }
-               }
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
 
-               // Check if we're dealing with a known content-type
-               if ( ct ) {
-                       for ( type in contents ) {
-                               if ( contents[ type ] && contents[ type ].test( ct ) ) {
-                                       dataTypes.unshift( type );
-                                       break;
-                               }
-                       }
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
                }
 
-               // Check to see if we have a response for the expected dataType
-               if ( dataTypes[ 0 ] in responses ) {
-                       finalDataType = dataTypes[ 0 ];
-               } else {
-                       // Try convertible dataTypes
-                       for ( type in responses ) {
-                               if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-                                       finalDataType = type;
-                                       break;
-                               }
-                               if ( !firstDataType ) {
-                                       firstDataType = type;
+               var dataType, list, placeBefore,
+                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+                       i = 0,
+                       length = dataTypes.length;
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
                                }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
                        }
-                       // Or just use first one
-                       finalDataType = finalDataType || firstDataType;
                }
+       };
+}
 
-               // If we found a dataType
-               // We add the dataType to the list if needed
-               // and return the corresponding response
-               if ( finalDataType ) {
-                       if ( finalDataType !== dataTypes[ 0 ] ) {
-                               dataTypes.unshift( finalDataType );
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var selection,
+               list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters );
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
                        }
-                       return responses[ finalDataType ];
                }
        }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
 
-// Chain conversions given the request and the original response
-       function ajaxConvert( s, response ) {
-
-               // Apply the dataFilter if provided
-               if ( s.dataFilter ) {
-                       response = s.dataFilter( response, s.dataType );
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
                }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
 
-               var dataTypes = s.dataTypes,
-                       converters = {},
-                       i,
-                       key,
-                       length = dataTypes.length,
-                       tmp,
-               // Current and previous dataTypes
-                       current = dataTypes[ 0 ],
-                       prev,
-               // Conversion expression
-                       conversion,
-               // Conversion function
-                       conv,
-               // Conversion functions (transitive conversion)
-                       conv1,
-                       conv2;
-
-               // For each dataType in the chain
-               for ( i = 1; i < length; i++ ) {
-
-                       // Create converters map
-                       // with lowercased keys
-                       if ( i === 1 ) {
-                               for ( key in s.converters ) {
-                                       if ( typeof key === "string" ) {
-                                               converters[ key.toLowerCase() ] = s.converters[ key ];
-                                       }
-                               }
-                       }
-
-                       // Get the dataTypes
-                       prev = current;
-                       current = dataTypes[ i ];
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
 
-                       // If current is auto dataType, update it to prev
-                       if ( current === "*" ) {
-                               current = prev;
-                               // If no auto and dataTypes are actually different
-                       } else if ( prev !== "*" && prev !== current ) {
+       // Don't do a request if no elements are being requested
+       if ( !this.length ) {
+               return this;
+       }
 
-                               // Get the converter
-                               conversion = prev + " " + current;
-                               conv = converters[ conversion ] || converters[ "* " + current ];
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
 
-                               // If there is no direct converter, search transitively
-                               if ( !conv ) {
-                                       conv2 = undefined;
-                                       for ( conv1 in converters ) {
-                                               tmp = conv1.split( " " );
-                                               if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
-                                                       conv2 = converters[ tmp[1] + " " + current ];
-                                                       if ( conv2 ) {
-                                                               conv1 = converters[ conv1 ];
-                                                               if ( conv1 === true ) {
-                                                                       conv = conv2;
-                                                               } else if ( conv2 === true ) {
-                                                                       conv = conv1;
-                                                               }
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                               }
-                               // If we found no converter, dispatch an error
-                               if ( !( conv || conv2 ) ) {
-                                       jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
-                               }
-                               // If found converter is not an equivalence
-                               if ( conv !== true ) {
-                                       // Convert with 1 or 2 converters accordingly
-                                       response = conv ? conv( response ) : conv2( conv1(response) );
-                               }
-                       }
-               }
-               return response;
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
        }
 
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
 
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
 
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
 
-       var jsc = jQuery.now(),
-               jsre = /(\=)\?(&|$)|\?\?/i;
+       // Request the remote document
+       jQuery.ajax({
+               url: url,
 
-// Default jsonp settings
-       jQuery.ajaxSetup({
-               jsonp: "callback",
-               jsonpCallback: function() {
-                       return jQuery.expando + "_" + ( jsc++ );
+               // if "type" variable is undefined, then "GET" method will be used
+               type: type,
+               dataType: "html",
+               data: params,
+               complete: function( jqXHR, status ) {
+                       if ( callback ) {
+                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+                       }
                }
-       });
+       }).done(function( responseText ) {
 
-// Detect, normalize options and install callbacks for jsonp requests
-       jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-               var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
-
-               if ( s.dataTypes[ 0 ] === "jsonp" ||
-                       s.jsonp !== false && ( jsre.test( s.url ) ||
-                               inspectData && jsre.test( s.data ) ) ) {
-
-                       var responseContainer,
-                               jsonpCallback = s.jsonpCallback =
-                                       jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
-                               previous = window[ jsonpCallback ],
-                               url = s.url,
-                               data = s.data,
-                               replace = "$1" + jsonpCallback + "$2";
-
-                       if ( s.jsonp !== false ) {
-                               url = url.replace( jsre, replace );
-                               if ( s.url === url ) {
-                                       if ( inspectData ) {
-                                               data = data.replace( jsre, replace );
-                                       }
-                                       if ( s.data === data ) {
-                                               // Add callback manually
-                                               url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
-                                       }
-                               }
-                       }
+               // Save response for use in complete callback
+               response = arguments;
 
-                       s.url = url;
-                       s.data = data;
+               // See if a selector was specified
+               self.html( selector ?
 
-                       // Install callback
-                       window[ jsonpCallback ] = function( response ) {
-                               responseContainer = [ response ];
-                       };
+                       // Create a dummy div to hold the results
+                       jQuery("<div>")
 
-                       // Clean-up function
-                       jqXHR.always(function() {
-                               // Set callback back to previous value
-                               window[ jsonpCallback ] = previous;
-                               // Call if it was a function and we have a response
-                               if ( responseContainer && jQuery.isFunction( previous ) ) {
-                                       window[ jsonpCallback ]( responseContainer[ 0 ] );
-                               }
-                       });
+                               // inject the contents of the document in, removing the scripts
+                               // to avoid any 'Permission Denied' errors in IE
+                               .append( responseText.replace( rscript, "" ) )
 
-                       // Use data converter to retrieve json after script execution
-                       s.converters["script json"] = function() {
-                               if ( !responseContainer ) {
-                                       jQuery.error( jsonpCallback + " was not called" );
-                               }
-                               return responseContainer[ 0 ];
-                       };
+                               // Locate the specified elements
+                               .find( selector ) :
 
-                       // force json dataType
-                       s.dataTypes[ 0 ] = "json";
+                       // If not, just inject the full result
+                       responseText );
 
-                       // Delegate to script
-                       return "script";
-               }
        });
 
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.on( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
 
+jQuery.extend({
 
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
 
-// Install script dataType
-       jQuery.ajaxSetup({
                accepts: {
-                       script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
                },
+
                contents: {
-                       script: /javascript|ecmascript/
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
                },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
                converters: {
-                       "text script": function( text ) {
-                               jQuery.globalEval( text );
-                               return text;
-                       }
-               }
-       });
 
-// Handle cache's special case and global
-       jQuery.ajaxPrefilter( "script", function( s ) {
-               if ( s.cache === undefined ) {
-                       s.cache = false;
-               }
-               if ( s.crossDomain ) {
-                       s.type = "GET";
-                       s.global = false;
-               }
-       });
+                       // Convert anything to text
+                       "* text": window.String,
 
-// Bind script tag hack transport
-       jQuery.ajaxTransport( "script", function(s) {
+                       // Text to html (true = no transformation)
+                       "text html": true,
 
-               // This transport only deals with cross domain requests
-               if ( s.crossDomain ) {
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
 
-                       var script,
-                               head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
 
-                       return {
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
 
-                               send: function( _, callback ) {
+       // Main method
+       ajax: function( url, options ) {
 
-                                       script = document.createElement( "script" );
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // ifModified key
+                       ifModifiedKey,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
 
-                                       script.async = "async";
+                               readyState: 0,
 
-                                       if ( s.scriptCharset ) {
-                                               script.charset = s.scriptCharset;
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
                                        }
+                                       return this;
+                               },
 
-                                       script.src = s.url;
-
-                                       // Attach handlers for all browsers
-                                       script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-                                               if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-                                                       // Handle memory leak in IE
-                                                       script.onload = script.onreadystatechange = null;
-
-                                                       // Remove the script
-                                                       if ( head && script.parentNode ) {
-                                                               head.removeChild( script );
-                                                       }
-
-                                                       // Dereference the script
-                                                       script = undefined;
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
 
-                                                       // Callback if not abort
-                                                       if ( !isAbort ) {
-                                                               callback( 200, "success" );
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
-                                       };
-                                       // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-                                       // This arises when a base node is used (#2709 and #4378).
-                                       head.insertBefore( script, head.firstChild );
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
                                },
 
-                               abort: function() {
-                                       if ( script ) {
-                                               script.onload( 0, 1 );
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
                                        }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
                                }
                        };
-               }
-       });
 
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
 
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
 
+                       // State is "done" now
+                       state = 2;
 
-       var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-               xhrOnUnloadAbort = window.ActiveXObject ? function() {
-                       // Abort all pending requests
-                       for ( var key in xhrCallbacks ) {
-                               xhrCallbacks[ key ]( 0, 1 );
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
                        }
-               } : false,
-               xhrId = 0,
-               xhrCallbacks;
 
-// Functions to create xhrs
-       function createStandardXHR() {
-               try {
-                       return new window.XMLHttpRequest();
-               } catch( e ) {}
-       }
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
 
-       function createActiveXHR() {
-               try {
-                       return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-               } catch( e ) {}
-       }
+                       // Cache response headers
+                       responseHeadersString = headers || "";
 
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-       jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-               /* Microsoft failed to properly
-                * implement the XMLHttpRequest in IE7 (can't request local files),
-                * so we use the ActiveXObject when it is available
-                * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-                * we need a fallback.
-                */
-               function() {
-                       return !this.isLocal && createStandardXHR() || createActiveXHR();
-               } :
-               // For all other browsers, use the standard XMLHttpRequest object
-               createStandardXHR;
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
 
-// Determine support properties
-       (function( xhr ) {
-               jQuery.extend( jQuery.support, {
-                       ajax: !!xhr,
-                       cors: !!xhr && ( "withCredentials" in xhr )
-               });
-       })( jQuery.ajaxSettings.xhr() );
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
 
-// Create transport if the browser can provide an xhr
-       if ( jQuery.support.ajax ) {
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
 
-               jQuery.ajaxTransport(function( s ) {
-                       // Cross domain only allowed if supported through XMLHttpRequest
-                       if ( !s.crossDomain || jQuery.support.cors ) {
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
 
-                               var callback;
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("Etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ ifModifiedKey ] = modified;
+                                       }
+                               }
 
-                               return {
-                                       send: function( headers, complete ) {
+                               // If not modified
+                               if ( status === 304 ) {
 
-                                               // Get a new xhr
-                                               var xhr = s.xhr(),
-                                                       handle,
-                                                       i;
+                                       statusText = "notmodified";
+                                       isSuccess = true;
 
-                                               // Open the socket
-                                               // Passing null username, generates a login popup on Opera (#2865)
-                                               if ( s.username ) {
-                                                       xhr.open( s.type, s.url, s.async, s.username, s.password );
-                                               } else {
-                                                       xhr.open( s.type, s.url, s.async );
-                                               }
+                               // If we have data
+                               } else {
 
-                                               // Apply custom fields if provided
-                                               if ( s.xhrFields ) {
-                                                       for ( i in s.xhrFields ) {
-                                                               xhr[ i ] = s.xhrFields[ i ];
-                                                       }
-                                               }
+                                       isSuccess = ajaxConvert( s, response );
+                                       statusText = isSuccess.state;
+                                       success = isSuccess.data;
+                                       error = isSuccess.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
 
-                                               // Override mime type if needed
-                                               if ( s.mimeType && xhr.overrideMimeType ) {
-                                                       xhr.overrideMimeType( s.mimeType );
-                                               }
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
 
-                                               // X-Requested-With header
-                                               // For cross-domain requests, seeing as conditions for a preflight are
-                                               // akin to a jigsaw puzzle, we simply never set it to be sure.
-                                               // (it can always be set on a per-request basis or even using ajaxSetup)
-                                               // For same-domain requests, won't change header if already provided.
-                                               if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                                       headers[ "X-Requested-With" ] = "XMLHttpRequest";
-                                               }
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
 
-                                               // Need an extra try/catch for cross domain requests in Firefox 3
-                                               try {
-                                                       for ( i in headers ) {
-                                                               xhr.setRequestHeader( i, headers[ i ] );
-                                                       }
-                                               } catch( _ ) {}
-
-                                               // Do send the request
-                                               // This may raise an exception which is actually
-                                               // handled in jQuery.ajax (so no try/catch here)
-                                               xhr.send( ( s.hasContent && s.data ) || null );
-
-                                               // Listener
-                                               callback = function( _, isAbort ) {
-
-                                                       var status,
-                                                               statusText,
-                                                               responseHeaders,
-                                                               responses,
-                                                               xml;
-
-                                                       // Firefox throws exceptions when accessing properties
-                                                       // of an xhr when a network error occured
-                                                       // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-                                                       try {
-
-                                                               // Was never called and is aborted or complete
-                                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-                                                                       // Only called once
-                                                                       callback = undefined;
-
-                                                                       // Do not keep as active anymore
-                                                                       if ( handle ) {
-                                                                               xhr.onreadystatechange = jQuery.noop;
-                                                                               if ( xhrOnUnloadAbort ) {
-                                                                                       delete xhrCallbacks[ handle ];
-                                                                               }
-                                                                       }
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
 
-                                                                       // If it's an abort
-                                                                       if ( isAbort ) {
-                                                                               // Abort it manually if needed
-                                                                               if ( xhr.readyState !== 4 ) {
-                                                                                       xhr.abort();
-                                                                               }
-                                                                       } else {
-                                                                               status = xhr.status;
-                                                                               responseHeaders = xhr.getAllResponseHeaders();
-                                                                               responses = {};
-                                                                               xml = xhr.responseXML;
-
-                                                                               // Construct response list
-                                                                               if ( xml && xml.documentElement /* #4958 */ ) {
-                                                                                       responses.xml = xml;
-                                                                               }
-
-                                                                               // When requesting binary data, IE6-9 will throw an exception
-                                                                               // on any attempt to access responseText (#11426)
-                                                                               try {
-                                                                                       responses.text = xhr.responseText;
-                                                                               } catch( _ ) {
-                                                                               }
-
-                                                                               // Firefox throws an exception when accessing
-                                                                               // statusText for faulty cross-domain requests
-                                                                               try {
-                                                                                       statusText = xhr.statusText;
-                                                                               } catch( e ) {
-                                                                                       // We normalize with Webkit giving an empty statusText
-                                                                                       statusText = "";
-                                                                               }
-
-                                                                               // Filter status for non standard behaviors
-
-                                                                               // If the request is local and we have data: assume a success
-                                                                               // (success with no data won't get notified, that's the best we
-                                                                               // can do given current implementations)
-                                                                               if ( !status && s.isLocal && !s.crossDomain ) {
-                                                                                       status = responses.text ? 200 : 404;
-                                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
-                                                                               } else if ( status === 1223 ) {
-                                                                                       status = 204;
-                                                                               }
-                                                                       }
-                                                               }
-                                                       } catch( firefoxAccessException ) {
-                                                               if ( !isAbort ) {
-                                                                       complete( -1, firefoxAccessException );
-                                                               }
-                                                       }
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
 
-                                                       // Call complete if needed
-                                                       if ( responses ) {
-                                                               complete( status, statusText, responses, responseHeaders );
-                                                       }
-                                               };
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
-                                               // if we're in sync mode or it's in cache
-                                               // and has been retrieved directly (IE6 & IE7)
-                                               // we need to manually fire the callback
-                                               if ( !s.async || xhr.readyState === 4 ) {
-                                                       callback();
-                                               } else {
-                                                       handle = ++xhrId;
-                                                       if ( xhrOnUnloadAbort ) {
-                                                               // Create the active xhrs callbacks list if needed
-                                                               // and attach the unload handler
-                                                               if ( !xhrCallbacks ) {
-                                                                       xhrCallbacks = {};
-                                                                       jQuery( window ).unload( xhrOnUnloadAbort );
-                                                               }
-                                                               // Add to list of active xhrs callbacks
-                                                               xhrCallbacks[ handle ] = callback;
-                                                       }
-                                                       xhr.onreadystatechange = callback;
-                                               }
-                                       },
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
 
-                                       abort: function() {
-                                               if ( callback ) {
-                                                       callback(0,1);
-                                               }
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
                                        }
-                               };
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.always( tmp );
+                               }
                        }
-               });
-       }
+                       return this;
+               };
 
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+               // Determine if a cross-domain request is in order
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                       );
+               }
 
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
 
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
-       var elemdisplay = {},
-               iframe, iframeDoc,
-               rfxtypes = /^(?:toggle|show|hide)$/,
-               rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
-               timerId,
-               fxAttrs = [
-                       // height animations
-                       [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-                       // width animations
-                       [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-                       // opacity animations
-                       [ "opacity" ]
-               ],
-               fxNow;
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
 
-       jQuery.fn.extend({
-               show: function( speed, easing, callback ) {
-                       var elem, display;
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
 
-                       if ( speed || speed === 0 ) {
-                               return this.animate( genFx("show", 3), speed, easing, callback );
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
 
-                       } else {
-                               for ( var i = 0, j = this.length; i < j; i++ ) {
-                                       elem = this[ i ];
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
 
-                                       if ( elem.style ) {
-                                               display = elem.style.display;
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
 
-                                               // Reset the inline display of this element to learn if it is
-                                               // being hidden by cascaded rules or not
-                                               if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
-                                                       display = elem.style.display = "";
-                                               }
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
 
-                                               // Set elements which have been overridden with display: none
-                                               // in a stylesheet to whatever the default browser style is
-                                               // for such an element
-                                               if ( (display === "" && jQuery.css(elem, "display") === "none") ||
-                                                       !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-                                                       jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
-                                               }
-                                       }
-                               }
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
 
-                               // Set the display of most of the elements in a second loop
-                               // to avoid the constant reflow
-                               for ( i = 0; i < j; i++ ) {
-                                       elem = this[ i ];
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
 
-                                       if ( elem.style ) {
-                                               display = elem.style.display;
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
 
-                                               if ( display === "" || display === "none" ) {
-                                                       elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
-                                               }
-                                       }
-                               }
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
 
-                               return this;
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
                        }
-               },
-
-               hide: function( speed, easing, callback ) {
-                       if ( speed || speed === 0 ) {
-                               return this.animate( genFx("hide", 3), speed, easing, callback);
+               }
 
-                       } else {
-                               var elem, display,
-                                       i = 0,
-                                       j = this.length;
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
 
-                               for ( ; i < j; i++ ) {
-                                       elem = this[i];
-                                       if ( elem.style ) {
-                                               display = jQuery.css( elem, "display" );
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
 
-                                               if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
-                                                       jQuery._data( elem, "olddisplay", display );
-                                               }
-                                       }
-                               }
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
 
-                               // Set the display of the elements in a second loop
-                               // to avoid the constant reflow
-                               for ( i = 0; i < j; i++ ) {
-                                       if ( this[i].style ) {
-                                               this[i].style.display = "none";
-                                       }
-                               }
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already and return
+                               return jqXHR.abort();
 
-                               return this;
-                       }
-               },
+               }
 
-               // Save the old toggle function
-               _toggle: jQuery.fn.toggle,
+               // aborting is no longer a cancellation
+               strAbort = "abort";
 
-               toggle: function( fn, fn2, callback ) {
-                       var bool = typeof fn === "boolean";
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
 
-                       if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
-                               this._toggle.apply( this, arguments );
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 
-                       } else if ( fn == null || bool ) {
-                               this.each(function() {
-                                       var state = bool ? fn : jQuery(this).is(":hidden");
-                                       jQuery(this)[ state ? "show" : "hide" ]();
-                               });
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
 
-                       } else {
-                               this.animate(genFx("toggle", 3), fn, fn2, callback);
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
                        }
+               }
 
-                       return this;
-               },
+               return jqXHR;
+       },
 
-               fadeTo: function( speed, to, easing, callback ) {
-                       return this.filter(":hidden").css("opacity", 0).show().end()
-                               .animate({opacity: to}, speed, easing, callback);
-               },
+       // Counter for holding the number of active queries
+       active: 0,
 
-               animate: function( prop, speed, easing, callback ) {
-                       var optall = jQuery.speed( speed, easing, callback );
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
 
-                       if ( jQuery.isEmptyObject( prop ) ) {
-                               return this.each( optall.complete, [ false ] );
-                       }
+});
 
-                       // Do not change referenced properties as per-property easing will be lost
-                       prop = jQuery.extend( {}, prop );
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
 
-                       function doAnimation() {
-                               // XXX 'this' does not always have a nodeName when running the
-                               // test suite
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields;
 
-                               if ( optall.queue === false ) {
-                                       jQuery._mark( this );
-                               }
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
 
-                               var opt = jQuery.extend( {}, optall ),
-                                       isElement = this.nodeType === 1,
-                                       hidden = isElement && jQuery(this).is(":hidden"),
-                                       name, val, p, e, hooks, replace,
-                                       parts, start, end, unit,
-                                       method;
-
-                               // will store per property easing and be used to determine when an animation is complete
-                               opt.animatedProperties = {};
-
-                               // first pass over propertys to expand / normalize
-                               for ( p in prop ) {
-                                       name = jQuery.camelCase( p );
-                                       if ( p !== name ) {
-                                               prop[ name ] = prop[ p ];
-                                               delete prop[ p ];
-                                       }
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
 
-                                       if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
-                                               replace = hooks.expand( prop[ name ] );
-                                               delete prop[ name ];
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
 
-                                               // not quite $.extend, this wont overwrite keys already present.
-                                               // also - reusing 'p' from above because we have the correct "name"
-                                               for ( p in replace ) {
-                                                       if ( ! ( p in prop ) ) {
-                                                               prop[ p ] = replace[ p ];
-                                                       }
-                                               }
-                                       }
-                               }
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
 
-                               for ( name in prop ) {
-                                       val = prop[ name ];
-                                       // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
-                                       if ( jQuery.isArray( val ) ) {
-                                               opt.animatedProperties[ name ] = val[ 1 ];
-                                               val = prop[ name ] = val[ 0 ];
-                                       } else {
-                                               opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
-                                       }
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
 
-                                       if ( val === "hide" && hidden || val === "show" && !hidden ) {
-                                               return opt.complete.call( this );
-                                       }
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       var conv, conv2, current, tmp,
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice(),
+               prev = dataTypes[ 0 ],
+               converters = {},
+               i = 0;
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
 
-                                       if ( isElement && ( name === "height" || name === "width" ) ) {
-                                               // Make sure that nothing sneaks out
-                                               // Record all 3 overflow attributes because IE does not
-                                               // change the overflow attribute when overflowX and
-                                               // overflowY are set to the same value
-                                               opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+       // Convert to each sequential dataType, tolerating list modification
+       for ( ; (current = dataTypes[++i]); ) {
 
-                                               // Set display property to inline-block for height/width
-                                               // animations on inline elements that are having width/height animated
-                                               if ( jQuery.css( this, "display" ) === "inline" &&
-                                                       jQuery.css( this, "float" ) === "none" ) {
+               // There's only work to do if current dataType is non-auto
+               if ( current !== "*" ) {
 
-                                                       // inline-level elements accept inline-block;
-                                                       // block-level elements need to be inline with layout
-                                                       if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
-                                                               this.style.display = "inline-block";
+                       // Convert response if prev dataType is non-auto and differs from current
+                       if ( prev !== "*" && prev !== current ) {
 
-                                                       } else {
-                                                               this.style.zoom = 1;
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split(" ");
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.splice( i--, 0, current );
+                                                               }
+
+                                                               break;
                                                        }
                                                }
                                        }
                                }
 
-                               if ( opt.overflow != null ) {
-                                       this.style.overflow = "hidden";
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s["throws"] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
                                }
+                       }
 
-                               for ( p in prop ) {
-                                       e = new jQuery.fx( this, opt, p );
-                                       val = prop[ p ];
+                       // Update prev for next iteration
+                       prev = current;
+               }
+       }
 
-                                       if ( rfxtypes.test( val ) ) {
+       return { state: "success", data: response };
+}
+var oldCallbacks = [],
+       rquestion = /\?/,
+       rjsonp = /(=)\?(?=&|$)|\?\?/,
+       nonce = jQuery.now();
 
-                                               // Tracks whether to show or hide based on private
-                                               // data attached to the element
-                                               method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
-                                               if ( method ) {
-                                                       jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
-                                                       e[ method ]();
-                                               } else {
-                                                       e[ val ]();
-                                               }
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
 
-                                       } else {
-                                               parts = rfxnum.exec( val );
-                                               start = e.cur();
-
-                                               if ( parts ) {
-                                                       end = parseFloat( parts[2] );
-                                                       unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
-                                                       // We need to compute starting value
-                                                       if ( unit !== "px" ) {
-                                                               jQuery.style( this, p, (end || 1) + unit);
-                                                               start = ( (end || 1) / e.cur() ) * start;
-                                                               jQuery.style( this, p, start + unit);
-                                                       }
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               data = s.data,
+               url = s.url,
+               hasCallback = s.jsonp !== false,
+               replaceInUrl = hasCallback && rjsonp.test( url ),
+               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+                       rjsonp.test( data );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+               overwritten = window[ callbackName ];
+
+               // Insert callback into url or form data
+               if ( replaceInUrl ) {
+                       s.url = url.replace( rjsonp, "$1" + callbackName );
+               } else if ( replaceInData ) {
+                       s.data = data.replace( rjsonp, "$1" + callbackName );
+               } else if ( hasCallback ) {
+                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
 
-                                                       // If a +=/-= token was provided, we're doing a relative animation
-                                                       if ( parts[1] ) {
-                                                               end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
-                                                       }
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
 
-                                                       e.custom( start, end, unit );
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
 
-                                               } else {
-                                                       e.custom( start, val, "" );
-                                               }
-                                       }
-                               }
+               // Install callback
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
 
-                               // For JS strict compliance
-                               return true;
-                       }
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
 
-                       return optall.queue === false ?
-                               this.each( doAnimation ) :
-                               this.queue( optall.queue, doAnimation );
-               },
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
 
-               stop: function( type, clearQueue, gotoEnd ) {
-                       if ( typeof type !== "string" ) {
-                               gotoEnd = clearQueue;
-                               clearQueue = type;
-                               type = undefined;
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
                        }
-                       if ( clearQueue && type !== false ) {
-                               this.queue( type || "fx", [] );
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
                        }
 
-                       return this.each(function() {
-                               var index,
-                                       hadTimers = false,
-                                       timers = jQuery.timers,
-                                       data = jQuery._data( this );
-
-                               // clear marker counters if we know they won't be
-                               if ( !gotoEnd ) {
-                                       jQuery._unmark( true, this );
-                               }
+                       responseContainer = overwritten = undefined;
+               });
 
-                               function stopQueue( elem, data, index ) {
-                                       var hooks = data[ index ];
-                                       jQuery.removeData( elem, index, true );
-                                       hooks.stop( gotoEnd );
-                               }
+               // Delegate to script
+               return "script";
+       }
+});
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
 
-                               if ( type == null ) {
-                                       for ( index in data ) {
-                                               if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
-                                                       stopQueue( this, data, index );
-                                               }
-                                       }
-                               } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
-                                       stopQueue( this, data, index );
-                               }
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
 
-                               for ( index = timers.length; index--; ) {
-                                       if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                               if ( gotoEnd ) {
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
 
-                                                       // force the next step to be the last
-                                                       timers[ index ]( true );
-                                               } else {
-                                                       timers[ index ].saveState();
-                                               }
-                                               hadTimers = true;
-                                               timers.splice( index, 1 );
-                                       }
-                               }
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
 
-                               // start the next in the queue if the last step wasn't forced
-                               // timers currently will call their complete callbacks, which will dequeue
-                               // but only if they were gotoEnd
-                               if ( !( gotoEnd && hadTimers ) ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
-               }
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
 
-       });
+               return {
 
-// Animations created synchronously will run synchronously
-       function createFxNow() {
-               setTimeout( clearFxNow, 0 );
-               return ( fxNow = jQuery.now() );
-       }
+                       send: function( _, callback ) {
 
-       function clearFxNow() {
-               fxNow = undefined;
-       }
+                               script = document.createElement( "script" );
 
-// Generate parameters to create a standard animation
-       function genFx( type, num ) {
-               var obj = {};
+                               script.async = "async";
 
-               jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
-                       obj[ this ] = type;
-               });
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
 
-               return obj;
-       }
+                               script.src = s.url;
 
-// Generate shortcuts for custom animations
-       jQuery.each({
-               slideDown: genFx( "show", 1 ),
-               slideUp: genFx( "hide", 1 ),
-               slideToggle: genFx( "toggle", 1 ),
-               fadeIn: { opacity: "show" },
-               fadeOut: { opacity: "hide" },
-               fadeToggle: { opacity: "toggle" }
-       }, function( name, props ) {
-               jQuery.fn[ name ] = function( speed, easing, callback ) {
-                       return this.animate( props, speed, easing, callback );
-               };
-       });
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
 
-       jQuery.extend({
-               speed: function( speed, easing, fn ) {
-                       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-                               complete: fn || !fn && easing ||
-                                       jQuery.isFunction( speed ) && speed,
-                               duration: speed,
-                               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-                       };
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
-                       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-                               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
 
-                       // normalize opt.queue - true/undefined/null -> "fx"
-                       if ( opt.queue == null || opt.queue === true ) {
-                               opt.queue = "fx";
-                       }
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
 
-                       // Queueing
-                       opt.old = opt.complete;
+                                               // Dereference the script
+                                               script = undefined;
 
-                       opt.complete = function( noUnmark ) {
-                               if ( jQuery.isFunction( opt.old ) ) {
-                                       opt.old.call( this );
-                               }
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
 
-                               if ( opt.queue ) {
-                                       jQuery.dequeue( this, opt.queue );
-                               } else if ( noUnmark !== false ) {
-                                       jQuery._unmark( this );
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
                                }
-                       };
+                       }
+               };
+       }
+});
+var xhrCallbacks,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0;
 
-                       return opt;
-               },
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
 
-               easing: {
-                       linear: function( p ) {
-                               return p;
-                       },
-                       swing: function( p ) {
-                               return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
-                       }
-               },
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
 
-               timers: [],
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
 
-               fx: function( elem, options, prop ) {
-                       this.options = options;
-                       this.elem = elem;
-                       this.prop = prop;
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
 
-                       options.orig = options.orig || {};
-               }
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
 
-       });
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
 
-       jQuery.fx.prototype = {
-               // Simple function for setting a style value
-               update: function() {
-                       if ( this.options.step ) {
-                               this.options.step.call( this.elem, this.now, this );
-                       }
+                       var callback;
 
-                       ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
-               },
+                       return {
+                               send: function( headers, complete ) {
 
-               // Get the current size
-               cur: function() {
-                       if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
-                               return this.elem[ this.prop ];
-                       }
+                                       // Get a new xhr
+                                       var handle, i,
+                                               xhr = s.xhr();
 
-                       var parsed,
-                               r = jQuery.css( this.elem, this.prop );
-                       // Empty strings, null, undefined and "auto" are converted to 0,
-                       // complex values such as "rotate(1rad)" are returned as is,
-                       // simple values such as "10px" are parsed to Float.
-                       return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
-               },
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
 
-               // Start an animation from one number to another
-               custom: function( from, to, unit ) {
-                       var self = this,
-                               fx = jQuery.fx;
-
-                       this.startTime = fxNow || createFxNow();
-                       this.end = to;
-                       this.now = this.start = from;
-                       this.pos = this.state = 0;
-                       this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
-                       function t( gotoEnd ) {
-                               return self.step( gotoEnd );
-                       }
-
-                       t.queue = this.options.queue;
-                       t.elem = this.elem;
-                       t.saveState = function() {
-                               if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
-                                       if ( self.options.hide ) {
-                                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
-                                       } else if ( self.options.show ) {
-                                               jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
                                        }
-                               }
-                       };
 
-                       if ( t() && jQuery.timers.push(t) && !timerId ) {
-                               timerId = setInterval( fx.tick, fx.interval );
-                       }
-               },
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
 
-               // Simple 'show' function
-               show: function() {
-                       var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
 
-                       // Remember where we started, so that we can go back to it later
-                       this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
-                       this.options.show = true;
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
 
-                       // Begin the animation
-                       // Make sure that we start at a small width/height to avoid any flash of content
-                       if ( dataShow !== undefined ) {
-                               // This show is picking up where a previous hide or show left off
-                               this.custom( this.cur(), dataShow );
-                       } else {
-                               this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
-                       }
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
 
-                       // Start by showing the element
-                       jQuery( this.elem ).show();
-               },
+                                       // Listener
+                                       callback = function( _, isAbort ) {
 
-               // Simple 'hide' function
-               hide: function() {
-                       // Remember where we started, so that we can go back to it later
-                       this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
-                       this.options.hide = true;
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
 
-                       // Begin the animation
-                       this.custom( this.cur(), 0 );
-               },
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occurred
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
 
-               // Each step of an animation
-               step: function( gotoEnd ) {
-                       var p, n, complete,
-                               t = fxNow || createFxNow(),
-                               done = true,
-                               elem = this.elem,
-                               options = this.options;
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
 
-                       if ( gotoEnd || t >= options.duration + this.startTime ) {
-                               this.now = this.end;
-                               this.pos = this.state = 1;
-                               this.update();
+                                                               // Only called once
+                                                               callback = undefined;
 
-                               options.animatedProperties[ this.prop ] = true;
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
 
-                               for ( p in options.animatedProperties ) {
-                                       if ( options.animatedProperties[ p ] !== true ) {
-                                               done = false;
-                                       }
-                               }
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
 
-                               if ( done ) {
-                                       // Reset the overflow
-                                       if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       try {
+                                                                               responses.text = xhr.responseText;
+                                                                       } catch( _ ) {
+                                                                       }
 
-                                               jQuery.each( [ "", "X", "Y" ], function( index, value ) {
-                                                       elem.style[ "overflow" + value ] = options.overflow[ index ];
-                                               });
-                                       }
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
 
-                                       // Hide the element if the "hide" operation was done
-                                       if ( options.hide ) {
-                                               jQuery( elem ).hide();
-                                       }
+                                                                       // Filter status for non standard behaviors
 
-                                       // Reset the properties, if the item has been hidden or shown
-                                       if ( options.hide || options.show ) {
-                                               for ( p in options.animatedProperties ) {
-                                                       jQuery.style( elem, p, options.orig[ p ] );
-                                                       jQuery.removeData( elem, "fxshow" + p, true );
-                                                       // Toggle data is no longer needed
-                                                       jQuery.removeData( elem, "toggle" + p, true );
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
                                                }
-                                       }
 
-                                       // Execute the complete function
-                                       // in the event that the complete function throws an exception
-                                       // we must ensure it won't be called twice. #5684
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
 
-                                       complete = options.complete;
-                                       if ( complete ) {
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
+                                               callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback, 0 );
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
 
-                                               options.complete = false;
-                                               complete.call( elem );
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
                                        }
                                }
+                       };
+               }
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var end, unit, prevScale,
+                               tween = this.createTween( prop, value ),
+                               parts = rfxnum.exec( value ),
+                               target = tween.cur(),
+                               start = +target || 0,
+                               scale = 1;
+
+                       if ( parts ) {
+                               end = +parts[2];
+                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+                               // We need to compute starting value
+                               if ( unit !== "px" && start ) {
+                                       // Iteratively approximate from a nonzero starting point
+                                       // Prefer the current property, because this process will be trivial if it uses the same units
+                                       // Fallback to end or a simple constant
+                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+                                       do {
+                                               // If previous iteration zeroed out, double until we get *something*
+                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                               prevScale = scale = scale || ".5";
+
+                                               // Adjust and apply
+                                               start = start / scale;
+                                               jQuery.style( tween.elem, prop, start + unit );
+
+                                               // Update scale, tolerating zeroes from tween.cur()
+                                               scale = tween.cur() / target;
+
+                                       // Stop looping if we've hit the mark or scale is unchanged
+                                       } while ( scale !== 1 && scale !== prevScale );
+                               }
+
+                               tween.unit = unit;
+                               tween.start = start;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+                       }
+                       return tween;
+               }]
+       };
 
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       }, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+       jQuery.each( props, function( prop, value ) {
+               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+                       index = 0,
+                       length = collection.length;
+               for ( ; index < length; index++ ) {
+                       if ( collection[ index ].call( animation, prop, value ) ) {
+
+                               // we're done with this property
+                               return;
+                       }
+               }
+       });
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               index = 0,
+               tweenerIndex = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               percent = 1 - ( remaining / animation.duration || 0 ),
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
                                return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end, easing ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
 
-                       } else {
-                               // classical easing cannot be used with an Infinity duration
-                               if ( options.duration == Infinity ) {
-                                       this.now = t;
-                               } else {
-                                       n = t - this.startTime;
-                                       this.state = n / options.duration;
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
 
-                                       // Perform the easing function, defaults to swing
-                                       this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
-                                       this.now = this.start + ( (this.end - this.start) * this.pos );
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
                                }
-                               // Perform the next step of the animation
-                               this.update();
+                               return this;
                        }
+               }),
+               props = animation.props;
 
-                       return true;
-               }
-       };
-
-       jQuery.extend( jQuery.fx, {
-               tick: function() {
-                       var timer,
-                               timers = jQuery.timers,
-                               i = 0;
+       propFilter( props, animation.opts.specialEasing );
 
-                       for ( ; i < timers.length; i++ ) {
-                               timer = timers[ i ];
-                               // Checks the timer has not already been removed
-                               if ( !timer() && timers[ i ] === timer ) {
-                                       timers.splice( i--, 1 );
-                               }
-                       }
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
 
-                       if ( !timers.length ) {
-                               jQuery.fx.stop();
-                       }
-               },
+       createTweens( animation, props );
 
-               interval: 13,
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
 
-               stop: function() {
-                       clearInterval( timerId );
-                       timerId = null;
-               },
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       anim: animation,
+                       queue: animation.opts.queue,
+                       elem: elem
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
 
-               speeds: {
-                       slow: 600,
-                       fast: 200,
-                       // Default speed
-                       _default: 400
-               },
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
 
-               step: {
-                       opacity: function( fx ) {
-                               jQuery.style( fx.elem, "opacity", fx.now );
-                       },
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
 
-                       _default: function( fx ) {
-                               if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-                                       fx.elem.style[ fx.prop ] = fx.now + fx.unit;
-                               } else {
-                                       fx.elem[ fx.prop ] = fx.now;
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
                                }
                        }
+               } else {
+                       specialEasing[ name ] = easing;
                }
-       });
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
 
-// Ensure props that can't be negative don't go there on undershoot easing
-       jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
-               // exclude marginTop, marginLeft, marginBottom and marginRight from this list
-               if ( prop.indexOf( "margin" ) ) {
-                       jQuery.fx.step[ prop ] = function( fx ) {
-                               jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       var index, prop, value, length, dataShow, tween, hooks, oldfire,
+               anim = this,
+               style = elem.style,
+               orig = {},
+               handled = [],
+               hidden = elem.nodeType && isHidden( elem );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
                        };
                }
-       });
+               hooks.unqueued++;
 
-       if ( jQuery.expr && jQuery.expr.filters ) {
-               jQuery.expr.filters.animated = function( elem ) {
-                       return jQuery.grep(jQuery.timers, function( fn ) {
-                               return elem === fn.elem;
-                       }).length;
-               };
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
        }
 
-// Try to restore the default display value of an element
-       function defaultDisplay( nodeName ) {
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
-               if ( !elemdisplay[ nodeName ] ) {
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
 
-                       var body = document.body,
-                               elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
-                               display = elem.css( "display" );
-                       elem.remove();
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
 
-                       // If the simple way fails,
-                       // get element's real default display by attaching it to a temp iframe
-                       if ( display === "none" || display === "" ) {
-                               // No iframe to use yet, so create it
-                               if ( !iframe ) {
-                                       iframe = document.createElement( "iframe" );
-                                       iframe.frameBorder = iframe.width = iframe.height = 0;
-                               }
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
 
-                               body.appendChild( iframe );
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.done(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
 
-                               // Create a cacheable copy of the iframe document on first call.
-                               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-                               // document to it; WebKit & Firefox won't allow reusing the iframe document.
-                               if ( !iframeDoc || !iframe.createElement ) {
-                                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                                       iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
-                                       iframeDoc.close();
-                               }
 
-                               elem = iframeDoc.createElement( nodeName );
+       // show/hide pass
+       for ( index in props ) {
+               value = props[ index ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ index ];
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
+                       }
+                       handled.push( index );
+               }
+       }
 
-                               iframeDoc.body.appendChild( elem );
+       length = handled.length;
+       if ( length ) {
+               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery.removeData( elem, "fxshow", true );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( index = 0 ; index < length ; index++ ) {
+                       prop = handled[ index ];
+                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
 
-                               display = jQuery.css( elem, "display" );
-                               body.removeChild( iframe );
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
                        }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
 
-                       // Store the correct default display
-                       elemdisplay[ nodeName ] = display;
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
                }
 
-               return elemdisplay[ nodeName ];
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
        }
+};
 
+Tween.prototype.init.prototype = Tween.prototype;
 
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
 
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
 
-       var getOffset,
-               rtable = /^t(?:able|d|h)$/i,
-               rroot = /^(?:body|html)$/i;
+                       // passing any value as a 4th parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, false, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
 
-       if ( "getBoundingClientRect" in document.documentElement ) {
-               getOffset = function( elem, doc, docElem, box ) {
-                       try {
-                               box = elem.getBoundingClientRect();
-                       } catch(e) {}
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
 
-                       // Make sure we're not dealing with a disconnected DOM node
-                       if ( !box || !jQuery.contains( docElem, elem ) ) {
-                               return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
-                       }
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ||
+                       // special check for .toggle( handler, handler, ... )
+                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
 
-                       var body = doc.body,
-                               win = getWindow( doc ),
-                               clientTop  = docElem.clientTop  || body.clientTop  || 0,
-                               clientLeft = docElem.clientLeft || body.clientLeft || 0,
-                               scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
-                               scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
-                               top  = box.top  + scrollTop  - clientTop,
-                               left = box.left + scrollLeft - clientLeft;
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
 
-                       return { top: top, left: left };
-               };
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-       } else {
-               getOffset = function( elem, doc, docElem ) {
-                       var computedStyle,
-                               offsetParent = elem.offsetParent,
-                               prevOffsetParent = elem,
-                               body = doc.body,
-                               defaultView = doc.defaultView,
-                               prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-                               top = elem.offsetTop,
-                               left = elem.offsetLeft;
-
-                       while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-                               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                                       break;
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations resolve immediately
+                               if ( empty ) {
+                                       anim.stop( true );
                                }
+                       };
 
-                               computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
-                               top  -= elem.scrollTop;
-                               left -= elem.scrollLeft;
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
 
-                               if ( elem === offsetParent ) {
-                                       top  += elem.offsetTop;
-                                       left += elem.offsetLeft;
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
 
-                                       if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
-                                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-                                       }
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
 
-                                       prevOffsetParent = offsetParent;
-                                       offsetParent = elem.offsetParent;
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
                                }
-
-                               if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
-                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
                                }
-
-                               prevComputedStyle = computedStyle;
                        }
 
-                       if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
-                               top  += body.offsetTop;
-                               left += body.offsetLeft;
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
                        }
 
-                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                               top  += Math.max( docElem.scrollTop, body.scrollTop );
-                               left += Math.max( docElem.scrollLeft, body.scrollLeft );
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
                        }
+               });
+       }
+});
 
-                       return { top: top, left: left };
-               };
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        }
 
-       jQuery.fn.offset = function( options ) {
-               if ( arguments.length ) {
-                       return options === undefined ?
-                               this :
-                               this.each(function( i ) {
-                                       jQuery.offset.setOffset( this, options, i );
-                               });
-               }
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
 
-               var elem = this[0],
-                       doc = elem && elem.ownerDocument;
+       return attrs;
+}
 
-               if ( !doc ) {
-                       return null;
-               }
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-               if ( elem === doc.body ) {
-                       return jQuery.offset.bodyOffset( elem );
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
                }
 
-               return getOffset( elem, doc, doc.documentElement );
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
        };
 
-       jQuery.offset = {
+       return opt;
+};
 
-               bodyOffset: function( body ) {
-                       var top = body.offsetTop,
-                               left = body.offsetLeft;
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
 
-                       if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                               top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                               left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-                       }
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+};
 
-                       return { top: top, left: left };
-               },
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
 
-               setOffset: function( elem, options, i ) {
-                       var position = jQuery.css( elem, "position" );
+       var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
+               elem = this[ 0 ],
+               doc = elem && elem.ownerDocument;
 
-                       // set position first, in-case top/left are set even on static elem
-                       if ( position === "static" ) {
-                               elem.style.position = "relative";
-                       }
+       if ( !doc ) {
+               return;
+       }
 
-                       var curElem = jQuery( elem ),
-                               curOffset = curElem.offset(),
-                               curCSSTop = jQuery.css( elem, "top" ),
-                               curCSSLeft = jQuery.css( elem, "left" ),
-                               calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-                               props = {}, curPosition = {}, curTop, curLeft;
+       if ( (body = doc.body) === elem ) {
+               return jQuery.offset.bodyOffset( elem );
+       }
 
-                       // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-                       if ( calculatePosition ) {
-                               curPosition = curElem.position();
-                               curTop = curPosition.top;
-                               curLeft = curPosition.left;
-                       } else {
-                               curTop = parseFloat( curCSSTop ) || 0;
-                               curLeft = parseFloat( curCSSLeft ) || 0;
-                       }
+       docElem = doc.documentElement;
 
-                       if ( jQuery.isFunction( options ) ) {
-                               options = options.call( elem, i, curOffset );
-                       }
+       // Make sure we're not dealing with a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return { top: 0, left: 0 };
+       }
 
-                       if ( options.top != null ) {
-                               props.top = ( options.top - curOffset.top ) + curTop;
-                       }
-                       if ( options.left != null ) {
-                               props.left = ( options.left - curOffset.left ) + curLeft;
-                       }
+       box = elem.getBoundingClientRect();
+       win = getWindow( doc );
+       clientTop  = docElem.clientTop  || body.clientTop  || 0;
+       clientLeft = docElem.clientLeft || body.clientLeft || 0;
+       scrollTop  = win.pageYOffset || docElem.scrollTop;
+       scrollLeft = win.pageXOffset || docElem.scrollLeft;
+       top  = box.top  + scrollTop  - clientTop;
+       left = box.left + scrollLeft - clientLeft;
 
-                       if ( "using" in options ) {
-                               options.using.call( elem, props );
-                       } else {
-                               curElem.css( props );
-                       }
+       return { top: top, left: left };
+};
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
                }
-       };
 
+               return { top: top, left: left };
+       },
 
-       jQuery.fn.extend({
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
 
-               position: function() {
-                       if ( !this[0] ) {
-                               return null;
-                       }
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
 
-                       var elem = this[0],
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
 
-                       // Get *real* offsetParent
-                               offsetParent = this.offsetParent(),
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
 
-                       // Get correct offsets
-                               offset       = this.offset(),
-                               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
 
-                       // Subtract element margins
-                       // note: when an element has margin: auto the offsetLeft and marginLeft
-                       // are the same in Safari causing offset.left to incorrectly be 0
-                       offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-                       offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
 
-                       // Add offsetParent borders
-                       parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-                       parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
 
-                       // Subtract the two offsets
-                       return {
-                               top:  offset.top  - parentOffset.top,
-                               left: offset.left - parentOffset.left
-                       };
-               },
+jQuery.fn.extend({
 
-               offsetParent: function() {
-                       return this.map(function() {
-                               var offsetParent = this.offsetParent || document.body;
-                               while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-                                       offsetParent = offsetParent.offsetParent;
-                               }
-                               return offsetParent;
-                       });
+       position: function() {
+               if ( !this[0] ) {
+                       return;
                }
-       });
 
+               var elem = this[0],
 
-// Create scrollLeft and scrollTop methods
-       jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-               var top = /Y/.test( prop );
-
-               jQuery.fn[ method ] = function( val ) {
-                       return jQuery.access( this, function( elem, method, val ) {
-                               var win = getWindow( elem );
-
-                               if ( val === undefined ) {
-                                       return win ? (prop in win) ? win[ prop ] :
-                                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
-                                                       win.document.body[ method ] :
-                                               elem[ method ];
-                               }
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
 
-                               if ( win ) {
-                                       win.scrollTo(
-                                               !top ? val : jQuery( win ).scrollLeft(),
-                                               top ? val : jQuery( win ).scrollTop()
-                                       );
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
-                               } else {
-                                       elem[ method ] = val;
-                               }
-                       }, method, val, arguments.length, null );
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
                };
-       });
+       },
 
-       function getWindow( elem ) {
-               return jQuery.isWindow( elem ) ?
-                       elem :
-                       elem.nodeType === 9 ?
-                               elem.defaultView || elem.parentWindow :
-                               false;
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent || document.body;
+               });
        }
+});
 
 
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
 
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
 
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-       jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-               var clientProp = "client" + name,
-                       scrollProp = "scroll" + name,
-                       offsetProp = "offset" + name;
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       win.document.documentElement[ method ] :
+                                       elem[ method ];
+                       }
 
-               // innerHeight and innerWidth
-               jQuery.fn[ "inner" + name ] = function() {
-                       var elem = this[0];
-                       return elem ?
-                               elem.style ?
-                                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
-                                       this[ type ]() :
-                               null;
-               };
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                        top ? val : jQuery( win ).scrollTop()
+                               );
 
-               // outerHeight and outerWidth
-               jQuery.fn[ "outer" + name ] = function( margin ) {
-                       var elem = this[0];
-                       return elem ?
-                               elem.style ?
-                                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
-                                       this[ type ]() :
-                               null;
-               };
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 
-               jQuery.fn[ type ] = function( value ) {
                        return jQuery.access( this, function( elem, type, value ) {
-                               var doc, docElemProp, orig, ret;
+                               var doc;
 
                                if ( jQuery.isWindow( elem ) ) {
-                                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-                                       doc = elem.document;
-                                       docElemProp = doc.documentElement[ clientProp ];
-                                       return jQuery.support.boxModel && docElemProp ||
-                                               doc.body && doc.body[ clientProp ] || docElemProp;
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
                                }
 
                                // Get document width or height
                                if ( elem.nodeType === 9 ) {
-                                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
                                        doc = elem.documentElement;
 
-                                       // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
-                                       // so we can't use max, as it'll choose the incorrect offset[Width/Height]
-                                       // instead we use the correct client[Width/Height]
-                                       // support:IE6
-                                       if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
-                                               return doc[ clientProp ];
-                                       }
-
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
                                        return Math.max(
-                                               elem.body[ scrollProp ], doc[ scrollProp ],
-                                               elem.body[ offsetProp ], doc[ offsetProp ]
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
                                        );
                                }
 
-                               // Get width or height on the element
-                               if ( value === undefined ) {
-                                       orig = jQuery.css( elem, type );
-                                       ret = parseFloat( orig );
-                                       return jQuery.isNumeric( ret ) ? ret : orig;
-                               }
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, value, extra ) :
 
-                               // Set the width or height on the element
-                               jQuery( elem ).css( type, value );
-                       }, type, value, arguments.length, null );
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
                };
        });
-
-
-
-
+});
 // Expose jQuery to the global object
-       window.jQuery = window.$ = jQuery;
+window.jQuery = window.$ = jQuery;
 
 // Expose jQuery as an AMD module, but only for AMD loaders that
 // understand the issues with loading multiple versions of jQuery
 // file names, and jQuery is normally delivered in a lowercase file name.
 // Do this after creating the global so that if an AMD module wants to call
 // noConflict to hide this version of jQuery, it will work.
-       if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-               define( "jquery", [], function () { return jQuery; } );
-       }
-
-
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
 
 })( window );
index 33f8752..0a4d364 100644 (file)
 $.fn.makeCollapsible = function () {
 
        return this.each(function () {
-               var lpx = 'jquery.makeCollapsible> ';
 
                // Define reused variables and functions
                var $toggle,
+                       lpx = 'jquery.makeCollapsible> ',
                        $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible()
                        that = this,
                        collapsetext = $(this).attr( 'data-collapsetext' ),
@@ -230,7 +230,7 @@ $.fn.makeCollapsible = function () {
                                .parent()
                                .prepend( '&nbsp;[' )
                                .append( ']&nbsp;' )
-                               .bind( 'click.mw-collapse', function (e) {
+                               .on( 'click.mw-collapse', function ( e ) {
                                        toggleLinkDefault( this, e );
                                } );
 
@@ -252,7 +252,7 @@ $.fn.makeCollapsible = function () {
 
                        // Double check that there is actually a customtoggle link
                        if ( $customTogglers.length ) {
-                               $customTogglers.bind( 'click.mw-collapse', function ( e ) {
+                               $customTogglers.on( 'click.mw-collapse', function ( e ) {
                                        toggleLinkCustom( $(this), e, $that );
                                } );
                        } else {
@@ -279,7 +279,7 @@ $.fn.makeCollapsible = function () {
                                if ( !$toggle.length ) {
                                        $firstRowCells.eq(-1).prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -300,7 +300,7 @@ $.fn.makeCollapsible = function () {
                                        }
                                        $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -319,7 +319,7 @@ $.fn.makeCollapsible = function () {
                                if ( !$toggle.length ) {
                                        $that.prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
index aa356c4..7badb11 100644 (file)
@@ -40,7 +40,7 @@
                                // Hide on focus
                                // Also listen for other events in case $input was
                                // already focused when the events were bound
-                               .bind( 'focus drop keydown paste', function ( e ) {
+                               .on( 'focus drop keydown paste', function ( e ) {
                                        if ( $input.hasClass( 'placeholder' ) ) {
                                                if ( e.type === 'drop' && e.originalEvent.dataTransfer ) {
                                                        // Support for drag&drop. Instead of inserting the dropped
index caf9a9f..d02d432 100644 (file)
@@ -1,24 +1,30 @@
 /*
- * JavaScript to enable right click edit functionality
+ * JavaScript to enable right click edit functionality.
+ * When the user right-clicks in a heading, it will open the
+ * edit screen.
  */
-jQuery( function( $ ) {
+jQuery( function ( $ ) {
        // Select all h1-h6 elements that contain editsection links
-       $( 'h1:has(.editsection a), ' +
-               'h2:has(.editsection a), ' +
-               'h3:has(.editsection a), ' +
-               'h4:has(.editsection a), ' +
-               'h5:has(.editsection a), ' +
-               'h6:has(.editsection a)'
-       ).live( 'contextmenu', function( e ) {
-               // Get href of the [edit] link
-               var href = $(this).find( '.editsection a' ).attr( 'href' );
-               // Check if target is the anchor link itself. If so, don't suppress the context menu; this
-               // way the reader can still do things like copy URL, open in new tab etc.
-               var $target = $( e.target );
-               if ( !$target.is( 'a' ) && !$target.parent().is( '.editsection' ) ){
+       // Don't use the ":has:(.editsection a)" selector because it performs very bad.
+       // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
+       $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
+               var $edit, href;
+
+               $edit = $( this ).find( '.editsection a' );
+               if ( !$edit.length ) {
+                       return;
+               }
+
+               // Get href of the editsection link
+               href = $edit.prop( 'href' );
+
+               // Headings can contain rich text.
+               // Make sure to not block contextmenu events on (other) anchor tags
+               // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
+               // e.target can be the heading, but it can also be anything inside the heading.
+               if ( href && e.target.nodeName.toLowerCase() !== 'a' ) {
                        window.location = href;
                        e.preventDefault();
-                       return false;
                }
        } );
 } );
diff --git a/resources/mediawiki.language/languages/am.js b/resources/mediawiki.language/languages/am.js
deleted file mode 100644 (file)
index fa5d3c5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Amharic (አማርኛ) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/bat-smg.js b/resources/mediawiki.language/languages/bat-smg.js
deleted file mode 100644 (file)
index 6e3f4cc..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Samogitian (Žemaitėška) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       count = Math.abs( count );
-       if ( count === 0 || ( count % 100 === 0 || ( count % 100 >= 10 && count % 100 < 20 ) ) ) {
-               return forms[2];
-       }
-       if ( count % 10 === 1 ) {
-               return forms[0];
-       }
-       if ( count % 10 === 2 ) {
-               return forms[1];
-       }
-       return forms[3];
-};
diff --git a/resources/mediawiki.language/languages/be-tarask.js b/resources/mediawiki.language/languages/be-tarask.js
deleted file mode 100644 (file)
index c19f47d..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Belarusian in Taraskievica orthography (Беларуская (тарашкевіца)) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( forms.length === 2 ) {
-               return count == 1 ? forms[0] : forms[1];
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/be.js b/resources/mediawiki.language/languages/be.js
deleted file mode 100644 (file)
index 97ceee3..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Belarusian normative (Беларуская) language functions
- */
-
-mediaWiki.language.convertPlural = function convertPlural( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/bh.js b/resources/mediawiki.language/languages/bh.js
deleted file mode 100644 (file)
index abbf8bd..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Bihari (भोजपुरी) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
index 9affcf0..c0c77aa 100644 (file)
@@ -2,23 +2,6 @@
  * Bosnian (bosanski) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'bs', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/cs.js b/resources/mediawiki.language/languages/cs.js
deleted file mode 100644 (file)
index 04dda99..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Czech (čeština [subst.], český [adj.], česky [adv.]) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       switch ( count ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/cu.js b/resources/mediawiki.language/languages/cu.js
deleted file mode 100644 (file)
index 35a5473..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Old Church Slavonic (Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-                       return forms[1];
-               case 3:
-               case 4:
-                       return forms[2];
-               default:
-                       return forms[3];
-       }
-};
diff --git a/resources/mediawiki.language/languages/cy.js b/resources/mediawiki.language/languages/cy.js
deleted file mode 100644 (file)
index 333d956..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Welsh (Cymraeg) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 6 );
-       count = Math.abs( count );
-       if ( count >= 0 && count <= 3 ) {
-               return forms[count];
-       }
-       if ( count == 6 ) {
-               return forms[4];
-       }
-       return forms[5];
-};
index e3c5808..a42a8f7 100644 (file)
@@ -2,21 +2,6 @@
  * Lower Sorbian (Dolnoserbski) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       switch ( Math.abs( count ) % 100 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-                       return forms[1];
-               case 3:
-               case 4:
-                       return forms[2];
-               default:
-                       return forms[3];
-       }
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'dsb', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/fr.js b/resources/mediawiki.language/languages/fr.js
deleted file mode 100644 (file)
index bfb52d2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * French (Français) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
index 51fce35..a27b489 100644 (file)
@@ -2,18 +2,6 @@
  * Irish (Gaeilge) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 2 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
-
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'ga', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/gd.js b/resources/mediawiki.language/languages/gd.js
deleted file mode 100644 (file)
index 5ac2007..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Scots Gaelic (Gàidhlig) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       count = Math.abs( count );
-       if ( count === 1 ) {
-               return forms[0];
-       }
-       if ( count === 2 ) {
-               return forms[1];
-       }
-       if ( count >= 3 && count <= 10 ) {
-               return forms[2];
-       }
-       return forms[3];
-};
diff --git a/resources/mediawiki.language/languages/gv.js b/resources/mediawiki.language/languages/gv.js
deleted file mode 100644 (file)
index afc2b5d..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Manx (Gaelg) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       if ( count > 0 && ( count % 20 ) === 0 ) {
-               return forms[0];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[1];
-               case 2:
-                       return forms[2];
-               default:
-                       return forms[3];
-       }
-};
diff --git a/resources/mediawiki.language/languages/hr.js b/resources/mediawiki.language/languages/hr.js
deleted file mode 100644 (file)
index e3ce291..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Croatian (hrvatski) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
index 6aa993c..211d67b 100644 (file)
@@ -2,22 +2,6 @@
  * Upper Sorbian (Hornjoserbsce) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       switch ( Math.abs( count ) % 100 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-                       return forms[1];
-               case 3:
-               case 4:
-                       return forms[2];
-               default:
-                       return forms[3];
-       }
-};
-
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms =mw.language.getData( 'hsb', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
index b51b2b6..215e750 100644 (file)
@@ -2,11 +2,6 @@
  * Armenian (Հայերեն) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1];
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'hy', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/ksh.js b/resources/mediawiki.language/languages/ksh.js
deleted file mode 100644 (file)
index ed90732..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Ripuarian (Ripoarƒósh) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 0 ) {
-               return forms[2];
-       }
-       return forms[1];
-};
diff --git a/resources/mediawiki.language/languages/ln.js b/resources/mediawiki.language/languages/ln.js
deleted file mode 100644 (file)
index 9b9e456..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Lingala (Lingála) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/lt.js b/resources/mediawiki.language/languages/lt.js
deleted file mode 100644 (file)
index 04964af..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Lithuanian (Lietuvių) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       // if the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
-       if ( forms.length == 2 ) {
-               return count == 1 ? forms[0] : forms[1];
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count % 10 == 1 && count % 100 != 11 ) {
-               return forms[0];
-       }
-       if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) {
-               return forms[1];
-       }
-       return forms[2];
-};
diff --git a/resources/mediawiki.language/languages/lv.js b/resources/mediawiki.language/languages/lv.js
deleted file mode 100644 (file)
index d4bec44..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Latvian (Latviešu) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );        
-       return ( ( count % 10 == 1 ) && ( count % 100 != 11 ) ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/mg.js b/resources/mediawiki.language/languages/mg.js
deleted file mode 100644 (file)
index b65e96e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Malagasy (Malagasy) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/mk.js b/resources/mediawiki.language/languages/mk.js
deleted file mode 100644 (file)
index c89bbac..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Macedonian (Македонски) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( ( count % 10 === 1 ) && ( count % 100 !== 11 ) ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/mo.js b/resources/mediawiki.language/languages/mo.js
deleted file mode 100644 (file)
index 0c4b696..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Moldavian (Молдовеняскэ) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 0 || count % 100 < 20 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
diff --git a/resources/mediawiki.language/languages/mt.js b/resources/mediawiki.language/languages/mt.js
deleted file mode 100644 (file)
index 44c7bff..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Maltese (Malti) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 4 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 0 || ( count % 100 > 1 && count % 100 < 11 ) ) {
-               return forms[1];
-       }
-       if ( count % 100 > 10 && count % 100 < 20 ) {
-               return forms[2];
-       }
-       return forms[3];
-};
diff --git a/resources/mediawiki.language/languages/nso.js b/resources/mediawiki.language/languages/nso.js
deleted file mode 100644 (file)
index 30cf189..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Northern Sotho (Sesotho sa Leboa) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/pl.js b/resources/mediawiki.language/languages/pl.js
deleted file mode 100644 (file)
index 03e0d84..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Polish (polski) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       count = Math.abs( count );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       switch ( count % 10 ) {
-               case 2:
-               case 3:
-               case 4:
-                       if ( count / 10 % 10 != 1 ) {
-                               return forms[1];
-                       }
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/ro.js b/resources/mediawiki.language/languages/ro.js
deleted file mode 100644 (file)
index 42610fe..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Romanian (Română) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 0 || count % 100 < 20 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
index 42be4f9..cfdbfc3 100644 (file)
@@ -2,26 +2,6 @@
  * Russian (Русский) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( forms.length === 2 ) {
-               return count == 1 ? forms[0] : forms[1];                
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'ru', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/se.js b/resources/mediawiki.language/languages/se.js
deleted file mode 100644 (file)
index e1ae5b9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Northern Sami (Sámegiella) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( !forms || forms.length === 0 ) {
-                       return '';
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 2 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
diff --git a/resources/mediawiki.language/languages/sh.js b/resources/mediawiki.language/languages/sh.js
deleted file mode 100644 (file)
index 719b0c5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Serbo-Croatian (Srpskohrvatski / Српскохрватски) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( forms.length === 2 ) {
-               return count == 1 ? forms[0] : forms[1];
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/sk.js b/resources/mediawiki.language/languages/sk.js
deleted file mode 100644 (file)
index 21a22b2..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Slovak (Slovenƒçina) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 2 || count == 3 || count == 4 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
index cfb5781..acd00bf 100644 (file)
@@ -2,23 +2,6 @@
  * Slovenian (Slovenščina) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 5 );
-       if ( count % 100 == 1 ) {
-               return forms[0];
-       }
-       if ( count % 100 == 2 ) {
-               return forms[1];
-       }
-       if ( count % 100 == 3 || count % 100 == 4 ) {
-               return forms[2];
-       }
-       if ( count != 0 ) {
-               return forms[3];
-       }
-       return forms[4];
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'sl', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
diff --git a/resources/mediawiki.language/languages/sma.js b/resources/mediawiki.language/languages/sma.js
deleted file mode 100644 (file)
index 8163c42..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Southern Sami (Åarjelsaemien) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( !forms || forms.length === 0 ) {
-                       return '';
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count == 1 ) {
-               return forms[0];
-       }
-       if ( count == 2 ) {
-               return forms[1];
-       }
-       return forms[2];
-};
diff --git a/resources/mediawiki.language/languages/sr-ec.js b/resources/mediawiki.language/languages/sr-ec.js
deleted file mode 100644 (file)
index af48eb0..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Serbian (cyrillic script) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/sr-el.js b/resources/mediawiki.language/languages/sr-el.js
deleted file mode 100644 (file)
index fd6ca01..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Serbian (latin script) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/sr.js b/resources/mediawiki.language/languages/sr.js
deleted file mode 100644 (file)
index 25cdc8a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Serbian (Српски / Srpski) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( forms.length === 2 ) {
-               return ( count == 1 ) ? forms[0] : forms[1];
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
diff --git a/resources/mediawiki.language/languages/ti.js b/resources/mediawiki.language/languages/ti.js
deleted file mode 100644 (file)
index 69b6d9b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Tigrinya (ትግርኛ) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural(forms, 2);
-       return (count <= 1) ? forms[0] : forms[1];
-};
diff --git a/resources/mediawiki.language/languages/tl.js b/resources/mediawiki.language/languages/tl.js
deleted file mode 100644 (file)
index 29219fd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Tagalog (Tagalog) language functions
- */
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
index 372d441..ee110b0 100644 (file)
@@ -2,26 +2,6 @@
  * Ukrainian (Українська) language functions
  */
 
-mediaWiki.language.convertPlural = function( count, forms ) {
-       if ( forms.length === 2 ) {
-               return count == 1 ? forms[0] : forms[1];                
-       }
-       forms = mediaWiki.language.preConvertPlural( forms, 3 );
-       if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
-               return forms[2];
-       }
-       switch ( count % 10 ) {
-               case 1:
-                       return forms[0];
-               case 2:
-               case 3:
-               case 4:
-                       return forms[1];
-               default:
-                       return forms[2];
-       }
-};
-
 mediaWiki.language.convertGrammar = function( word, form ) {
        var grammarForms = mw.language.getData( 'uk', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
@@ -29,7 +9,7 @@ mediaWiki.language.convertGrammar = function( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( (  word.substr( word.length - 4 ) == 'вікі' ) || (  word.substr( word.length - 4 ) == 'Вікі' ) ) {
+                       if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
                        }
                        else if ( word.substr( word.length - 1 ) == 'ь' )
                                word = word.substr(0, word.length - 1 ) + 'я';
@@ -37,7 +17,7 @@ mediaWiki.language.convertGrammar = function( word, form ) {
                                word = word.substr(0, word.length - 2 ) + 'ії';
                        else if ( word.substr( word.length - 2 ) == 'ка' )
                                word = word.substr(0, word.length - 2 ) + 'ки';
-                       else if ( word.substr( word.length - 2 )  == 'ти' )
+                       else if ( word.substr( word.length - 2 ) == 'ти' )
                                word = word.substr(0, word.length - 2 ) + 'тей';
                        else if ( word.substr( word.length - 2 ) == 'ды' )
                                word = word.substr(0, word.length - 2 ) + 'дов';
@@ -45,7 +25,7 @@ mediaWiki.language.convertGrammar = function( word, form ) {
                                word = word.substr(0, word.length - 3 ) + 'ника';
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( (  word.substr( word.length - 4 ) == 'вікі' ) || (  word.substr( word.length - 4 ) == 'Вікі' ) ) {
+                       if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
                        }
                        else if ( word.substr( word.length - 2 ) == 'ія' )
                                word = word.substr(0, word.length - 2 ) + 'ію';
diff --git a/resources/mediawiki.language/languages/wa.js b/resources/mediawiki.language/languages/wa.js
deleted file mode 100644 (file)
index e177375..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Walloon (Walon) language functions
- */
-
-mediaWiki.language.convertPlural = function( count, forms ) {
-       forms = mediaWiki.language.preConvertPlural( forms, 2 );
-       return ( count <= 1 ) ? forms[0] : forms[1];
-};
index 8d2ffae..30307a3 100644 (file)
@@ -33,7 +33,7 @@
                 */
                getData: function ( langCode, dataKey ) {
                        var langData = language.data;
-                       if ( langData[langCode] instanceof mw.Map ) {
+                       if ( langData && langData[langCode] instanceof mw.Map ) {
                                return langData[langCode].get( dataKey );
                        }
                        return undefined;
index bb1491d..441bc91 100644 (file)
@@ -207,6 +207,7 @@ function pluralRuleParser(rule, number) {
        }
 
        function range() {
+               var i;
                var result = sequence([digits, _range_, digits]);
                if (result !== null) {
                        debug(" -- passed range");
@@ -275,7 +276,15 @@ function pluralRuleParser(rule, number) {
 
        var condition = choice([and, or, relation]);
 
+       function isInt(n) {
+               return parseFloat(n) % 1 === 0;
+       }
+
+
        function start() {
+               if (!isInt(number)) {
+                       return false;
+               }
                var result = condition();
                return result;
        }
index df62105..a4753b9 100644 (file)
@@ -31,8 +31,8 @@ $.fn.goOut = function ( instantToggle ) {
 
 /**
  * Bind a function to the jQuery object via live(), and also immediately trigger
- * the function on the objects with an 'instant' paramter set to true
- * @param callback function taking one paramter, which is Bool true when the event
+ * the function on the objects with an 'instant' parameter set to true
+ * @param callback function taking one parameter, which is Bool true when the event
  *     is called immediately, and the EventArgs object when triggered from an event
  */
 $.fn.liveAndTestAtStart = function ( callback ){
index def1225..86af31f 100644 (file)
                 * @return {String} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
-                       var count = parseInt( this.language.convertNumber( nodes[0], true ), 10 );
+                       var count = parseFloat( this.language.convertNumber( nodes[0], true ) );
                        var forms = nodes.slice(1);
                        return forms.length ? this.language.convertPlural( count, forms ) : '';
                },
index 913c19b..1823d88 100644 (file)
@@ -80,7 +80,7 @@ class CologneBlueTemplate extends LegacyTemplate {
                $mainPageObj = Title::newMainPage();
 
                $s = "\n<div id='content'>\n<div id='topbar'>" .
-                 '<table width="100%" border="0" cellspacing="0" cellpadding="8"><tr>';
+                 '<table width="100%" cellspacing="0" cellpadding="8"><tr>';
 
                $s .= '<td class="top" nowrap="nowrap">';
                $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
@@ -122,7 +122,7 @@ class CologneBlueTemplate extends LegacyTemplate {
                $s = "\n</div><br clear='all' />\n";
 
                $s .= "\n<div id='footer'>";
-               $s .= '<table width="98%" border="0" cellspacing="0"><tr>';
+               $s .= '<table width="98%" cellspacing="0"><tr>';
 
                $s .= '<td class="bottom">';
 
index 5461309..de11639 100644 (file)
@@ -62,7 +62,7 @@ class StandardTemplate extends LegacyTemplate {
 
                $s = "\n</div><br style=\"clear:both\" />\n";
                $s .= "\n<div id='footer'>";
-               $s .= '<table border="0" cellspacing="0"><tr>';
+               $s .= '<table cellspacing="0"><tr>';
 
                wfProfileOut( __METHOD__ . '-1' );
                wfProfileIn( __METHOD__ . '-2' );
index cf602ea..48dd943 100644 (file)
@@ -319,7 +319,7 @@ td.diff-context {
  */
 table.wikitable,
 table.mw_metadata {
-       margin: 1em 1em 1em 0;
+       margin: 1em 0;
        border: 1px #aaa solid;
        background: white;
        border-collapse: collapse;
index 23f7302..b1e28ab 100644 (file)
@@ -1,6 +1,17 @@
-(function( $ ) {
-       $( document ).ready( function() {
+( function ( $ ) {
+       $( document ).ready( function () {
+               var $label, labelText;
 
+               function syncText() {
+                       var value = $(this).val()
+                               .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
+                               .replace( /&/, '&amp;' )
+                               .replace( /__+/g, '_' )
+                               .replace( /^_+/, '' )
+                               .replace( /_+$/, '' );
+                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+                       $label.text( labelText.replace( '$1', value ) );
+               }
 
                // Set up the help system
                $( '.mw-help-field-data' )
@@ -8,7 +19,7 @@
                        .closest( '.mw-help-field-container' )
                                .find( '.mw-help-field-hint' )
                                        .show()
-                                       .click( function() {
+                                       .click( function () {
                                                $(this)
                                                        .closest( '.mw-help-field-container' )
                                                                .find( '.mw-help-field-data' )
                
                // Show/hide code for DB-specific options
                // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
-               $( '.dbRadio' ).each( function() { $( '#' + $(this).attr( 'rel' ) ).hide(); } );
-               $( '#' + $( '.dbRadio:checked' ).attr( 'rel' ) ).show();
-               $( '.dbRadio' ).click( function() {
-                       var $checked = $( '.dbRadio:checked' );
-                       var $wrapper = $( '#' + $checked.attr( 'rel' ) );
-                       if ( !$wrapper.is( ':visible' ) ) {
+               $( '.dbRadio' ).each( function () {
+                       $( document.getElementById( $(this).attr( 'rel' ) ) ).hide();
+               } );
+               $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show();
+               $( '.dbRadio' ).click( function () {
+                       var $checked = $( '.dbRadio:checked' ),
+                               $wrapper = $( document.getElementById( $checked.attr( 'rel' ) ) );
+                       if ( $wrapper.is( ':hidden' ) ) {
                                $( '.dbWrapper' ).hide( 'slow' );
                                $wrapper.show( 'slow' );
                        }
                } );
                
                // Scroll to the bottom of upgrade log
-               $( '#config-live-log' ).find( '> textarea' ).each( function() { this.scrollTop = this.scrollHeight; } );
+               $( '#config-live-log' ).children( 'textarea' ).each( function () {
+                       this.scrollTop = this.scrollHeight;
+               } );
                
                // Show/hide Creative Commons thingy
-               $( '.licenseRadio' ).click( function() {
+               $( '.licenseRadio' ).click( function () {
                        var $wrapper = $( '#config-cc-wrapper' );
                        if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
@@ -42,7 +57,7 @@
                } );
                
                // Show/hide random stuff (email, upload)
-               $( '.showHideRadio' ).click( function() {
+               $( '.showHideRadio' ).click( function () {
                        var $wrapper = $( '#' + $(this).attr( 'rel' ) );
                        if ( $(this).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
@@ -50,7 +65,7 @@
                                $wrapper.hide( 'slow' );
                        }
                } );
-               $( '.hideShowRadio' ).click( function() {
+               $( '.hideShowRadio' ).click( function () {
                        var $wrapper = $( '#' + $(this).attr( 'rel' ) );
                        if ( $(this).is( ':checked' ) ) {
                                $wrapper.hide( 'slow' );
                $( '.enabledByOther' ).closest( '.config-block' ).hide();
 
                // Enable/disable "other" textboxes
-               $( '.enableForOther' ).click( function() {
-                       var $textbox = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).val() == 'other' ) { // FIXME: Ugh, this is ugly
+               $( '.enableForOther' ).click( function () {
+                       var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) );
+                       // FIXME: Ugh, this is ugly
+                       if ( $(this).val() === 'other' ) {
                                $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
                        } else {
                                $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
                $label = $( 'label[for=config__NamespaceType_site-name]' );
                labelText = $label.text();
                $label.text( labelText.replace( '$1', '' ) );
-               $( '#config_wgSitename' ).bind( 'keyup change', syncText ).each( syncText );
-               function syncText() {
-                       var value = $(this).val()
-                               .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
-                               .replace( /&/, '&amp;' )
-                               .replace( /__+/g, '_' )
-                               .replace( /^_+/, '' )
-                               .replace( /_+$/, '' );
-                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
-                       $label.text( labelText.replace( '$1', value ) );
-               }
+               $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
 
                // Show/Hide memcached servers when needed
-               $("input[name$='config_wgMainCacheType']").change( function() {
+               $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
                        var $memc = $( "#config-memcachewrapper" );
-                       if( $( "input[name$='config_wgMainCacheType']:checked" ).val() == 'memcached' ) {
+                       if( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
                        }
                } );
        } );
-})(jQuery);
+}( jQuery ) );
index 4cc0ad3..8f771e9 100644 (file)
@@ -250,7 +250,7 @@ tr.mw-htmlform-vertical-label td.mw-label {
 
 input#wpSummary {
        width: 80%;
-       margin: 1em 0;
+       margin-bottom: 1em;
 }
 
 /**
@@ -473,7 +473,7 @@ a.feedlink {
  * keep in sync with commonPrint.css
  */
 table.wikitable {
-       margin: 1em 1em 1em 0;
+       margin: 1em 0;
        background-color: #f9f9f9;
        border: 1px #aaa solid;
        border-collapse: collapse;
index 563bd74..cae08af 100644 (file)
@@ -515,7 +515,7 @@ window.redirectToFragment = function( fragment ) {
  * Add a cute little box at the top of the screen to inform the user of
  * something, replacing any preexisting message.
  *
- * @deprecated since 1.17 Use mw.util.notify instead.
+ * @deprecated since 1.17 Use the 'mediawiki.notify' module instead.
  * @param {String|HTMLElement} message To be put inside the message box.
  */
 window.jsMsg = function () {
index cb5ca36..42f5f68 100644 (file)
@@ -17,7 +17,7 @@ $wgAutoloadClasses += array(
        //API
        'ApiFormatTestBase' => "$testFolder/phpunit/includes/api/format/ApiFormatTestBase.php",
        'ApiTestCase' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
-       'ApiTestUser' => "$testFolder/phpunit/includes/api/ApiTestUser.php",
+       'TestUser' => "$testFolder/phpunit/includes/TestUser.php",
        'MockApi' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
        'RandomImageGenerator' => "$testFolder/phpunit/includes/api/RandomImageGenerator.php",
        'UserWrapper' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
index 4301587..840da96 100644 (file)
@@ -8,13 +8,13 @@
  * which can be used with the JasmineBDD framework. This specification can then be used by simply including it into
  * the SpecRunner.html file.
  *
- * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the 
+ * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the
  * API results while doing the test, so the Jasmine run is much faster(at the cost of being out of date in rare
  * circumstances. But mostly the parsing that we are doing in Javascript doesn't change much.)
  *
- */ 
+ */
 
-$maintenanceDir = dirname( dirname( dirname( dirname( __DIR__ ) ) ) ) . '/maintenance';
+$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
 
 require( "$maintenanceDir/Maintenance.php" );
 
@@ -51,27 +51,22 @@ class MakeLanguageSpec extends Maintenance {
        private function getMessagesAndTests() {
                $messages = array();
                $tests = array();
-               $wfMsgExtOptions = array( 'parsemag' );
                foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
-                       $wfMsgExtOptions['language'] = $languageCode;
                        foreach ( self::$keyToTestArgs as $key => $testArgs ) {
                                foreach ($testArgs as $args) {
                                        // get the raw template, without any transformations
                                        $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
 
-                                       // get the magic-parsed version with args
-                                       $wfMsgExtArgs = array_merge( array( $key, $wfMsgExtOptions ), $args );
-                                       // @todo FIXME: Use Message class.
-                                       $result = call_user_func_array( 'wfMsgExt', $wfMsgExtArgs ); 
+                                       $result = wfMessage( $key, $args )->inLanguage( $languageCode )->text();
 
                                        // record the template, args, language, and expected result
-                                       // fake multiple languages by flattening them together  
+                                       // fake multiple languages by flattening them together
                                        $langKey = $languageCode . '_' . $key;
                                        $messages[ $langKey ] = $template;
-                                       $tests[] = array( 
+                                       $tests[] = array(
                                                'name' => $languageCode . " " . $key . " " . join( ",", $args ),
                                                'key' => $langKey,
-                                               'args' => $args, 
+                                               'args' => $args,
                                                'result' => $result,
                                                'lang' => $languageCode
                                        );
index c418116..aa084cc 100644 (file)
@@ -7035,7 +7035,7 @@ Special page transclusion
 !! input
 {{Special:Prefixindex/Xyzzyx}}
 !! result
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
 
@@ -7046,8 +7046,8 @@ Special page transclusion twice (bug 5021)
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
 !! result
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
 
index 9c06f51..d3dd389 100644 (file)
@@ -5,6 +5,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        public $regex = '';
        public $runDisabled = false;
 
+       /**
+        * @var Array of TestUser
+        */
+       public static $users;
+
        /**
         * @var DatabaseBase
         */
@@ -527,4 +532,46 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * Asserts that the provided variable is of the specified
+        * internal type or equals the $value argument. This is useful
+        * for testing return types of functions that return a certain
+        * type or *value* when not set or on error.
+        *
+        * @since 1.20
+        *
+        * @param string $type
+        * @param mixed $actual
+        * @param mixed $value
+        * @param string $message
+        */
+       protected function assertTypeOrValue( $type, $actual, $value = false, $message = '' ) {
+               if ( $actual === $value ) {
+                       $this->assertTrue( true, $message );
+               }
+               else {
+                       $this->assertType( $type, $actual, $message );
+               }
+       }
+
+       /**
+        * Asserts the type of the provided value. This can be either
+        * in internal type such as boolean or integer, or a class or
+        * interface the value extends or implements.
+        *
+        * @since 1.20
+        *
+        * @param string $type
+        * @param mixed $actual
+        * @param string $message
+        */
+       protected function assertType( $type, $actual, $message = '' ) {
+               if ( is_object( $actual ) ) {
+                       $this->assertInstanceOf( $type, $actual, $message );
+               }
+               else {
+                       $this->assertInternalType( $type, $actual, $message );
+               }
+       }
+
 }
index 0dd85c1..a18f792 100644 (file)
@@ -365,4 +365,204 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @dataProvider providesHtml5InputTypes
+        */
+       function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
+               $this->enableHTML5();
+               $this->assertEquals(
+                       '<input type="' . $HTML5InputType . '" />',
+                       HTML::element( 'input', array( 'type' => $HTML5InputType ) ),
+                       'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"'
+               );
+       }
+
+       /**
+        * List of input element types values introduced by HTML5
+        * Full list at http://www.w3.org/TR/html-markup/input.html
+        */
+       function providesHtml5InputTypes() {
+               $types = array(
+                       'datetime',
+                       'datetime-local',
+                       'date',
+                       'month',
+                       'time',
+                       'week',
+                       'number',
+                       'range',
+                       'email',
+                       'url',
+                       'search',
+                       'tel',
+                       'color',
+               );
+               $cases = array();
+               foreach( $types as $type ) {
+                       $cases[] = array( $type );
+               }
+               return $cases;
+       }
+
+       /**
+        * Test out Html::element drops default value
+        * @cover Html::dropDefaults
+        * @dataProvider provideElementsWithAttributesHavingDefaultValues
+        */
+       function testDropDefaults( $expected, $element, $message = '' ) {
+               $this->enableHTML5();
+               $this->assertEquals( $expected, $element, $message );
+       }
+
+       function provideElementsWithAttributesHavingDefaultValues() {
+               # Use cases in a concise format:
+               # <expected>, <element name>, <array of attributes> [, <message>]
+               # Will be mapped to Html::element()
+               $cases = array();
+
+               ### Generic cases, match $attribDefault static array
+               $cases[] = array( '<area />',
+                       'area', array( 'shape' => 'rect' )
+               );
+
+               $cases[] = array( '<button></button>',
+                       'button', array( 'formaction' => 'GET' )
+               );
+               $cases[] = array( '<button></button>',
+                       'button', array( 'formenctype' => 'application/x-www-form-urlencoded' )
+               );
+               $cases[] = array( '<button></button>',
+                       'button', array( 'type' => 'submit' )
+               );
+
+               $cases[] = array( '<canvas></canvas>',
+                       'canvas', array( 'height' => '150' )
+               );
+               $cases[] = array( '<canvas></canvas>',
+                       'canvas', array( 'width' => '300' )
+               );
+               # Also check with numeric values
+               $cases[] = array( '<canvas></canvas>',
+                       'canvas', array( 'height' => 150 )
+               );
+               $cases[] = array( '<canvas></canvas>',
+                       'canvas', array( 'width' => 300 )
+               );
+
+               $cases[] = array( '<command />',
+                       'command', array( 'type' => 'command' )
+               );
+
+               $cases[] = array( '<form></form>',
+                       'form', array( 'action' => 'GET' )
+               );
+               $cases[] = array( '<form></form>',
+                       'form', array( 'autocomplete' => 'on' )
+               );
+               $cases[] = array( '<form></form>',
+                       'form', array( 'enctype' => 'application/x-www-form-urlencoded' )
+               );
+
+               $cases[] = array( '<input />',
+                       'input', array( 'formaction' => 'GET' )
+               );
+               $cases[] = array( '<input />',
+                       'input', array( 'type' => 'text' )
+               );
+
+               $cases[] = array( '<keygen />',
+                       'keygen', array( 'keytype' => 'rsa' )
+               );
+
+               $cases[] = array( '<link />',
+                       'link', array( 'media' => 'all' )
+               );
+
+               $cases[] = array( '<menu></menu>',
+                       'menu', array( 'type' => 'list' )
+               );
+
+               $cases[] = array( '<script></script>',
+                       'script', array( 'type' => 'text/javascript' )
+               );
+
+               $cases[] = array( '<style></style>',
+                       'style', array( 'media' => 'all' )
+               );
+               $cases[] = array( '<style></style>',
+                       'style', array( 'type' => 'text/css' )
+               );
+
+               $cases[] = array( '<textarea></textarea>',
+                       'textarea', array( 'wrap' => 'soft' )
+               );
+
+               ### SPECIFIC CASES
+
+               # <link type="text/css" />
+               $cases[] = array( '<link />',
+                       'link', array( 'type' => 'text/css' )
+               );
+
+               # <input /> specific handling
+               $cases[] = array( '<input type="checkbox" />',
+                       'input', array( 'type' => 'checkbox', 'value' => 'on' ),
+                       'Default value "on" is stripped of checkboxes',
+               );
+               $cases[] = array( '<input type="radio" />',
+                       'input', array( 'type' => 'radio', 'value' => 'on' ),
+                       'Default value "on" is stripped of radio buttons',
+               );
+               $cases[] = array( '<input type="submit" value="Submit" />',
+                       'input', array( 'type' => 'submit', 'value' => 'Submit' ),
+                       'Default value "Submit" is kept on submit buttons (for possible l10n issues)',
+               );
+               $cases[] = array( '<input type="color" />',
+                       'input', array( 'type' => 'color', 'value' => '' ),
+               );
+               $cases[] = array( '<input type="range" />',
+                       'input', array( 'type' => 'range', 'value' => '' ),
+               );
+
+               # <select /> specifc handling
+               $cases[] = array( '<select multiple=""></select>',
+                       'select', array( 'size' => '4', 'multiple' => true ),
+               );
+               # .. with numeric value
+               $cases[] = array( '<select multiple=""></select>',
+                       'select', array( 'size' => 4, 'multiple' => true ),
+               );
+               $cases[] = array( '<select></select>',
+                       'select', array( 'size' => '1', 'multiple' => false ),
+               );
+               # .. with numeric value
+               $cases[] = array( '<select></select>',
+                       'select', array( 'size' => 1, 'multiple' => false ),
+               );
+
+               # Passing an array as value
+               $cases[] = array( '<a class="css-class-one css-class-two"></a>',
+                       'a', array( 'class' => array( 'css-class-one', 'css-class-two' ) ),
+                       "dropDefaults accepts values given as an array"
+               );
+
+               # FIXME: doDropDefault should remove defaults given in an array
+               # Expected should be '<a></a>'
+               $cases[] = array( '<a class=""></a>',
+                       'a', array( 'class' => array( '', '' ) ),
+                       "dropDefaults accepts values given as an array"
+               );
+
+
+               # Craft the Html elements
+               $ret = array();
+               foreach( $cases as $case ) {
+                       $ret[] = array(
+                               $case[0],
+                               Html::element( $case[1], $case[2] )
+                       );
+               }
+               return $ret;
+       }
+
 }
index 664f04a..0e12317 100644 (file)
@@ -1,25 +1,24 @@
 <?php
 
 class PreferencesTest extends MediaWikiTestCase {
-
        /** Array of User objects */
-       private $users ;
-       private $context ;
+       private $prefUsers;
+       private $context;
 
        function __construct() {
                parent::__construct();
                global $wgEnableEmail;
 
-               $this->users['noemail'] = new User;
+               $this->prefUsers['noemail'] = new User;
 
-               $this->users['notauth'] = new User;
-               $this->users['notauth']
+               $this->prefUsers['notauth'] = new User;
+               $this->prefUsers['notauth']
                        ->setEmail( 'noauth@example.org' );
 
-               $this->users['auth']    = new User;
-               $this->users['auth']
+               $this->prefUsers['auth']    = new User;
+               $this->prefUsers['auth']
                        ->setEmail( 'noauth@example.org' );
-               $this->users['auth']
+               $this->prefUsers['auth']
                        ->setEmailAuthenticationTimestamp( 1330946623 );
 
                $this->context = new RequestContext;
@@ -63,16 +62,14 @@ class PreferencesTest extends MediaWikiTestCase {
                $this->assertEquals( 'mw-email-authenticated', $prefs['emailaddress']['cssclass'] );
        }
 
-
        /** Helper */
        function prefsFor( $user_key ) {
                $preferences = array();
                Preferences::profilePreferences(
-                       $this->users[$user_key]
+                       $this->prefUsers[$user_key]
                        , $this->context
                        , $preferences
                );
                return $preferences;
        }
-
 }
index 02b13b9..4786e3d 100644 (file)
@@ -6,6 +6,9 @@
  * @group ContentHandler
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
+ *
+ * @group medium
+ * ^--- important, causes tests not to fail with timeout
  */
 class RevisionStorageTest extends MediaWikiTestCase {
 
@@ -405,4 +408,105 @@ class RevisionStorageTest extends MediaWikiTestCase {
                                                                'new null revision shold have the same text id as the original revision' );
                $this->assertEquals( 'some testing text', $rev->getContent()->getNativeData() );
        }
+
+       public function dataUserWasLastToEdit() {
+               return array(
+                       array( #0
+                               3, true, # actually the last edit
+                       ),
+                       array( #1
+                               2, true, # not the current edit, but still by this user
+                       ),
+                       array( #2
+                               1, false, # edit by another user
+                       ),
+                       array( #3
+                               0, false, # first edit, by this user, but another user edited in the mean time
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataUserWasLastToEdit
+        */
+       public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
+               $userA = \User::newFromName( "RevisionStorageTest_userA" );
+               $userB = \User::newFromName( "RevisionStorageTest_userB" );
+
+               if ( $userA->getId() === 0 ) {
+                       $userA = \User::createNew( $userA->getName() );
+               }
+
+               if ( $userB->getId() === 0 ) {
+                       $userB = \User::createNew( $userB->getName() );
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $revisions = array();
+
+               // create revisions -----------------------------
+               $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
+
+               # zero
+               $revisions[0] = new Revision( array(
+                       'page' => $page->getId(),
+                       'title' => $page->getTitle(), // we need the title to determine the page's default content model
+                       'timestamp' => '20120101000000',
+                       'user' => $userA->getId(),
+                       'text' => 'zero',
+                       'summary' => 'edit zero'
+               ) );
+               $revisions[0]->insertOn( $dbw );
+
+               # one
+               $revisions[1] = new Revision( array(
+                       'page' => $page->getId(),
+                       'title' => $page->getTitle(), // still need the title, because $page->getId() is 0 (there's no entry in the page table)
+                       'timestamp' => '20120101000100',
+                       'user' => $userA->getId(),
+                       'text' => 'one',
+                       'summary' => 'edit one'
+               ) );
+               $revisions[1]->insertOn( $dbw );
+
+               # two
+               $revisions[2] = new Revision( array(
+                       'page' => $page->getId(),
+                       'title' => $page->getTitle(),
+                       'timestamp' => '20120101000200',
+                       'user' => $userB->getId(),
+                       'text' => 'two',
+                       'summary' => 'edit two'
+               ) );
+               $revisions[2]->insertOn( $dbw );
+
+               # three
+               $revisions[3] = new Revision( array(
+                       'page' => $page->getId(),
+                       'title' => $page->getTitle(),
+                       'timestamp' => '20120101000300',
+                       'user' => $userA->getId(),
+                       'text' => 'three',
+                       'summary' => 'edit three'
+               ) );
+               $revisions[3]->insertOn( $dbw );
+
+               # four
+               $revisions[4] = new Revision( array(
+                       'page' => $page->getId(),
+                       'title' => $page->getTitle(),
+                       'timestamp' => '20120101000200',
+                       'user' => $userA->getId(),
+                       'text' => 'zero',
+                       'summary' => 'edit four'
+               ) );
+               $revisions[4]->insertOn( $dbw );
+
+               // test it ---------------------------------
+               $since = $revisions[ $sinceIdx ]->getTimestamp();
+
+               $wasLast = Revision::userWasLastToEdit( $dbw, $page->getId(), $userA->getId(), $since );
+
+               $this->assertEquals( $expectedLast, $wasLast );
+       }
 }
diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php
new file mode 100644 (file)
index 0000000..c4d8945
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+/* Wraps the user object, so we can also retain full access to properties like password if we log in via the API */
+class TestUser {
+       public $username;
+       public $password;
+       public $email;
+       public $groups;
+       public $user;
+
+       function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+               $this->username = $username;
+               $this->realname = $realname;
+               $this->email = $email;
+               $this->groups = $groups;
+
+               // don't allow user to hardcode or select passwords -- people sometimes run tests
+               // on live wikis. Sometimes we create sysop users in these tests. A sysop user with
+               // a known password would be a Bad Thing.
+               $this->password = User::randomPassword();
+
+               $this->user = User::newFromName( $this->username );
+               $this->user->load();
+
+               // In an ideal world we'd have a new wiki (or mock data store) for every single test.
+               // But for now, we just need to create or update the user with the desired properties.
+               // we particularly need the new password, since we just generated it randomly.
+               // In core MediaWiki, there is no functionality to delete users, so this is the best we can do.
+               if ( !$this->user->getID() ) {
+                       // create the user
+                       $this->user = User::createNew(
+                               $this->username, array(
+                                       "email" => $this->email,
+                                       "real_name" => $this->realname
+                               )
+                       );
+                       if ( !$this->user ) {
+                               throw new Exception( "error creating user" );
+                       }
+               }
+
+               // update the user to use the new random password and other details
+               $this->user->setPassword( $this->password );
+               $this->user->setEmail( $this->email );
+               $this->user->setRealName( $this->realname );
+               // remove all groups, replace with any groups specified
+               foreach ( $this->user->getGroups() as $group ) {
+                       $this->user->removeGroup( $group );
+               }
+               if ( count( $this->groups ) ) {
+                       foreach ( $this->groups as $group ) {
+                               $this->user->addGroup( $group );
+                       }
+               }
+               $this->user->saveSettings();
+
+       }
+}
index d6c48cb..b84292e 100644 (file)
@@ -1,10 +1,6 @@
 <?php 
 
 abstract class ApiTestCase extends MediaWikiLangTestCase {
-       /**
-        * @var Array of ApiTestUser
-        */
-       public static $users;
        protected static $apiUrl;
 
        /**
@@ -23,13 +19,13 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                $wgRequest = new FauxRequest( array() );
 
                self::$users = array(
-                       'sysop' => new ApiTestUser(
+                       'sysop' => new TestUser(
                                'Apitestsysop',
                                'Api Test Sysop',
                                'api_test_sysop@example.com',
                                array( 'sysop' )
                        ),
-                       'uploader' => new ApiTestUser(
+                       'uploader' => new TestUser(
                                'Apitestuser',
                                'Api Test User',
                                'api_test_user@example.com',
diff --git a/tests/phpunit/includes/api/ApiTestUser.php b/tests/phpunit/includes/api/ApiTestUser.php
deleted file mode 100644 (file)
index 8d5f61a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/* Wraps the user object, so we can also retain full access to properties like password if we log in via the API */
-class ApiTestUser {
-       public $username;
-       public $password;
-       public $email;
-       public $groups;
-       public $user;
-
-       function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
-               $this->username = $username;
-               $this->realname = $realname;
-               $this->email = $email;
-               $this->groups = $groups;
-
-               // don't allow user to hardcode or select passwords -- people sometimes run tests
-               // on live wikis. Sometimes we create sysop users in these tests. A sysop user with
-               // a known password would be a Bad Thing.
-               $this->password = User::randomPassword();
-
-               $this->user = User::newFromName( $this->username );
-               $this->user->load();
-
-               // In an ideal world we'd have a new wiki (or mock data store) for every single test.
-               // But for now, we just need to create or update the user with the desired properties.
-               // we particularly need the new password, since we just generated it randomly.
-               // In core MediaWiki, there is no functionality to delete users, so this is the best we can do.
-               if ( !$this->user->getID() ) {
-                       // create the user
-                       $this->user = User::createNew(
-                               $this->username, array(
-                                       "email" => $this->email,
-                                       "real_name" => $this->realname
-                               )
-                       );
-                       if ( !$this->user ) {
-                               throw new Exception( "error creating user" );
-                       }
-               }
-
-               // update the user to use the new random password and other details
-               $this->user->setPassword( $this->password );
-               $this->user->setEmail( $this->email );
-               $this->user->setRealName( $this->realname );
-               // remove all groups, replace with any groups specified
-               foreach ( $this->user->getGroups() as $group ) {
-                       $this->user->removeGroup( $group );
-               }
-               if ( count( $this->groups ) ) {
-                       foreach ( $this->groups as $group ) {
-                               $this->user->addGroup( $group );
-                       }
-               }
-               $this->user->saveSettings();
-
-       }
-
-}
index b604d59..88f87ef 100644 (file)
@@ -76,7 +76,6 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
        /**
         * File has an invalid time (+ one valid but really weird time)
         * that shouldn't be included
-        * @expectedException TimestampException
         */
        public function testIPTCDatesInvalid() {
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
index dc1c2ac..66fafaa 100644 (file)
@@ -16,13 +16,13 @@ class UploadStashTest extends MediaWikiTestCase {
                file_put_contents( $this->bug29408File, "\x00" );
 
                self::$users = array(
-                       'sysop' => new ApiTestUser(
+                       'sysop' => new TestUser(
                                'Uploadstashtestsysop',
                                'Upload Stash Test Sysop',
                                'upload_stash_test_sysop@example.com',
                                array( 'sysop' )
                        ),
-                       'uploader' => new ApiTestUser(
+                       'uploader' => new TestUser(
                                'Uploadstashtestuser',
                                'Upload Stash Test User',
                                'upload_stash_test_user@example.com',
diff --git a/tests/phpunit/languages/LanguageHuTest.php b/tests/phpunit/languages/LanguageHuTest.php
new file mode 100644 (file)
index 0000000..adbd37e
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageHu.php */
+class LanguageHuTest extends MediaWikiTestCase {
+       private $lang;
+
+       function setUp() {
+               $this->lang = Language::factory( 'Hu' );
+       }
+       function tearDown() {
+               unset( $this->lang );
+       }
+
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+       }
+
+       function providePlural() {
+               return array (
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'other', 2 ),
+                       array( 'other', 200 ),
+               );
+       }
+
+}
index 09a11b0..e2c6668 100644 (file)
@@ -1,21 +1,25 @@
-module( 'mediawiki.cldr' );
-
-test( '-- Initial check', function() {
-       expect( 1 );
-       ok( mw.cldr, 'mw.cldr defined' );
-} );
+QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
 
 var pluralTestcases = {
        /*
         * Sample:
-        *"languagecode" : [
-        *      [ number, [ "form1", "form2", ... ],  "expected", "description" ],
-        * ]
+        * "languagecode" : [
+        *   [ number, [ "form1", "form2", ... ],  "expected", "description" ]
+        * ];
         */
        "en": [
                [ 0, [ "one", "other" ], "other", "English plural test- 0 is other" ],
                [ 1, [ "one", "other" ], "one", "English plural test- 1 is one" ]
        ],
+       "fa": [
+               [ 0, [ "one", "other" ], "other", "Persian plural test- 0 is other" ],
+               [ 1, [ "one", "other" ], "one", "Persian plural test- 1 is one" ],
+               [ 2, [ "one", "other" ], "other", "Persian plural test- 2 is other" ]
+       ],
+       "fr": [
+               [ 0, [ "one", "other" ], "other", "French plural test- 0 is other" ],
+               [ 1, [ "one", "other" ], "one", "French plural test- 1 is one" ]
+       ],
        "hi": [
                [ 0, [ "one", "other" ], "one", "Hindi plural test- 0 is one" ],
                [ 1, [ "one", "other" ], "one", "Hindi plural test- 1 is one" ],
@@ -27,6 +31,11 @@ var pluralTestcases = {
                [ 2, [ "one", "other" ], "other", "Hebrew plural test- 2 is other with 2 forms" ],
                [ 2, [ "one", "dual", "other" ], "dual", "Hebrew plural test- 2 is dual with 3 forms" ]
        ],
+       "hu": [
+               [ 0, [ "one", "other" ], "other", "Hungarian plural test- 0 is other" ],
+               [ 1, [ "one", "other" ], "one", "Hungarian plural test- 1 is one" ],
+               [ 2, [ "one", "other" ], "other", "Hungarian plural test- 2 is other" ]
+       ],
        "ar": [
                [ 0, [ "zero", "one", "two", "few", "many", "other" ], "zero", "Arabic plural test - 0 is zero" ],
                [ 1, [ "zero", "one", "two", "few", "many", "other" ], "one", "Arabic plural test - 1 is one" ],
@@ -41,26 +50,24 @@ var pluralTestcases = {
                [ 9999, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 9999 is many" ],
                [ 100, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 100 is other" ],
                [ 102, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 102 is other" ],
-               [ 1000, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1000 is other" ]
-               // FIXME plural rules for decimal numbers does not work
-               // [ 1.7, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1.7 is other" ],
+               [ 1000, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1000 is other" ],
+               [ 1.7, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1.7 is other" ]
        ]
 };
 
 function pluralTest( langCode, tests ) {
-       QUnit.test('-- Plural Test for ' + langCode, function( assert ) {
-               QUnit.expect( tests.length );
+       QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
                for ( var i = 0; i < tests.length; i++ ) {
                        assert.equal(
                                mw.language.convertPlural( tests[i][0], tests[i][1] ),
-                               tests[i][2], // Expected plural form
-                               tests[i][3] // Description
+                               tests[i][2],
+                               tests[i][3]
                        );
                }
        } );
 }
 
-$.each( pluralTestcases, function( langCode, tests ) {
+$.each( pluralTestcases, function ( langCode, tests ) {
        if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
                pluralTest( langCode, tests );
        }
index 5d67a6e..3fa2b09 100644 (file)
@@ -1,12 +1,11 @@
-var liveLangData = mw.language.data.values;
 QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
        setup: function () {
-               // New independent copy for this test
-               mw.language.data = $.extend( {}, liveLangData, true );
+               this.liveLangData = mw.language.data.values;
+               mw.language.data.values = $.extend( true, {}, this.liveLangData );
        },
        teardown: function () {
-               // Restore original
-               mw.language.data = liveLangData;
+               // Restore
+               mw.language.data.values = this.liveLangData;
        }
 }) );
 
index baca706..bdb24f9 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -95,6 +95,7 @@ function wfThumbHandle404() {
  * @return void
  */
 function wfStreamThumb( array $params ) {
+       global $wgVaryOnXFP;
        wfProfileIn( __METHOD__ );
 
        $headers = array(); // HTTP headers to send
@@ -158,6 +159,7 @@ function wfStreamThumb( array $params ) {
        }
 
        // Check permissions if there are read restrictions
+       $varyHeader = array();
        if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
                if ( !$img->getTitle() || !$img->getTitle()->userCan( 'read' ) ) {
                        wfThumbError( 403, 'Access denied. You do not have permission to access ' .
@@ -166,7 +168,7 @@ function wfStreamThumb( array $params ) {
                        return;
                }
                $headers[] = 'Cache-Control: private';
-               $headers[] = 'Vary: Cookie';
+               $varyHeader[] = 'Cookie';
        }
 
        // Check the source file storage path
@@ -216,19 +218,36 @@ function wfStreamThumb( array $params ) {
 
        // Stream the file if it exists already...
        try {
+               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
                // For 404 handled thumbnails, we only use the the base name of the URI
                // for the thumb params and the parent directory for the source file name.
                // Check that the zone relative path matches up so squid caches won't pick
                // up thumbs that would not be purged on source file deletion (bug 34231).
-               if ( isset( $params['rel404'] ) // thumbnail was handled via 404
-                       && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) )
-               {
-                       wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
-                       wfProfileOut( __METHOD__ );
-                       return;
+               if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+                       if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+                               // Request for the canonical thumbnail name
+                       } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+                               // Request for the "long" thumbnail name; redirect to canonical name
+                               $response = RequestContext::getMain()->getRequest()->response();
+                               $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+                               $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+                               $response->header( 'Expires: ' .
+                                       gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
+                               if ( $wgVaryOnXFP ) {
+                                       $varyHeader[] = 'X-Forwarded-Proto';
+                               }
+                               $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
+                               wfProfileOut( __METHOD__ );
+                               return;
+                       } else {
+                               wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+                               wfProfileOut( __METHOD__ );
+                               return;
+                       }
                }
                $thumbPath = $img->getThumbPath( $thumbName );
                if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+                       $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
                        $img->getRepo()->streamFile( $thumbPath, $headers );
                        wfProfileOut( __METHOD__ );
                        return;
@@ -238,6 +257,7 @@ function wfStreamThumb( array $params ) {
                wfProfileOut( __METHOD__ );
                return;
        }
+       $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
 
        // Thumbnail isn't already there, so create the new thumbnail...
        try {